ForgeTotal.js 5
pl

Total.js 5 (backend)

Trasy, akcje, schematy, bazy danych, WebSocket, widoki i wszystko, co działa na serwerze.

PrzepisTagi

Walidacja body JSON przez akcję

Zdefiniuj schemat wejścia w akcji i pozwól Total.js odrzucać nieprawidłowe żądania, zanim wykona się Twój kod.

routingactionsvalidation

Udostępnianie akcji przez jeden endpoint API

Zadeklaruj endpointy ROUTE('API ...'), aby klient mógł wywoływać wiele akcji przez POST {schema, data} na jednym URL.

routingapiactions

Czytanie parametrów URL w trasie

Deklaruj dynamiczne segmenty, takie jak {id}, w trasie i czytaj je z $.params.

routingparams

Przechwytywanie wielu URL trasą z wildcardem

Zakończ trasę znakiem *, aby pasować do wszystkiego pod ścieżką, i zachowaj wyspecyfikowane trasy dla wyjątków.

routing

Obsługa każdej metody HTTP

Deklaruj trasy dla GET, POST, PUT, PATCH i DELETE i czytaj metodę z $.method.

routinghttp

Ograniczanie trasy flagami

Dodaj @flagi, takie jak @json, @xml lub @upload, aby trasa pasowała tylko do żądań, dla których jest przeznaczona.

routingflags

Czytanie query string i body żądania

Użyj $.query dla parametrów URL i $.body dla danych JSON lub formularza w handlerze trasy.

routingrequest

Ograniczanie rozmiaru payloadu i timeoutu trasy

Dopisz <1kb lub <10s do trasy, aby ograniczyć rozmiar żądania lub czas, jaki może zająć handler.

routingsecuritylimits

Deklarowanie typowanych parametrów trasy w akcji

Użyj opcji params w NEWACTION, aby Total.js walidował parametry URL, zanim wykona się Twój kod.

actionsroutingvalidation

Wybór sposobu odpowiedzi

Wysyłaj JSON, HTML, zwykły tekst, XML, przekierowania, puste odpowiedzi lub dane binarne z handlera trasy.

routingresponse

Czytanie nagłówków i praca z ciasteczkami

Czytaj nagłówki żądania z $.headers, czytaj i zapisuj ciasteczka przez $.cookie() oraz ustawiaj nagłówki odpowiedzi.

routingheaderscookies

Odbieranie wgrywanych plików

Przyjmuj multipart/form-data z flagą @upload i czytaj wgrane pliki z $.files.

routinguploadfiles

Zezwalanie na żądania między originami przez CORS

Wywołaj CORS(), aby pozwolić jednemu originowi, kilku lub wszystkim korzystać z Twoich tras z przeglądarki.

securitycorsrouting

Renderowanie widoku bez pisania handlera

Trasa bez handlera renderuje widok nazwany jak jej URL lub widok, który wskażesz.

routingviews

Wybierz właściwy typ wejścia dla akcji

Wybierz typy dla definicji wejścia, parametrów, zapytania i wyjścia, w tym konwersje i odrzucone wartości.

actionsvalidationtypes

Walidacja query string w akcji

Zadeklaruj query w NEWACTION, aby walidować i konwertować parametry URL, i czytaj oczyszczone wartości z $.query.

actionsvalidationquery

Filtrowanie odpowiedzi akcji przez output

Zadeklaruj output, aby z akcji wychodziły tylko wymienione pola, na przykład by nigdy nie ujawnić hasha hasła.

actionssecurity

Wymaganie użytkownika lub uprawnienia w akcji

Użyj opcji user i permissions w NEWACTION, aby autoryzacja była przy akcji, a nie w każdej trasie.

actionsauthsecurity

Ochrona tras przez AUTH

Uwierzytelniaj każde żądanie przez AUTH() i ograniczaj trasy do zalogowanych lub anonimowych użytkowników prefiksami + i -.

authroutingsecurity

Deklarowanie trasy wewnątrz akcji

Umieść trasę w opcji route w NEWACTION i trzymaj URL, walidację i kod w jednym miejscu.

actionsrouting

Logowanie użytkowników wbudowanym uwierzytelnianiem sesyjnym

Przekaż obiekt opcji do AUTH(), aby dostać podpisane ciasteczka sesji, magazyn sesji i wylogowanie bez pisania infrastruktury.

authsessionssecurity

Wywoływanie akcji z własnego kodu

Użyj ACTION(), aby uruchomić akcję z timera, zadania lub innej akcji, z własnym payloadem, query i użytkownikiem.

actions

Łączenie wielu akcji w jednej trasie

Wymień kilka akcji po --> aby wykonać je kolejno na tym samym payloadzie i oznacz, która odpowiada przez (response).

actionsrouting

Dodawanie middleware do trasy

Zarejestruj middleware przez MIDDLEWARE() i podłącz go do tras flagą #name.

middlewareroutingsecurity

Budowa czatu WebSocket

Zadeklaruj trasę SOCKET, nasłuchuj wiadomości i rozsyłaj je do wszystkich połączonych klientów.

websocketrealtime

Łączenie z serwerem WebSocket z poziomu Node

Użyj WEBSOCKETCLIENT, aby otworzyć połączenie WebSocket z Twojej aplikacji, wysyłać wiadomości i reagować na odpowiedzi.

websocketrealtimeintegrations

Rozdzielanie kodu za pomocą zdarzeń

Emituj i nasłuchuj zdarzeń aplikacji przez EMIT(), ON(), ONCE() i OFF(), aby moduły nie wywoływały się bezpośrednio.

eventsarchitecture

Przechowywanie i odczyt danych we wbudowanej bazie NoSQL

Wstawiaj i zapytuj dokumenty przez NOSQL() i udostępniaj je przez akcje, bez instalowania żadnej bazy danych.

nosqldatabaseactions

Zapytania do bazy NoSQL

Filtruj, sortuj, stronicuj i rzutuj dokumenty przez where, in, between, search, sort, take, skip i fields.

nosqldatabasequeries

Aktualizacja i usuwanie dokumentów NoSQL

Zmieniaj dokumenty przez update() i where(), usuwaj je przez remove() i czytaj, ile zostało dotkniętych.

nosqldatabase

Przełączanie baz danych przez API DATA

DATA adresuje tabelę jako baza/tabela, więc ten sam kod zapytań działa z wbudowanym NoSQL i z innymi bazami.

databasenosqlquerybuilder

Buforowanie wartości w pamięci

Zapisuj wartości przez CACHE.set() z czasem wygaśnięcia, czytaj je przez CACHE.get() i usuwaj przez remove() lub reset().

cacheperformance

Trwałe zapisywanie małych ustawień przez MEMORIZE

Trzymaj na dysku obiekt JSON, który przetrwa restart, dla liczników i ustawień niewymagających bazy danych.

storagesettings

Generowanie unikalnych id i hashy

Twórz id przez UID() i GUID() oraz hashe przez HASH() i wiedz, którego użyć gdzie.

utilitiesidssecurity

Buforowanie wolnych wyników na dysku przez FILECACHE

Użyj FILECACHE(), aby obliczyć wynik raz i używać go z pliku przez pewien czas, nawet po restarcie.

cacheperformancefiles

Przechowywanie wgranych plików przez FILESTORAGE

Zapisuj wgrane pliki w zarządzanym magazynie plików przez file.fs() i odsyłaj je przez $.filefs().

filesuploadstorage

Renderowanie widoku z layoutem

Renderuj widok HTML z modelem, iteruj po danych i przekazuj wartości do layoutu.

viewslayouttemplates

Warunki i escapowanie w widokach

Rozgałęziaj przez @{if}, @{else} i @{fi} oraz wybieraj między wyjściem z escapowaniem @{value} a surowym HTML @{!value}.

viewstemplates

Iterowanie po tablicach i obiektach w widokach

Powtarzaj znaczniki przez @{foreach} dla tablic i obiektów i używaj indeksu bieżącego elementu.

viewstemplates

Dołączanie widoków i zasobów

Używaj ponownie znaczników przez @{view()} i dodawaj skrypty i style przez @{import()}.

viewstemplatesassets

Wypełnianie sekcji layoutu z widoku

Zadeklaruj sekcję w widoku przez @{section} i wypisz ją w layoutcie przez @{section('name')}, a dla żądania wybierz inny layout.

viewslayouttemplates

Dodawanie helperów widoków i czytanie konfiguracji w widokach

Rejestruj funkcje w DEF.helpers, aby wywoływać je z widoków, i czytaj wartości konfiguracji przez @{'%key'}.

viewstemplatesconfig

Konwersja Markdown na HTML

Użyj prototypu String.markdown(), aby renderować tekst Markdown do HTML, dla treści zapisywanych przez użytkowników lub w plikach.

contentmarkdown

Generowanie tekstu szablonami Tangular

Użyj Tangular.render(), aby wypełniać szablony e-maili, dokumentów i wiadomości z warunkami, pętlami i helperami.

templatescontent

Renderuj szablony z tekstu, plików i adresów URL przez TEMPLATE

Użyj TEMPLATE(), aby wyrenderować szablon Tangular, który jest tekstem, plikiem z folderu szablonów lub adresem URL, z własnymi helperami i domyślnym modelem.

templatescontenttangular

Porównaj dwie listy za pomocą DIFFARR: co dodać, zaktualizować i usunąć

Użyj DIFFARR(), aby porównać elementy zapisane w bazie danych z elementami formularza i uzyskać te, które trzeba dodać, zaktualizować i usunąć.

utilitiesarraysforms

Twórca pytań: DB() i NEWDB() z własnym sterownikiem danych

Budować zapytania z DB().najdź().sort() i pozwól, aby kierowca zarejestrowany z NEWDB() je uruchomił, podczas gdy rejestrowany kierowca realizuje operacje bazy danych.

databasequerybuilder

Konfigurowanie aplikacji plikiem config

Trzymaj ustawienia w pliku config i czytaj je przez CONF.

configsettings

Szyfrowanie i odszyfrowywanie danych kluczem

Zamieniaj obiekty w nieprzejrzyste tokeny przez ENCRYPT() i odczytuj je przez DECRYPT(), dla podpisanych linków i krótkotrwałych tokenów.

securitycrypto

Wywołuj usługi zewnętrzne przez API() i sterowniki NEWAPI()

Zarejestruj sterownik usługi przez NEWAPI() i wywołuj go z akcji przez API(name, schema, data), w tym samym stylu callbacku, błędu i obietnicy co query builder.

apiservicesintegrations

Rozmawiaj z modelami językowymi z AIMODEL(), NEWAIMODel() i AIPARSER()

Zbuduj prośbę o rozmowę z AIMODEL(), pozwól kierowcy zarejestrowanemu w NEWAIMODL() wysłać ją do dostawcy i przeczytaj transmisje odpowiedzi z AIPARSER().

aillmintegrations

Ograniczanie nieudanych prób przez BLOCKED

Licz próby na adres IP przez BLOCKED() i odpowiadaj 429 po osiągnięciu limitu, dla logowań i resetów haseł.

securityrate-limiting

Małymi globalnymi pomocnikami: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY i PROMISIFY

Wykorzystaj globalne aplikacje, daty, głębokie kopie, wiersze zapytania i pomocnicy obiecani.

globalsutilitieshelpers

Zbieraj błędy za pomocą ErrorBuilder, rejestruj je przez ERROR() i prowadź ślad audytu przez AUDIT()

Odpowiadaj kilkoma błędami naraz za pomocą ErrorBuilder, odpowiedzi SUCCESS(), dowiedz się, jak ERROR() zapisuje błędy i jak AUDIT() dopisuje do pliku logu, kto co zrobił.

errorsloggingaudit

Opóźniaj pracę za pomocą setTimeout2() i clearTimeout2()

Użyj setTimeout2(), aby wykonać funkcję jeden raz po ustaniu wywołań, zastępując poprzedni timer o tym samym id, i anuluj go przez clearTimeout2().

timersdebounceutilities

Tokeny związane z przeglądarką dzięki ENCRYPTREQ() i DECRYPTREQ()

Zaszyfruj wartość razem z user agentem (i opcjonalnie adresem IP) żądania i odczytaj ją z powrotem tylko od tego samego klienta.

securityencryptiontokens

Rób kopię folderu przez BACKUP() i RESTORE() oraz uruchamiaj polecenia przez SHELL()

Spakuj katalog do jednego pliku i rozpakuj go ponownie za pomocą BACKUP() i RESTORE(), a w folderze projektu uruchom polecenie powłoki przez SHELL().

backupshellfiles

Przełącz aplikację w tryb konserwacji przez PAUSESERVER()

Wstrzymaj serwer po nazwie, aby każde żądanie dostawało stronę 503, wznów go i pamiętaj, że bez drugiego argumentu wywołanie przełącza stan.

maintenanceserveravailability

Reguły biznesowe jako tekst przez NEWMACRO()

Skompiluj małe reguły napisane w prostym języku (IF, ELSE, AND, OR, RETURN, wywołania helperów) do funkcji uruchamianej z modelem, tak aby reguły mogły żyć w pliku lub w bazie danych.

macrosrulesscripting

Serwowanie plików statycznych z folderu public

Pliki w katalogu public są serwowane automatycznie, bez potrzeby trasy.

staticfiles

Wywołaj inny adres przez AJAX() z serwera

Użyj AJAX(), aby wywołać adres HTTP z ciałem JSON i dostać sparsowaną odpowiedź, jako obietnicę lub z callbackiem, oraz dowiedz się, co dzieje się z błędami i XML.

httprequestsajax

Wywoływanie innych API HTTP przez RESTBuilder

Wysyłaj żądania GET i POST do innej usługi, ustawiaj nagłówki i timeout oraz czytaj status i sparsowaną odpowiedź.

integrationshttprestbuilder

Zwolnij strumień po jego zakończeniu za pomocą CLEANUP()

Użyj CLEANUP(), aby zniszczyć strumień zaraz po jego zakończeniu lub błędzie, tak aby nie zostały otwarte uchwyty plików, z callbackiem lub jako obietnicę.

streamsfilescleanup

Tłumaczenie widoku na kilka języków

Oznacz teksty w widokach przez @(...) i dostarcz tłumaczenia w plikach zasobów wybieranych przez LOCALIZE().

localizationi18nviews

Uruchamiaj kod według harmonogramu za pomocą CRON

Zarejestruj funkcję przez CRON() i pięciopolową linię cron oraz dowiedz się, kiedy działa sprawdzanie i jak usunąć zadanie.

cronschedulerjobs

Wykonuj ciężką pracę w wątku lub procesie potomnym

Użyj NEWTHREAD(), aby uruchomić wątek worker, wysyłać mu wiadomości i czytać odpowiedzi bez blokowania procesu głównego.

workerthreadperformance

Współdziel kilka wątków roboczych przez NEWTHREADPOOL()

Uruchom stałą liczbę workerów, pożycz jednego przez pool.exec(), gdy jest praca, oddaj go przez release() i pozwól innym zadaniom czekać na wolnego workera.

workerthreadpoolperformance

Wywołuj inne serwery przez REQUEST i zapisuj pliki przez DOWNLOAD

Użyj REQUEST() do niskopoziomowych wywołań HTTP z pełną kontrolą nad metodą, nagłówkami, query i ciałem oraz DOWNLOAD(), aby strumieniować zdalny plik na dysk.

httprequestdownload

Wysyłanie e-maila z widoku

Skonfiguruj SMTP w pliku config, wyrenderuj widok jako treść wiadomości przez MAIL() i wyślij gotowy HTML przez HTMLMAIL().

mailsmtpemail

Dostosuj strony 404 i 401

Zarejestruj handlery ROUTE('#404') i ROUTE('#401'), aby zastąpić wbudowane strony błędów, i wywołuj je sam przez $.fallback().

errors404routing

Wyślij sobie wiadomość przez LOGMAIL()

Wyślij zwykły tekst lub JSON na adres bez widoku, do logów i alertów, przez te same ustawienia SMTP co MAIL().

mailsmtplogging

Wysyłaj pliki i strumienie do klienta

Serwuj plik z dysku przez $.file(), wymuś nazwę pobierania, wysyłaj wygenerowaną treść przez $.stream() i odpowiadaj 404, gdy pliku brakuje.

filesdownloadstream

Przekazuj żądania do innego serwera

Użyj PROXY(), aby przypisać prefiks URL do serwera docelowego, wybierz sposób kopiowania ścieżki oraz $.proxy(), aby przekazać pojedynczą trasę.

proxygatewayintegrations

Opublikuj lokalny serwer przez tunel za pomocą PROXYSERVER() i PROXYCLIENT()

Pozwól serwerowi Total.js z publicznym adresem przekazywać żądania do programu, który działa tylko na prywatnej maszynie, przez tunel WebSocket otwierany przez stronę prywatną.

proxytunnelwebsocketintegrations

Chroń formularze i żądania tokenami CSRF

Utwórz token przez $.csrf(), wyślij go z żądaniem i zweryfikuj w middleware, aby odrzucać żądania z innych witryn.

securitycsrfmiddleware

Grupuj akcje w schemacie i używaj ponownie definicji inputu

Użyj NEWSCHEMA(), aby zadeklarować powiązane akcje pod jedną nazwą, i współdziel definicję inputu między akcjami za pomocą pliku w jsonschemas/.

schemaactionsvalidation

Zbuduj potok przetwarzania z użyciem transformów

Zarejestruj kilka kroków pod jedną nazwą przez NEWTRANSFORM() i przepuść wartość przez nie po kolei przez TRANSFORM().

transformpipeline

Wymiana komunikatów przez Total Messaging Service

Włącz punkt końcowy WebSocket TMS i pozwól zewnętrznym klientom odbierać publikowane komunikaty, wysyłać komunikaty do aplikacji i wywoływać jej funkcje.

tmspublishsubscribewebsocketmessaging

Zbuduj kompletny zasób REST z użyciem akcji

Zadeklaruj akcje query, read, insert, update, patch i remove nad bazą NoSQL, z walidacją, kodem 404 dla brakujących rekordów i trasami przypisującymi każdą metodę HTTP.

actionscrudrestnosql

Skonfiguruj trasę WebSocket z flagami, uwierzytelnianiem i parametrami

Wybierz typ wiadomości przez @text lub @binary, wymagaj zalogowanego użytkownika prefiksem +, sprawdzaj token CSRF przez @csrf i czytaj parametry URL w trasach SOCKET.

websocketrealtimesecurity

Minifikuj i łącz CSS, JavaScript i HTML

Pliki statyczne i odpowiedzi HTML są minifikowane automatycznie; użyj MERGE(), aby serwować kilka plików jako jeden, oraz ustawień $minify, aby to wyłączyć.

performancecssjavascripthtmlminification

Zmiana rozmiaru i konwersja obrazów

Przetwarzaj obrazy przez Image.load(), łącz operacje rozmiaru, przycinania i formatu, zapisz wynik, zmierz jego rozmiar i serwuj miniatury przez $.image().

imagesthumbnailsgraphicsmagick

Sprawdź granice schematu numerycznego zamiast przyjmować całą przymusu

Sprawdź Int, SmallInt, TinyInt i Number2 z native compact schemas, w tym wartości frakcyjne, zero i out-of-range wpisy.

validationschemanumbersboundaries

Korzystaj z wbudowanych helperów dla string, number, date i array

Total.js rozszerza String, Number, Date i Array o helpery do slugów, hashy, formatowania, parsowania, grupowania i wyszukiwania oraz oferuje U.extend() i U.clone() dla obiektów.

utilitieshelpersstringarraydate

Rejestracja wydarzeń audytu z native audit sink

Obserwuj opcję audytu i wyraźnie zadzwoń $.audit() bez kontaktu z usługą logowania lub pisząc wrażliwy wpis do dziennika aplikacji.

actionsauditsecurity

Uruchamianie w trybie debug i release

Opcje Total.run() wybierają tryb debug lub release; odczytuj tryb z DEBUG i ograniczaj trasy do jednego trybu przez @debug i @release.

deploymentdebugreleaseenvironment

Testuj aplikację wbudowanym uruchamiaczem testów

Napisz test.js, który uruchamia aplikację, rejestruje testy przez Test.push(), sprawdza wyniki przez Test.print() i kończy z kodem różnym od zera, gdy któryś zawiedzie.

testingci

Wykorzystaj wszystkie kolory CPU w trybie klastrowym

Rozpocznij kilka procesów pracowniczych za jednym portem z opcją klastru Total.run(), i dowiedzieć się, co jest dzielone między nimi i co nie.

clusterperformancedeployment

Załaduj moduł JavaScript z adresu URL przez IMPORT()

Pobierz plik z JavaScriptem z adresu, zapisz go w folderze tmp, załaduj przez require i użyj tego, co eksportuje; drugie wywołanie nie pobiera go ponownie.

modulesdownloaddependencies

Zbuduj przepływ komponentów przez Flow.load() i uruchom go przez exec()

Opisz FlowStream jako komponenty i połączenia między nimi, załaduj go w aplikacji, wyślij przez niego wiadomość i odczytaj odpowiedź oraz zmień konfigurację komponentu w trakcie działania.

flowflowstreamcomponentsautomation

Przetestuj komponent Flow osobno przez Flow.test()

Załaduj jeden komponent we własnym przepływie, wyślij mu wiadomość z kodu i odczytaj, co wysyła na swoje wyjścia, bez budowania całego przepływu.

flowflowstreamcomponentstests

Wywołaj działający program Pythona przez PYPELINE()

Uruchom skrypt Pythona z aplikacji, wysyłaj mu wiadomości JSON przez gniazdo i odbieraj jego odpowiedzi; skrypt jest restartowany, jeśli padnie.

pythonpypelineintegrationsai

Enums i granice weryfikacji formatu strumienia

Sprawdzanie pozytywnych i negatywnych kontrol kompaktowych schematów dla formatów enum, Color, Base64, Zip, Icon, JSON i IP.

total5reference

TotalAPI i granice usług Componentator

Sprawdź uszkodzoną gałęzię TotalAPI i lokalne przesyłki Componentator bez wykonywania połączeń zewnętrznych.

total5reference

Operacje QueryBuilder, filtry i kontrakt kierowcy

Sprawdź opcje DB i NEWDB, wyniki, błędy i formy filtra bez mylącej budowla z sterownikiem bazy danych.

total5reference

Kompilacja i uruchomienie elementu serwera

Kompiluj zaufany składnik Total.js HTML, tworz przykład, weryfikuj wiadomości, przekonfigurować je i uwalniać ich zasoby.

total5reference

Kontrola zwrotów telefonicznych, autoryzacja ręczna i odpowiedzi warunkowe

Wykonywanie jsonstring, odpowiedzi, wykonane, udane, upoważnione, dostosowane i ostatnio zmodyfikowane obsługi.

total5reference

Opcje transportu działania i wyraźna publikacja TMS

Testowanie csrf, szyfrowanie, kompresja i publikacja przeciwko rzeczywistym HTTP i TMS zamiast przyjmowania metadanych wymaga zachowania.

total5reference

Nieprawidłowe cache statyczne w trybie uwalniania

Usługiwanie i modyfikacja tymczasowego statycznego pliku, usuwanie jego ukrytej reprezentacji i usunięcie ukrytego 404 wpisów.

total5reference

OPENCLIENT RPC, wydarzenia i udostępnione połączenia

Ćwiczyć OPENCLIENT z lokalną ustawieniem protokołu, w tym inicjalizacją, korelacją zwrotną, terminowaniem i usunięciem logicznym klienta.

total5reference

Pobierz pliki FlowStream i wykonać izolowanych pracowników

Sprawdzaj ten sam zaufany schemat FlowStream jako czynnik i proces dziecięcy, pobierz pliki .flow i usunąć przypadki.

total5reference

Akcja cyklu życia, rozszerzenie wyników i administrator strażników

Ćwiczenie oninput, onoutput, extend, sa i su z ważnymi, nieważnymi i nieudanych działań.

total5reference

Prawdziwe transakcje SQL z native QueryBuilder i SQLite

Zarejestruj ograniczony sterownik SQLite, uruchom parametryzowany CRUD i weryfikuj zobowiązania, ogranicza błędy i odwraca się wobec bazy danych obsługiwanej plikami.

total5reference

Pobierz zasoby aplikacji i unikać niespodzianek w pakiecie runtime

Przeprowadź LOAD w odrębnym procesie i sprawdź ponowne wykorzystanie już dostępnego pakietu NPMINSTALL bez dostępu do sieci.

total5reference

Zapytaj o prawdziwy lokalny adres LDAP

Wyszukaj izolowaną instancję OpenLDAP i sprawdź wynik wiązania w łącznej liczbie 5 0,019.

total5reference

Pakiet aplikacji jako pudełko Total.js

Stwórz lokalny pakiet, naładuj jego definicje za pośrednictwem ładowarki startupowej ram i sprawdź ekstrakcję do .src.

total5reference

Wyślij własny plik i zbudować linki do zapytania

Sprawdź podstępne przesyłanie czyszczenia, autoklary (fałszywe), wyraźnie jasne i href zastępowanie zapytania.

total5reference