gitextract_qdwcsdfo/ ├── .dockerignore ├── .editorconfig ├── .eslintrc ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ └── ci.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .idea/ │ ├── codeStyles/ │ │ ├── Project.xml │ │ └── codeStyleConfig.xml │ ├── inspectionProfiles/ │ │ └── Project_Default.xml │ ├── modules.xml │ ├── omni-tools.iml │ ├── prettier.xml │ ├── shelf/ │ │ ├── Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]/ │ │ │ └── shelved.patch │ │ ├── Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]1/ │ │ │ └── shelved.patch │ │ └── Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM__Changes_.xml │ ├── vcs.xml │ └── workspace.xml ├── .prettierrc ├── .vitest/ │ └── setup.ts ├── .vscode/ │ └── settings.json ├── @types/ │ ├── i18n.d.ts │ └── theme.d.ts ├── CODEOWNERS ├── Dockerfile ├── LICENSE ├── README.md ├── commitlint.config.js ├── index.html ├── package.json ├── playwright.config.ts ├── postcss.config.mjs ├── public/ │ ├── _redirects │ ├── assets/ │ │ └── fonts/ │ │ └── quicksand/ │ │ └── quick-sand.css │ ├── gs.js │ ├── locales/ │ │ ├── de/ │ │ │ ├── audio.json │ │ │ ├── converters.json │ │ │ ├── csv.json │ │ │ ├── image.json │ │ │ ├── json.json │ │ │ ├── list.json │ │ │ ├── number.json │ │ │ ├── pdf.json │ │ │ ├── string.json │ │ │ ├── time.json │ │ │ ├── translation.json │ │ │ ├── video.json │ │ │ └── xml.json │ │ ├── en/ │ │ │ ├── audio.json │ │ │ ├── converters.json │ │ │ ├── csv.json │ │ │ ├── image.json │ │ │ ├── json.json │ │ │ ├── list.json │ │ │ ├── number.json │ │ │ ├── pdf.json │ │ │ ├── string.json │ │ │ ├── time.json │ │ │ ├── translation.json │ │ │ ├── video.json │ │ │ └── xml.json │ │ ├── es/ │ │ │ ├── audio.json │ │ │ ├── converters.json │ │ │ ├── csv.json │ │ │ ├── image.json │ │ │ ├── json.json │ │ │ ├── list.json │ │ │ ├── number.json │ │ │ ├── pdf.json │ │ │ ├── string.json │ │ │ ├── time.json │ │ │ ├── translation.json │ │ │ ├── video.json │ │ │ └── xml.json │ │ ├── fr/ │ │ │ ├── audio.json │ │ │ ├── converters.json │ │ │ ├── csv.json │ │ │ ├── image.json │ │ │ ├── json.json │ │ │ ├── list.json │ │ │ ├── number.json │ │ │ ├── pdf.json │ │ │ ├── string.json │ │ │ ├── time.json │ │ │ ├── translation.json │ │ │ ├── video.json │ │ │ └── xml.json │ │ ├── hi/ │ │ │ ├── audio.json │ │ │ ├── converters.json │ │ │ ├── csv.json │ │ │ ├── image.json │ │ │ ├── json.json │ │ │ ├── list.json │ │ │ ├── number.json │ │ │ ├── pdf.json │ │ │ ├── string.json │ │ │ ├── time.json │ │ │ ├── translation.json │ │ │ ├── video.json │ │ │ └── xml.json │ │ ├── ja/ │ │ │ ├── audio.json │ │ │ ├── converters.json │ │ │ ├── csv.json │ │ │ ├── image.json │ │ │ ├── json.json │ │ │ ├── list.json │ │ │ ├── number.json │ │ │ ├── pdf.json │ │ │ ├── string.json │ │ │ ├── time.json │ │ │ ├── translation.json │ │ │ ├── video.json │ │ │ └── xml.json │ │ ├── nl/ │ │ │ ├── audio.json │ │ │ ├── converters.json │ │ │ ├── csv.json │ │ │ ├── image.json │ │ │ ├── json.json │ │ │ ├── list.json │ │ │ ├── number.json │ │ │ ├── pdf.json │ │ │ ├── string.json │ │ │ ├── time.json │ │ │ ├── translation.json │ │ │ ├── video.json │ │ │ └── xml.json │ │ ├── pt/ │ │ │ ├── audio.json │ │ │ ├── converters.json │ │ │ ├── csv.json │ │ │ ├── image.json │ │ │ ├── json.json │ │ │ ├── list.json │ │ │ ├── number.json │ │ │ ├── pdf.json │ │ │ ├── string.json │ │ │ ├── time.json │ │ │ ├── translation.json │ │ │ ├── video.json │ │ │ └── xml.json │ │ ├── ru/ │ │ │ ├── audio.json │ │ │ ├── converters.json │ │ │ ├── csv.json │ │ │ ├── image.json │ │ │ ├── json.json │ │ │ ├── list.json │ │ │ ├── number.json │ │ │ ├── pdf.json │ │ │ ├── string.json │ │ │ ├── time.json │ │ │ ├── translation.json │ │ │ ├── video.json │ │ │ └── xml.json │ │ └── zh/ │ │ ├── audio.json │ │ ├── converters.json │ │ ├── csv.json │ │ ├── image.json │ │ ├── json.json │ │ ├── list.json │ │ ├── number.json │ │ ├── pdf.json │ │ ├── string.json │ │ ├── time.json │ │ ├── translation.json │ │ ├── video.json │ │ └── xml.json │ ├── robots.txt │ └── site.webmanifest ├── scripts/ │ ├── add-i18n-to-meta.js │ ├── cleanup-empty-directories.js │ ├── create-tool.mjs │ ├── locize-upload.js │ └── update-i18n-from-meta.js ├── src/ │ ├── @types/ │ │ └── i18n.d.ts │ ├── components/ │ │ ├── App.tsx │ │ ├── BackButton.tsx │ │ ├── Hero.tsx │ │ ├── InputHeader.tsx │ │ ├── Loading.css │ │ ├── Loading.tsx │ │ ├── Navbar/ │ │ │ └── index.tsx │ │ ├── ScrollToTopButton.tsx │ │ ├── Separator.tsx │ │ ├── ToolBreadcrumb.tsx │ │ ├── ToolContent.tsx │ │ ├── ToolHeader.tsx │ │ ├── ToolInfo.tsx │ │ ├── ToolInputAndResult.tsx │ │ ├── ToolLayout.tsx │ │ ├── UserTypeFilter.tsx │ │ ├── allTools/ │ │ │ ├── AllTools.tsx │ │ │ └── ToolCard.tsx │ │ ├── examples/ │ │ │ ├── ExampleCard.tsx │ │ │ ├── ExampleOptions.tsx │ │ │ └── ToolExamples.tsx │ │ ├── index.css │ │ ├── input/ │ │ │ ├── BaseFileInput.tsx │ │ │ ├── InputFooter.tsx │ │ │ ├── NumericInputWithUnit.tsx │ │ │ ├── ToolAudioInput.tsx │ │ │ ├── ToolCodeInput.tsx │ │ │ ├── ToolImageInput.tsx │ │ │ ├── ToolMultipleAudioInput.tsx │ │ │ ├── ToolMultipleImageInput.tsx │ │ │ ├── ToolMultiplePdfInput.tsx │ │ │ ├── ToolMultipleVideoInput.tsx │ │ │ ├── ToolPdfInput.tsx │ │ │ ├── ToolTextInput.tsx │ │ │ ├── ToolVideoInput.tsx │ │ │ └── file-input-utils.ts │ │ ├── options/ │ │ │ ├── CheckboxWithDesc.tsx │ │ │ ├── ColorSelector.tsx │ │ │ ├── RadioWithTextField.tsx │ │ │ ├── SelectWithDesc.tsx │ │ │ ├── SimpleRadio.tsx │ │ │ ├── TextFieldWithDesc.tsx │ │ │ ├── ToolOptionGroups.tsx │ │ │ └── ToolOptions.tsx │ │ └── result/ │ │ ├── ResultFooter.tsx │ │ ├── ToolFileResult.tsx │ │ ├── ToolMultiFileResult.tsx │ │ └── ToolTextResult.tsx │ ├── config/ │ │ ├── muiConfig.ts │ │ ├── routesConfig.tsx │ │ └── uiConfig.ts │ ├── contexts/ │ │ └── CustomSnackBarContext.tsx │ ├── datatables/ │ │ ├── data/ │ │ │ ├── material_electrical_properties.ts │ │ │ └── wire_gauge.ts │ │ ├── index.ts │ │ └── types.ts │ ├── hooks/ │ │ ├── index.ts │ │ ├── useDebounce.ts │ │ ├── usePrevious.ts │ │ ├── useTimeout.ts │ │ └── useUpdateEffect.ts │ ├── i18n/ │ │ └── index.ts │ ├── index.tsx │ ├── lib/ │ │ └── ghostscript/ │ │ ├── background-worker.js │ │ ├── gs-worker.js │ │ └── worker-init.ts │ ├── pages/ │ │ ├── home/ │ │ │ ├── Categories.tsx │ │ │ └── index.tsx │ │ ├── tools/ │ │ │ ├── audio/ │ │ │ │ ├── change-speed/ │ │ │ │ │ ├── change-speed.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── extract-audio/ │ │ │ │ │ ├── extract-audio.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── index.ts │ │ │ │ ├── merge-audio/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── merge-audio.service.test.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ └── trim/ │ │ │ │ ├── index.tsx │ │ │ │ ├── meta.ts │ │ │ │ ├── service.ts │ │ │ │ ├── trim.service.test.ts │ │ │ │ └── types.ts │ │ │ ├── converters/ │ │ │ │ ├── audio-converter/ │ │ │ │ │ ├── audio-converter.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ └── index.ts │ │ │ ├── csv/ │ │ │ │ ├── change-csv-separator/ │ │ │ │ │ ├── change-csv-separator.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── csv-rows-to-columns/ │ │ │ │ │ ├── csv-rows-to-columns.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── csv-to-json/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── csv-to-tsv/ │ │ │ │ │ ├── csv-to-tsv.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── csv-to-xml/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── csv-to-yaml/ │ │ │ │ │ ├── csv-to-yaml.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── find-incomplete-csv-records/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── index.ts │ │ │ │ ├── insert-csv-columns/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── insert-csv-columns.service.test.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── swap-csv-columns/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ ├── swap-csv-columns.service.test.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── transpose-csv/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ ├── transpose-csv.service.test.ts │ │ │ │ │ └── types.ts │ │ │ │ └── tsv-to-json/ │ │ │ │ ├── index.tsx │ │ │ │ ├── meta.ts │ │ │ │ ├── service.ts │ │ │ │ └── types.ts │ │ │ ├── image/ │ │ │ │ ├── generic/ │ │ │ │ │ ├── change-colors/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ └── service.ts │ │ │ │ │ ├── change-opacity/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ └── service.ts │ │ │ │ │ ├── compress/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ ├── service.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── convert-to-jpg/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── meta.ts │ │ │ │ │ ├── create-transparent/ │ │ │ │ │ │ ├── create-transparent.e2e.spec.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── meta.ts │ │ │ │ │ ├── crop/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── meta.ts │ │ │ │ │ ├── editor/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── meta.ts │ │ │ │ │ ├── image-to-text/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ ├── service.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── qr-code/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── remove-background/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── meta.ts │ │ │ │ │ ├── resize/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ ├── service.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ └── rotate/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── type.ts │ │ │ │ ├── index.ts │ │ │ │ └── png/ │ │ │ │ ├── compress-png/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── convert-jgp-to-png/ │ │ │ │ │ ├── convert-jgp-to-png.e2e.spec.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── meta.ts │ │ │ │ └── index.ts │ │ │ ├── json/ │ │ │ │ ├── escape-json/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── index.ts │ │ │ │ ├── json-comparison/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── json-to-csv/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.test.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── json-to-xml/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── minify/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── prettify/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── stringify/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ └── validateJson/ │ │ │ │ ├── index.tsx │ │ │ │ ├── meta.ts │ │ │ │ └── service.ts │ │ │ ├── list/ │ │ │ │ ├── duplicate/ │ │ │ │ │ ├── duplicate.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── find-most-popular/ │ │ │ │ │ ├── find-most-popular.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── find-unique/ │ │ │ │ │ ├── find-unique.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── group/ │ │ │ │ │ ├── group.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── index.ts │ │ │ │ ├── reverse/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── reverse.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── rotate/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── rotate.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── shuffle/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── shuffle.service.test.ts │ │ │ │ ├── sort/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── sort.service.test.ts │ │ │ │ ├── truncate/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── truncate.service.test.ts │ │ │ │ ├── unwrap/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── unwrap.service.test.ts │ │ │ │ └── wrap/ │ │ │ │ ├── index.tsx │ │ │ │ ├── meta.ts │ │ │ │ ├── service.ts │ │ │ │ └── wrap.service.test.ts │ │ │ ├── number/ │ │ │ │ ├── arithmetic-sequence/ │ │ │ │ │ ├── arithmetic-sequence.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── byte-converter/ │ │ │ │ │ ├── byte-converter.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── generate/ │ │ │ │ │ ├── generate.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── generic-calc/ │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── ohmsLaw.ts │ │ │ │ │ │ ├── slackline.ts │ │ │ │ │ │ ├── sphereArea.ts │ │ │ │ │ │ ├── sphereVolume.ts │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ └── voltageDropInWire.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── index.ts │ │ │ │ ├── random-number-generator/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── random-number-generator.service.test.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── random-port-generator/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── random-port-generator.service.test.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ └── sum/ │ │ │ │ ├── index.tsx │ │ │ │ ├── meta.ts │ │ │ │ ├── service.ts │ │ │ │ └── sum.service.test.ts │ │ │ ├── pdf/ │ │ │ │ ├── compress-pdf/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── convert-to-pdf/ │ │ │ │ │ ├── convert-to-pdf.service.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── editor/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── meta.ts │ │ │ │ ├── index.ts │ │ │ │ ├── merge-pdf/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── pdf-to-epub/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── pdf-to-png/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── protect-pdf/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── rotate-pdf/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── rotate-pdf.service.test.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── split-pdf/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ └── utils.ts │ │ │ ├── string/ │ │ │ │ ├── base64/ │ │ │ │ │ ├── base64.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── censor/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── create-palindrome/ │ │ │ │ │ ├── create-palindrome.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── extract-substring/ │ │ │ │ │ ├── extract-substring.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── hidden-character-detector/ │ │ │ │ │ ├── hidden-character-detector.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── index.ts │ │ │ │ ├── join/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ ├── string-join.e2e.spec.ts │ │ │ │ │ └── string-join.service.test.ts │ │ │ │ ├── palindrome/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── palindrome.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── password-generator/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── initialValues.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── password-generator.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── quote/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── quote.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── randomize-case/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── randomize-case.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── remove-duplicate-lines/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── remove-duplicate-lines.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── repeat/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── initialValues.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── repeatText.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── reverse/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── reverse.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── rot13/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── rot13.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── rotate/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── rotate.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── split/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── string-split.service.test.ts │ │ │ │ ├── statistic/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── text-replacer/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── initialValues.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── replaceText.service.test.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── to-morse/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── to-morse.service.test.ts │ │ │ │ ├── truncate/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── initialValues.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── truncateText.service.test.ts │ │ │ │ ├── unicode/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── unicode.service.test.ts │ │ │ │ ├── uppercase/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── uppercase.service.test.ts │ │ │ │ ├── url-decode/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ └── url-encode/ │ │ │ │ ├── index.tsx │ │ │ │ ├── meta.ts │ │ │ │ ├── service.ts │ │ │ │ └── types.ts │ │ │ ├── time/ │ │ │ │ ├── check-leap-years/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── convert-days-to-hours/ │ │ │ │ │ ├── convert-days-to-hours.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── convert-hours-to-days/ │ │ │ │ │ ├── convert-hours-to-days.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── convert-seconds-to-time/ │ │ │ │ │ ├── convert-seconds-to-time.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── convert-time-to-decimal/ │ │ │ │ │ ├── convert-time-to-decimal.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── convert-time-to-seconds/ │ │ │ │ │ ├── convert-time-to-seconds.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── convert-unix-to-date/ │ │ │ │ │ ├── convert-unix-to-date.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── crontab-guru/ │ │ │ │ │ ├── crontab-guru.service.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── discord-timestamp/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── index.ts │ │ │ │ ├── time-between-dates/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── time-between-dates.service.test.ts │ │ │ │ └── truncate-clock-time/ │ │ │ │ ├── index.tsx │ │ │ │ ├── meta.ts │ │ │ │ ├── service.ts │ │ │ │ └── truncate-clock-time.service.test.ts │ │ │ ├── video/ │ │ │ │ ├── change-speed/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── compress/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── crop-video/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── flip/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── gif/ │ │ │ │ │ ├── change-speed/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── meta.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── loop/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── merge-video/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── merge-video.service.test.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── service.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── rotate/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── service.ts │ │ │ │ ├── trim/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── meta.ts │ │ │ │ └── video-to-gif/ │ │ │ │ ├── index.tsx │ │ │ │ ├── meta.ts │ │ │ │ └── types.ts │ │ │ └── xml/ │ │ │ ├── index.ts │ │ │ ├── xml-beautifier/ │ │ │ │ ├── index.tsx │ │ │ │ ├── meta.ts │ │ │ │ ├── service.ts │ │ │ │ ├── types.ts │ │ │ │ └── xml-beautifier.service.test.ts │ │ │ └── xml-validator/ │ │ │ ├── index.tsx │ │ │ ├── meta.ts │ │ │ ├── service.ts │ │ │ ├── types.ts │ │ │ └── xml-validator.service.test.ts │ │ └── tools-by-category/ │ │ └── index.tsx │ ├── providers/ │ │ └── UserTypeFilterProvider.tsx │ ├── tools/ │ │ ├── defineTool.tsx │ │ ├── index.test.ts │ │ └── index.ts │ └── utils/ │ ├── array.ts │ ├── bookmark.ts │ ├── color.ts │ ├── csv.ts │ ├── file.ts │ ├── gif.ts │ ├── index.ts │ ├── json.ts │ ├── number.ts │ ├── string.ts │ └── time.ts ├── tailwind.config.mjs ├── tsconfig.json └── vite.config.ts