Commit Graph

46 Commits

Author SHA1 Message Date
Kyohei Fukuda
616ace4aed [codex] Add generic split range metadata (#1469)
* refactor(schemas): add generic split range metadata

* refactor(schemas): remove legacy split range fields

* refactor(schemas): polish split range helpers
2026-05-06 11:55:10 +09:00
Kyohei Fukuda
1bd2ec9bd8 [codex] Add dynamic height for text schemas (#1467)
* feat(generator): expand text schema height dynamically

* fix(schemas): restore overflow select binding

* feat(schemas): split expanded text by line

* fix(ui): merge edits from split text chunks

* fix(schemas): avoid regex splitting split text edits

* fix(schemas): harden split text dynamic layout
2026-05-06 10:41:45 +09:00
Kyohei Fukuda
03f616f0c5 [codex] Add @pdfme/jsx package (#1466)
* feat(jsx): add pdfme jsx package

* refactor(jsx): derive text props from schema types

* fix(jsx): tighten mvp layout constraints

* feat(jsx): measure text height with schema helpers

* docs: update jsx md2pdf roadmap
2026-05-05 17:48:19 +09:00
Kyohei Fukuda
bed77e5713 [codex] add list schema implementation plan (#1460)
* docs: add list schema implementation plan

* feat(schemas): add list schema

* fix(schemas): improve list form editing

* fix(schemas): localize list editing labels

* fix(schemas): align table control buttons

* fix(schemas): keep list designer editing during actions

* fix(tsconfig): resolve list schema subpath

* fix(schemas): keep list action clicks isolated

* fix(schemas): support empty list state

* fix(schemas): allow editing list items in designer

* fix(schemas): keep list designer editing on enter

* fix(schemas): ignore IME enter in list editor

* fix(schemas): make enter insert list item line breaks

* test(generator): add list plugin to playground snapshots

* refactor(schemas): render list items with text ui

* fix(schemas): adapt list prop panel fields by style

* fix(schemas): simplify list options and nested numbering

* Reorder import statements in generate-templates-thumbnail

* Reorder List plugin in getPlugins function

* fix(ui): reflow schemas after dynamic list resize

* chore: remove obsolete list plan

* fix(ui): reflow form list height changes

* fix(ui): keep designer height changes local

* fix(schemas): commit list item line breaks immediately

* fix(schemas): restore list focus after line break rerender

* fix(schemas): keep form list focused after enter

* test(generator): update dynamic list snapshots

* fix(schemas): store list content as json arrays

* fix(schemas): address list review cleanup

* test(ui): update designer snapshot

* chore: trim list pr noise

* fix(schemas): align list markers in ui
2026-05-03 13:34:51 +09:00
Mani
6bef40c67c fix: two unbounded-cache memory leaks in common and schemas (#1426)
* fix: two unbounded-cache memory leaks in common and schemas

Two module-level Map caches that never evict and store multi-MB strings
as keys, silently leaking for the entire lifetime of any consumer.

1. packages/common/src/expression.ts — parseDataCache

   parseData() was memoized via a module-level parseDataCache keyed by
   JSON.stringify(data). replacePlaceholders() calls it with a merged
   { ...schemaNameDefaults, ...variables } object where values may be
   arbitrary strings from the caller. Whenever inputs contain base64
   (image schemas with embedded data URLs, embedded fonts, large text),
   the cache key is a multi-MB JSON string that gets pinned permanently;
   every unique inputs state adds its own key, never collected. Parsing
   is O(fields) and cheap, so removing the cache is strictly a win.

   Regression test: packages/common/__tests__/expression.test.ts
   'replacePlaceholders memory safety > does not retain call inputs in
   a module-level cache' — runs 30 replacePlaceholders() calls with
   unique ~500 KB payloads, captures a V8 heap snapshot via
   v8.writeHeapSnapshot, aggregates string nodes >= 200 KB and asserts
   the total retained size is below 2 MB. Pre-fix: ~30 MB retained
   (FAILS). Post-fix: 0 bytes retained (passes).

2. packages/schemas/src/graphics/image.ts — getCacheKey

   getCacheKey(schema, input) returned `${schema.type}${input}`, using
   the full base64 bytes of the image as part of the cache key. Every
   unique image processed by the PDF render path added a permanent Map
   entry whose key byte length matched the image itself.

   Replaced with a short fingerprint that samples the total length plus
   three 16-char regions (first, middle, last). The middle-region
   sample is essential: base64 PNGs share a common header and IEND
   trailer, so distinct images of the same size would collide if only
   first/last regions were sampled. Middle bytes are pixel data and
   differ between distinct images with overwhelming probability. Keys
   stay under 80 chars regardless of input size.

   Regression tests: packages/schemas/__tests__/image.test.ts
   - 'does not pin the full base64 input as a cache key' — asserts
     key length < 100 chars. Pre-fix: 139 chars for a minimal PNG and
     proportionally more for realistic images (FAILS).
   - 'distinguishes different images via the fingerprint' — guards
     against future over-shortening of the fingerprint that could
     reintroduce collisions between distinct images.

Both leaks were originally identified via a V8 heap-snapshot diff taken
across a UI workload (typing + field tabbing) against a consumer app
with image schemas carrying base64 content. Before the fix, the top two
growing allocations by retained size were multi-MB string entries — one
per module-level cache in this PR — together accounting for hundreds of
MB of retained JS heap in a single 3-iteration run. After the fix, both
string entries disappear from the top 25 growing allocations and
aggregate JS heap is net flat / slightly shrinking across iterations.

No public API change. No behavioral change for consumers. Both caches
were module-local implementation details.

* fix(schemas): harden image cache key with FNV-1a hash; fix stale test comments

Addresses Greptile review on #1426:

- Replace 3-region sampling fingerprint in getCacheKey with an FNV-1a
  32-bit hash over the full input. The old first-16 slice was a
  constant data-URI prefix for any image of the same MIME type,
  contributing no entropy; hashing every byte removes that weakness
  at the same O(n) cost without retaining any slice as a Map key.
  Key format is now `${type}:${len}:${fnv1a-hex}` (~40 chars).
- Rewrite stale comments in image.test.ts that referred to a
  padding/mutation scheme the test never performs, and update the
  fingerprint-format comment to match the new hash-based key.
- Add trailing newline to expression.test.ts.

All pre-existing and new tests still pass.
2026-04-27 16:30:32 +09:00
hand-dot
45082df08b Add Vitest foundation for common and manipulator 2026-03-20 15:31:31 +09:00
TNBO/Eedge
69f6be160b fix(dynamicTemplate): rewrite layout engine for accurate multi-page table rendering (#1294)
* fix(dynamicTemplate): rewrite layout engine for accurate multi-page table rendering

- Implement sequential offset-based layout algorithm for correct element positioning
- Add floating point tolerance (EPSILON) to prevent precision errors in page break calculations
- Fix __bodyRange indexing to correctly map dynamicHeights to table body data
- Prevent orphaned table headers by moving header with first data row when page breaks
- Fix UI recalculation timing to use immediate input values for dynamic templates
- Update tests to match new layout behavior

* refactor(common): process dynamic template per page and remove duplicate cloneDeep

* refactor(common): process each template page independently regardless of dynamic content
2025-12-16 15:17:29 +09:00
TNBO/Eedge
f791e0b5a2 feat(table): add headerRepeat option and fix dynamic layout (#1238) 2025-11-21 15:32:38 +09:00
dependabot[bot]
d493f0bd8f build(deps): bump zod from 3.25.67 to 4.1.11 (#1210)
* build(deps): bump zod from 3.25.67 to 4.1.11

Bumps [zod](https://github.com/colinhacks/zod) from 3.25.67 to 4.1.11.
- [Release notes](https://github.com/colinhacks/zod/releases)
- [Commits](https://github.com/colinhacks/zod/compare/v3.25.67...v4.1.11)

---
updated-dependencies:
- dependency-name: zod
  dependency-version: 4.1.11
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Fix zod v4 API compatibility issues

- Update z.function() usage to z.any() for Plugin schema (zod v4 changed z.function() to a function factory)
- Update z.record() calls to use two arguments (key schema, value schema) as required by zod v4
- Add type assertions for Object.entries() to fix type inference issues
- Update test error message to match zod v4 format

Co-Authored-By: Kyohei Fukuda <kyoheif@wix.com>

* Update test expectations for zod v4 error message format

- Update error messages in common package tests to match zod v4 format
- 'Expected array, received string' → 'Invalid input: expected array, received string'
- 'Array must contain at least 1 element(s)' → 'Too small: expected array to have >=1 items'
- 'Required' → 'Invalid input: expected {type}, received undefined'

Co-Authored-By: Kyohei Fukuda <kyoheif@wix.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Kyohei Fukuda <kyoheif@wix.com>
Co-authored-by: Kyohei Fukuda <kyouhei.fukuda0729@gmail.com>
2025-11-08 14:44:27 +09:00
Kiewn
6d16b14fb8 fix: Fix calculate target page index in function page breaking. (#1188)
* fix: Fix calculate target page index in function page breaking.

* fix : fix unit test.
2025-10-03 10:11:19 +09:00
Kyohei Fukuda
0dd54739ac XSS vulnerability prevention for replacePlaceholders function (#1117)
* test(expression): add XSS vulnerability prevention tests for replacePlaceholders function

* Update packages/common/src/expression.ts

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* test: group safe Object method tests into single test case

- Refactored individual tests for Object.keys, Object.values, Object.entries, and Object.assign
- Combined them into a single test case with multiple assertions for better organization
- Addresses code review feedback about test organization

Co-authored-by: Kyohei Fukuda <hand-dot@users.noreply.github.com>

* feat(security): implement safeAssign to prevent prototype pollution and enhance XSS protection

* fix(safeAssign): use object spread for safer target assignment

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Kyohei Fukuda <hand-dot@users.noreply.github.com>
2025-07-10 08:21:48 +09:00
Kyohei Fukuda
41b8dd970c Organize generator test (#1098)
* remove old japanese template

* Add new image snapshots and update font references in tests

* Refactor code structure for improved readability and maintainability
2025-06-27 16:59:02 +09:00
Peter Ward
f137dab01c improve DX with pluginRepository and make plugin checking more robust (#1007)
* add pluginRepository and make plugin checking more robust

* Apply suggestions from code review

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* f

* f

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2025-05-16 13:54:20 +09:00
devin-ai-integration[bot]
6a2d86f588 Fix easy-to-resolve linting errors in packages/common (#811)
* Fix linting errors in packages/common directory

- Replace explicit 'any' types with more specific types like 'unknown'
- Fix unsafe function calls with proper type assertions
- Remove unnecessary type assertions
- Replace non-null assertions with nullish coalescing operators
- Fix redundant type constituents in union types

Co-Authored-By: Kyohei Fukuda <kyouhei.fukuda0729@gmail.com>

* Fix type error in helper.ts getFontNamesInSchemas function

Co-Authored-By: Kyohei Fukuda <kyouhei.fukuda0729@gmail.com>

* Fix type errors in schemas package and test files

Co-Authored-By: Kyohei Fukuda <kyouhei.fukuda0729@gmail.com>

* Revert strict type changes to maintain backward compatibility

Co-Authored-By: Kyohei Fukuda <kyouhei.fukuda0729@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Kyohei Fukuda <kyouhei.fukuda0729@gmail.com>
2025-03-05 14:57:53 +09:00
Kyohei Fukuda
b0d980c433 Modification to make the library ESM-based. (#770)
* Remove fast-xml-parser dependency and update vite-tsconfig-paths to 5.1.4

* tmp

* Refactor test files and scripts to use ES modules; remove obsolete files

* Enhance tests with new PDF utilities and update Jest configuration for ESM support
2025-03-01 02:23:24 +09:00
Kyohei Fukuda
f3896de632 Add comparison operator evaluations (#678) 2025-01-18 17:12:21 +09:00
Zin Kyaw Kyaw (AJ)
abf0e360a3 [630]: Bug fix on basePdf as array buffer (#659)
* [630]: Bug fix on basePdf as array buffer

* Minor fix

* Fix handling of customPdf in getB64BasePdf to ensure proper conversion to Uint8Array

* TMP

* Fix test

---------

Co-authored-by: hand-dot <kyouhei.fukuda0729@gmail.com>
2024-12-14 15:44:42 +09:00
Kyohei Fukuda
2ef3f126a7 Enable placement of headers and footers in fixed positions & Use template engine (#620)
* Impl replacePlaceholders

* fix build

* Update replacePlaceholders

* optimize images

* Add doc

* update schema doc

* Fix bug

* add tests

* add security tests for replacePlaceholders to prevent access to prohibited properties and methods

* optimize parseData and evaluatePlaceholders with caching for improved performance

* remove ejs

* add license information for @types/estree and acorn in package-lock.json

* Fix ci

* write doc

* Update website/docs/headers-and-footers.md

Co-authored-by: Peter Ward <pete@pennyblack.io>

* Update playground/src/helper.ts

Co-authored-by: Peter Ward <pete@pennyblack.io>

---------

Co-authored-by: Peter Ward <pete@pennyblack.io>
2024-11-11 19:19:19 +09:00
Peter Ward
1d778fe5de [BC Break]: Template schema restructure from keyed object to array (#588) 2024-09-20 10:11:23 +01:00
Kyohei Fukuda
54b813c44b Fix table layout bug (#589)
* Fix table layout bug

* Update snapshot

* Move cloneDeep to common

* Minor fix

* revert some test pdf

* add test

* Minor fix

* Minor fix

* Minor fix

* refactoring
2024-09-10 20:49:52 +09:00
Kyohei Fukuda
a3a2b0bdc6 [WIP] V4 (#427)
* Reconsider the internal data types and the template types (#389)

* Change SchemaForUI's data and readOnlyValue to content

* Fix bug

* Remove sampledata and instead always use content. & Use content regardless of readOnly or not. & Eliminate defaultValue and replace it with always using content.

* Change website template

* Fix placeholder bug

* Change generator test template

* Change content to optional

* Move getInputFromTemplate to common

* Remove columns

* Fix test

* move dynamictable.excalidraw

* remove idea dir

* New basePdf type and Support adding new pages to template (#394)

* Minor fix

* IMPL Support adding new pages to template #111

* Fix test

* Minor fix

* IMPL padding behavior

* Update snapshot

* Minor fix

* Update snapshot

* add i18n

* remove option from BlankPdf.padding

* Minor fix

* Minor fix

* format

* Add changeSchemas unit test (#403)

* Minor fix

* Add a version number to pdfme template from V4 onwards (#404)

* Impl

* Minor fix

* Padding move width (#407)

* Refactor position and size handling in helper.ts

* Fix bug

* Add DynamicTable Schema #332 (#408)

* [tmp] add some comment

* Update snapshot

* Add deploy-table script to package.json

* add new template for playground

* bug fix for form

* fix cell editing bug

* Fix Adding rows doesn't change the overall height of the table

* fix padding problem

* Fix build error

* Fix bug

* Minor fix

* Fix New lines not reflecting correctly

* minor fix

* Minor fix

* Change tableStyles def

* add i18n

* small bugfix

* FIx some TODO

* Remove japanese comment

* Minor fix

* Fix infinity loom for form

* fix save inputs bug

* fix window resize bug

* add skip for failing test and update snapshot

* Minor fix

* add presets for playground

* Minor fix

* Reconsider the internal data types and the template types (#389)

* Change SchemaForUI's data and readOnlyValue to content

* Fix bug

* Remove sampledata and instead always use content. & Use content regardless of readOnly or not. & Eliminate defaultValue and replace it with always using content.

* Change website template

* Fix placeholder bug

* Change generator test template

* Change content to optional

* Move getInputFromTemplate to common

* Remove columns

* Fix test

* move dynamictable.excalidraw

* remove idea dir

* New basePdf type and Support adding new pages to template (#394)

* Minor fix

* IMPL Support adding new pages to template #111

* Fix test

* Minor fix

* IMPL padding behavior

* Update snapshot

* Minor fix

* Update snapshot

* add i18n

* remove option from BlankPdf.padding

* Minor fix

* Minor fix

* format

* Add changeSchemas unit test (#403)

* Minor fix

* Add a version number to pdfme template from V4 onwards (#404)

* Impl

* Minor fix

* Padding move width (#407)

* Refactor position and size handling in helper.ts

* Fix bug

* Add DynamicTable Schema #332 (#408)

* [tmp] add some comment

* Update snapshot

* Add deploy-table script to package.json

* add new template for playground

* bug fix for form

* fix cell editing bug

* Fix Adding rows doesn't change the overall height of the table

* fix padding problem

* Fix build error

* Fix bug

* Minor fix

* Fix New lines not reflecting correctly

* minor fix

* Minor fix

* Change tableStyles def

* add i18n

* small bugfix

* FIx some TODO

* Remove japanese comment

* Minor fix

* Fix infinity loom for form

* fix save inputs bug

* fix window resize bug

* add skip for failing test and update snapshot

* Minor fix

* add presets for playground

* Minor fix

* Minor fix

* Update imports and fix font rendering

* Add a Left Sidebar for Placing Schemas #400 (#452)

* Remove original 'Add new field' Button

* add icon

* FIx drag position bug

* Minor fix

* Fix sidebar position

* Update snapshot

* Minor fix

* Update packages/ui/src/components/Designer/index.tsx

Co-authored-by: Peter Ward <pete@pennyblack.io>

---------

Co-authored-by: Peter Ward <pete@pennyblack.io>

* Fix test

* Improve left sidebar icon drop placement accuracy (#454)

* Fix Spanish translations for v4 (#463)

* Fix #431

* V4 (#467)

* feat: add french language

* feat: relecture

* feat: add french language

---------

Co-authored-by: regis <regis>

* Add French language option to playground

* rename table export name to tableBeta

---------

Co-authored-by: Peter Ward <pete@pennyblack.io>
Co-authored-by: Iker Diez <32014358+ikerd@users.noreply.github.com>
Co-authored-by: Régis <regis.charnace@leandco.fr>
2024-04-11 09:43:36 +09:00
steffancarrington
aed7d1b86e Barcode colour validation added, tests added and error handling added 2023-12-05 13:07:14 +00:00
Kyohei Fukuda
5787079470 Separating Schema label from code identifier (#304)
* TMP

* Minor fix

* Update doc

* Rename `propPanel.propPanelSchema` to `propPanel.schema`

* Minor fix

* remove comment
2023-11-02 00:09:39 +09:00
Kyohei Fukuda
3b593d2cd1 FIx fail test 2023-10-26 00:00:55 +09:00
Kyohei Fukuda
8e4ccc3c35 Publicize internal-use-only processing and allow for injection of processing from the outside (#281)
* Move some type to common

* Add plugins interface

* TMP

* Fix build error

* Fix generator test

* Remove CommonProps export for user

* Add checkPlugins

* Minor fix
2023-10-20 11:32:09 +09:00
Kyohei Fukuda
c2fd0a8fae Add schemas package (#278)
* Add schemas package

* TMP

* TMP

* Fix text pdfRender bug

* move render props type to schema

* update type

* TMP

* remove webpack

* Fix build error

* Add comment

* TMP

* bugfix

* TMP

* Bug fix for dynamicFontSize

* Minor fix

* TMP

* Minor fix

* Fix build error

* Add generics

* add comment

* Minor fix

* Move Plugin type to common from schemas

* TMP Move some pdfme/common functions to pdfme/schemas

* Fix test

* Fix build bug

* Fix build error

* Refactoring

* remove any type

* Fix fail test

* Fix build error

* Minor fix

* Refactoring

* Fix format
2023-10-18 17:29:49 +09:00
Kyohei Fukuda
ce8902a28c Enable processing from the registered schema in ui package's Designer's Custom prop editor (for internal use only) (#274) 2023-10-09 10:46:31 +09:00
Kyohei Fukuda
09ad087c71 Enable processing from the registered schema in the ui package's renderer (for internal use only) (#261)
* TMP

* TMP

* TMP

* TMP

* FIX Empty characters are not rendered

* Add Image renders

* Add barcode renders and bugfix

* Update snapshot

* Minor fix

* Minor fix

* Minor fix
2023-09-23 16:38:18 +09:00
Kyohei Fukuda
8d4b9f00f2 Move createBarCode to common 2023-09-12 10:59:40 +09:00
Steffan Carrington
83ebf5d394 Custom qr code colours (#256)
* QR Codes - ability to customise barcode colours added

* review fixes

* fix typo

* consolidate ColorInputSet for shared use between Text and BarCode

* consolidate some logic shared for bwip.js barcode lip between UI and generator

---------

Co-authored-by: Pete Ward <pete@pennyblack.io>
2023-09-12 09:21:42 +09:00
Peter Ward
285dc2ffa3 fix dynamic font size vertical fit to use a more accurate height calculations (#250) 2023-08-30 13:00:38 +09:00
Peter Ward
ebaedaa9dc vertical alignment support for text schema (#247) 2023-08-27 16:10:24 +09:00
Kyohei Fukuda
2f2ea0f6d8 Update website 2023-08-19 16:34:27 +09:00
Peter Ward
d3b3667f80 Dynamic font sizing - Fit options (#230)
* added fit options for dynamic font sizing
implemented horizontal fit as default

* rebase fix

* review feedback

* tests

* add integration test

* vertical as default fit

* fix tests

* review feedback
2023-08-15 23:29:11 +09:00
Peter Ward
1b53e1f595 TextSchema UI fixes for dynamic font sizing (#229) 2023-08-14 22:32:50 +09:00
Peter Ward
f96c69430a dynamic font size test fixes (#227) 2023-08-14 09:01:22 +09:00
Peter Ward
eef5bbf4b0 Dynamic font size 2.0 (#222)
* Dynamic font size 2.0
- grow and shrink font to fit vertical space
- improve UX for managing dynamic font sizing

* fix edge cases
add common tests

* further tests

* comment
2023-08-13 17:03:02 +09:00
Kyohei Fukuda
e3c863e839 [WIP] Vertical Text Overflow Management in Text Box #169 (#217)
* IMPL

* Minor fix

* add comment

* Minor fix

* use lineHeight

* Bug fix
2023-08-06 23:39:08 +09:00
Kyohei Fukuda
fd8e491dc1 Refactoring -> Fix text height rendering for PDF generation #196 (#206)
* chore: Update font tests & calculateDynamicFontSize

- Updated the font tests and added tests for calculateDynamicFontSize.
- Also refactored code for readability and maintainability.

* [WIP] Update font test and font module to support font alignment.

- The font test was updated to use a shorter input string.
- The `calculateDynamicFontSize` function in the font module was updated to include font alignment calculations.
- The `heightOfFontAtSize` function in the font module was updated to use the provided font size parameter.
- The `getFontKitFont` function in the font module was updated to use the provided fontName from the text schema.
- The `drawInputByTextSchema` function in the generator module was updated to use the `getFontKitFont` and `getFontAlignmentValue` functions from the font module.

* Update generator snapshot pdf

* Update generator snapshot pdf
2023-07-30 20:32:56 +09:00
Nemanja Stefanović
ece3d75707 GS1 datamatrix support (#185)
* add gs1datamatrix type

* improve validation check of gs1 datamatrix gtin using checkdigit

* add preview for UI, tests
2023-06-24 09:43:21 +09:00
Kyohei Fukuda
7fd97abe62 Remove '@pdfme/pdf-lib' in common package #178 and Optimize 2023-06-04 15:42:22 +09:00
Kyohei Fukuda
a0dff703b5 Refactoring for dynamic font 2023-06-04 00:33:56 +09:00
Kyohei Fukuda
0bdabb105b Move common test files 2023-06-03 17:05:08 +09:00
hand-dot
1d992bae63 Add validateCheckDigit in validateBarcodeInput 2022-03-06 16:39:25 +09:00
hand-dot
810c72cc95 tmp 2022-02-01 18:22:40 +09:00
hand-dot
432dc22b6b tmp 2022-02-01 13:25:41 +09:00