{"id":24123814,"url":"https://github.com/peczenyj/gdpr-iab-tcfv2","last_synced_at":"2026-05-15T11:17:45.314Z","repository":{"id":210463371,"uuid":"726538206","full_name":"peczenyj/GDPR-IAB-TCFv2","owner":"peczenyj","description":"gdpr iab tcf v2 consent string parser for perl","archived":false,"fork":false,"pushed_at":"2026-05-09T10:00:16.000Z","size":9929,"stargazers_count":2,"open_issues_count":20,"forks_count":0,"subscribers_count":1,"default_branch":"devel","last_synced_at":"2026-05-09T10:43:44.208Z","etag":null,"topics":["gdpr","perl","tcfv2"],"latest_commit_sha":null,"homepage":"https://metacpan.org/dist/GDPR-IAB-TCFv2","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/peczenyj.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.pod","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2023-12-02T17:12:12.000Z","updated_at":"2026-05-09T08:15:57.000Z","dependencies_parsed_at":"2025-02-28T21:15:23.938Z","dependency_job_id":"5335e74a-b761-41c6-9f5d-cd45dc3f7997","html_url":"https://github.com/peczenyj/GDPR-IAB-TCFv2","commit_stats":null,"previous_names":["peczenyj/gdpr-iab-tcfv2"],"tags_count":37,"template":false,"template_full_name":null,"purl":"pkg:github/peczenyj/GDPR-IAB-TCFv2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peczenyj%2FGDPR-IAB-TCFv2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peczenyj%2FGDPR-IAB-TCFv2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peczenyj%2FGDPR-IAB-TCFv2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peczenyj%2FGDPR-IAB-TCFv2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peczenyj","download_url":"https://codeload.github.com/peczenyj/GDPR-IAB-TCFv2/tar.gz/refs/heads/devel","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peczenyj%2FGDPR-IAB-TCFv2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33064683,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-15T02:00:06.351Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gdpr","perl","tcfv2"],"created_at":"2025-01-11T13:18:18.759Z","updated_at":"2026-05-15T11:17:45.308Z","avatar_url":"https://github.com/peczenyj.png","language":"Perl","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv\u003e\n    \u003ca href=\"https://cpants.cpanauthors.org/dist/GDPR-IAB-TCFv2\"\u003e\u003cimg src=\"https://cpants.cpanauthors.org/dist/GDPR-IAB-TCFv2.svg\" alt='Kwalitee'/\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\n    \u003ca href=\"https://github.com/peczenyj/GDPR-IAB-TCFv2/actions/workflows/linux.yml\"\u003e\u003cimg src=\"https://github.com/peczenyj/GDPR-IAB-TCFv2/actions/workflows/linux.yml/badge.svg\" alt='tests'/\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\n    \u003ca href=\"https://github.com/peczenyj/GDPR-IAB-TCFv2/actions/workflows/windows.yml\"\u003e\u003cimg src=\"https://github.com/peczenyj/GDPR-IAB-TCFv2/actions/workflows/windows.yml/badge.svg\" alt='tests'/\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\n    \u003ca href=\"https://github.com/peczenyj/GDPR-IAB-TCFv2/actions/workflows/macos.yml\"\u003e\u003cimg src=\"https://github.com/peczenyj/GDPR-IAB-TCFv2/actions/workflows/macos.yml/badge.svg\" alt='tests'/\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\n    \u003ca href=\"https://coveralls.io/github/peczenyj/GDPR-IAB-TCFv2?branch=main\"\u003e\u003cimg src=\"https://coveralls.io/repos/github/peczenyj/GDPR-IAB-TCFv2/badge.svg?branch=main\" alt='Coverage Status' /\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\n    \u003ca href=\"https://github.com/peczenyj/GDPR-IAB-TCFv2/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/cpan/l/GDPR-IAB-TCFv2.svg\" alt='license'/\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\n    \u003ca href=\"https://metacpan.org/dist/GDPR-IAB-TCFv2\"\u003e\u003cimg src=\"https://img.shields.io/cpan/v/GDPR-IAB-TCFv2.svg\" alt='cpan'/\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n# NAME\n\nGDPR::IAB::TCFv2 - TCF v2.3 distribution: parser, validator, CMP-validator, and CLI\n\n# PROJECT STATUS\n\n`GDPR::IAB::TCFv2` entered **maintenance mode** on 2026-05-14 with the\nv0.500 release. The core parser, validator, and CMP-validator surfaces\nare considered feature-complete for the IAB TCF v2.3 specification.\n\nIn maintenance mode the maintainer commits to bug fixes, security\nfixes, CPAN-tester regression triage, and tracking IAB-spec updates\n(TCF v2.4 / v3 if and when they ship). Larger feature work -- the\nremaining roadmap phases (GVL-aware validator, Special Features /\nSpecial Purposes, CLI configuration loading), the distribution items\n(DockerHub automation, Debian package), and the sister-distribution\nideas in [\"ECOSYSTEM\"](#ecosystem) -- is now tracked as `help-wanted` issues on\nGitHub.\n\nPatches and PRs from the community are welcome and will continue to be\nreviewed. See `TODO.pod` at the repository root for the full\nhelp-wanted list and `CONTRIBUTING.pod` for the patching workflow.\n\n# SYNOPSIS\n\nThis module is the documentation hub for the `GDPR-IAB-TCFv2`\ndistribution. It exposes a thin `Parse` delegate that returns an\ninstance of [GDPR::IAB::TCFv2::Parser](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AParser):\n\n    use feature qw\u003csay\u003e;\n    use GDPR::IAB::TCFv2;\n\n    my $consent = GDPR::IAB::TCFv2-\u003eParse(\n        'CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA.argAC0gAAAAAAAAAAAA'\n    );\n\n    say $consent-\u003ecmp_id;             # 21\n    say $consent-\u003econsent_language;   # 'EN'\n    say $consent-\u003eis_v23 ? 'v2.3' : 'older';\n\nFor declarative compliance checks, see [GDPR::IAB::TCFv2::Validator](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AValidator).\nFor one-liner / shell-use shortcuts, see [\"ONE-LINER USAGE\"](#one-liner-usage) below.\n\n# COMPONENTS\n\nThe distribution ships several pieces. Each link below jumps to the\nrelevant module or section.\n\n## [GDPR::IAB::TCFv2::Parser](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AParser)\n\nThe bit-stream parser. `Parse` returns an instance whose accessors,\npredicates, and JSON serializer answer every question about a TC\nstring.\n\n## [GDPR::IAB::TCFv2::Validator](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AValidator)\n\nDeclarative compliance checks. `$validator-\u003evalidate($tc_string)`\nasserts a vendor's presence in the string for a given purpose set on a\ngiven legal basis.\n\n## [GDPR::IAB::TCFv2::CMPValidator](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3ACMPValidator)\n\nValidates that a TC string's `cmp_id` is registered in the IAB's\npublic CMP list (file, JSON, or URL-loaded snapshot).\n\n## [iabtcfv2](https://metacpan.org/pod/iabtcfv2) (Perl module)\n\nA pure-exporter short alias for one-liner and shell use. Provides\n`tcf($s)` and `validator(%opts)` as importable functions. See\n[\"ONE-LINER USAGE\"](#one-liner-usage).\n\n## `bin/iabtcfv2` (CLI)\n\nSubcommand-style command-line utility. `iabtcfv2 dump` emits parsed\nJSON; `iabtcfv2 validate` runs declarative compliance checks against\na vendor identity and a purpose set. See [\"COMMAND LINE TOOLS\"](#command-line-tools).\n\n## Docker image\n\nPre-built Docker Hub image `peczenyj/gdpr-iab-tcfv2` wraps the CLI\nfor portable use. See [\"DOCKER USAGE\"](#docker-usage).\n\n# INCOMPATIBLE CHANGES\n\n## v0.500\n\nThe parser implementation moved from `GDPR::IAB::TCFv2` to a new\nsubpackage [GDPR::IAB::TCFv2::Parser](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AParser). The class-method delegate\nremains: `GDPR::IAB::TCFv2-\u003eParse(...)` still works and is the\nrecommended entry point. However, the returned object is now blessed\ninto `GDPR::IAB::TCFv2::Parser` rather than `GDPR::IAB::TCFv2`:\n\n    my $c = GDPR::IAB::TCFv2-\u003eParse($s);\n\n    # Before v0.500:\n    ref($c) eq 'GDPR::IAB::TCFv2'             # true\n    $c-\u003eisa('GDPR::IAB::TCFv2')               # true\n\n    # v0.500 and later:\n    ref($c) eq 'GDPR::IAB::TCFv2::Parser'     # true\n    $c-\u003eisa('GDPR::IAB::TCFv2::Parser')       # true\n    $c-\u003eisa('GDPR::IAB::TCFv2')               # false\n\nEvery method call, every JSON output byte, and every CLI behavior is\nunchanged. The break only affects code that asserts the exact class\nname via `ref`, `isa`, `blessed`, `Storable::thaw`, or similar.\n\n# CONSTRUCTOR\n\n## Parse\n\n`GDPR::IAB::TCFv2-\u003eParse($tc_string, %opts)` is the entry point\nfor parsing TCF v2.3 consent strings. It delegates to\n[GDPR::IAB::TCFv2::Parser-\u003eParse](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AParser#Parse)\nand returns a `GDPR::IAB::TCFv2::Parser` object; see that page for\nthe full constructor contract (`strict`, `prefetch`, `json`\noptions).\n\n# COMMAND LINE TOOLS\n\nThis distribution includes a unified command line tool to work with TC strings.\n\n## iabtcfv2\n\nThe `iabtcfv2` utility provides several subcommands for TCF v2.3 strings.\n\n### dump\n\nParses TC strings and output them as JSON.\n\n    # Basic usage\n    iabtcfv2 dump \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n    # Pretty printed JSON\n    iabtcfv2 dump --pretty \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n    # Stream multiple strings from STDIN as JSON Lines\n    cat strings.txt | iabtcfv2 dump\n\n    # Pipe through `jq -s` if you need a single JSON array\n    cat strings.txt | iabtcfv2 dump | jq -s .\n\n    # Short flags can be bundled (the last bundled short may take a value)\n    iabtcfv2 dump -pi \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n    iabtcfv2 dump -pv 284 \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n    # Long options accept the GNU `--opt=value` form\n    iabtcfv2 dump --vendor-id=284 \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n### validate\n\nValidates TC strings against a vendor identity and a set of declared purpose\nlists, emitting one JSON record per string (or text lines with `--text`).\nThe vendor must be allowed for every purpose in `--consent-purposes` on a\nconsent basis, and for every purpose in `--legitimate-interest-purposes`\non a legitimate-interest basis. Exit code is `0` when every string is\nvalid, `1` on any parse or validation failure, `2` on bad CLI usage.\n\n    # Basic usage: vendor must appear in the TC string\n    iabtcfv2 validate -v 284 \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n    # Require vendor 284 to be allowed for purposes 1 and 3 on consent basis\n    iabtcfv2 validate -v 284 -C 1,3 \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n    # Require both consent (purposes 1, 3) and legitimate interest (purpose 7)\n    iabtcfv2 validate -v 284 -C 1,3 -L 7 \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n    # Accumulate every failing rule (validate_all) instead of fail-fast\n    iabtcfv2 validate -av 284 -C 1,3 -L 7 \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n    # Human-readable text output instead of JSON\n    iabtcfv2 validate -tv 284 -C 1,3 \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n    # Reject TC strings whose policy version is below 5 (TCF v2.3)\n    iabtcfv2 validate -v 284 -m 5 \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n    # Pipeline-friendly: -q suppresses output, only the exit code is meaningful\n    if iabtcfv2 validate -qv 284 -C 1,3 \"$tc_string\"; then\n        echo \"ok\"\n    fi\n\n    # Stream multiple strings from STDIN as JSON Lines (pipe through\n    # `jq -s` if you need a single JSON array)\n    cat strings.txt | iabtcfv2 validate -v 284 -C 1,3\n\nSee `iabtcfv2 --help` or `perldoc iabtcfv2` for more details.\n\nFor script-free invocation without `bin/iabtcfv2`, see\n[\"ONE-LINER USAGE\"](#one-liner-usage).\n\n# ONE-LINER USAGE\n\nThe distribution supports `perl -M...` one-liners directly. The\n[iabtcfv2](https://metacpan.org/pod/iabtcfv2) module exports `tcf($s)` (which returns a\n`GDPR::IAB::TCFv2::Parser`) and `validator(%opts)` (which returns a\n`GDPR::IAB::TCFv2::Validator`), making short scripts even shorter.\n\n## Print one field\n\n    perl -Miabtcfv2 -E 'say tcf(shift)-\u003ecmp_id' \"$tc\"\n\nEquivalent long form (no shortcut module):\n\n    perl -MGDPR::IAB::TCFv2 -E 'say GDPR::IAB::TCFv2-\u003eParse(shift)-\u003ecmp_id' \"$tc\"\n\n## Multi-field TSV\n\n    perl -Miabtcfv2 -E '\n        my $c = tcf(shift);\n        say join(\"\\t\", $c-\u003ecmp_id, $c-\u003ecmp_version, $c-\u003econsent_language,\n                       $c-\u003evendor_list_version, $c-\u003epolicy_version)\n    ' \"$tc\"\n\n## Emulate \\`iabtcfv2 dump --pretty\\` via core JSON::PP\n\n    perl -Miabtcfv2 -MJSON::PP -E '\n        say JSON::PP-\u003enew-\u003econvert_blessed-\u003ecanonical-\u003epretty\n                    -\u003eencode(tcf(shift))\n    ' \"$tc\"\n\n## Stream multiple strings on STDIN\n\n    perl -Miabtcfv2 -nE '\n        chomp;\n        my $c = eval { tcf($_) } or next;\n        say join(\"\\t\", $_, $c-\u003ecmp_id)\n    ' \u003c strings.txt\n\n## Validate\n\n    perl -Miabtcfv2 -E '\n        my $r = validator(vendor_id =\u003e 284, consent_purpose_ids =\u003e [1,3])\n                -\u003evalidate(shift);\n        say $r ? \"ok\" : \"fail: $r\"\n    ' \"$tc\"\n\n# DOCKER USAGE\n\nThis tool is also available as a Docker image on Docker Hub.\n\n## Basic Usage\n\n    docker run --rm peczenyj/gdpr-iab-tcfv2 dump \"CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA\"\n\n## Processing Streams (STDIN)\n\nTo process a stream of strings via pipe:\n\n    cat strings.txt | docker run -i --rm peczenyj/gdpr-iab-tcfv2 dump\n\nTo type strings manually:\n\n    docker run -it --rm peczenyj/gdpr-iab-tcfv2 dump\n\n# ACRONYMS\n\n[GDPR](https://gdpr-info.eu/): General Data Protection Regulation\n\n[IAB](https://iabeurope.eu/about-us/): Interactive Advertising Bureau\n\n[TCF](https://iabeurope.eu/transparency-consent-framework/): The Transparency \u0026 Consent Framework\n\n# FUNCTIONS\n\n## looksLikeIsConsentVersion2\n\nWill check if a given tc string starts with a literal `C`.\n\n# ECOSYSTEM\n\nThe following **sister distributions** are intentionally left as\n`help-wanted` ideas rather than shipped from this module. Each one is\ncompanion glue for a popular Perl framework and would add a runtime\ndependency on its host framework, so they belong as separate CPAN\ndistributions rather than features of `GDPR::IAB::TCFv2` itself.\n\n- [GDPR::IAB::TCFv2::Validator::LIVR](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AValidator%3A%3ALIVR)\n\n    LIVR rule-engine binding for JSON-shaped TC string payloads.\n\n- [GDPR::IAB::TCFv2::Validator::TypeTiny](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AValidator%3A%3ATypeTiny)\n\n    Reusable Type::Tiny constraints (parameterized by purpose / vendor\n    sets) for Moo, Moose, or pure-Perl callers that prefer type-level\n    enforcement.\n\n- [Plack::Middleware::GDPR::TCFv2](https://metacpan.org/pod/Plack%3A%3AMiddleware%3A%3AGDPR%3A%3ATCFv2)\n\n    Plack middleware that decodes a TC string from a request header or\n    cookie, attaches a parsed `GDPR::IAB::TCFv2` object to `$env`,\n    and short-circuits the response when consent is missing or invalid.\n\n- [GDPR::IAB::TCFv2::Validator::Moose](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AValidator%3A%3AMoose)\n\n    Moose attribute traits and role-based validation for Moose-end-to-end\n    projects.\n\n- [GDPR::IAB::TCFv2::Validator::FormValidator](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AValidator%3A%3AFormValidator)\n\n    `Data::FormValidator` profile glue for legacy applications that drive\n    business validation through DFV.\n\nThe `help-wanted` issues on GitHub track each of these ideas; see\n[https://github.com/peczenyj/GDPR-IAB-TCFv2/issues?q=label%3Aecosystem](https://github.com/peczenyj/GDPR-IAB-TCFv2/issues?q=label%3Aecosystem)\nand `TODO.pod` for context.\n\n# SEE ALSO\n\n[GDPR::IAB::TCFv2::Parser](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AParser) for the parser API.\n\n[GDPR::IAB::TCFv2::Validator](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3AValidator) for declarative compliance checks.\n\n[GDPR::IAB::TCFv2::CMPValidator](https://metacpan.org/pod/GDPR%3A%3AIAB%3A%3ATCFv2%3A%3ACMPValidator) for CMP-list validation.\n\n[iabtcfv2](https://metacpan.org/pod/iabtcfv2) for one-liner / shell-use shortcuts.\n\nThe original IAB documentation of [TCF v2](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md).\n\n# AUTHOR\n\nTiago Peczenyj [mailto:tiago.peczenyj+cpan@gmail.com](mailto:tiago.peczenyj+cpan@gmail.com)\n\n# THANKS\n\nSpecial thanks to [ikegami](https://metacpan.org/author/IKEGAMI) for the patience on several question about Perl on [Stack Overflow](https://stackoverflow.com).\n\n# BUGS\n\nPlease report any bugs or feature requests to [https://github.com/peczenyj/GDPR-IAB-TCFv2/issues](https://github.com/peczenyj/GDPR-IAB-TCFv2/issues).\n\n# LICENSE AND COPYRIGHT\n\nCopyright 2023-2026 Tiago Peczenyj\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of either: the GNU General Public License as published\nby the Free Software Foundation; or the Artistic License.\n\nSee [http://dev.perl.org/licenses/](http://dev.perl.org/licenses/) for more information.\n\n# DISCLAIMER\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeczenyj%2Fgdpr-iab-tcfv2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeczenyj%2Fgdpr-iab-tcfv2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeczenyj%2Fgdpr-iab-tcfv2/lists"}