Skip to content

hardening(db): sync migrations git ↔ prod schema_migrations + fix profiles.user_id#231

Open
adm01-debug wants to merge 8 commits into
mainfrom
hardening/migration-sync-2026-05-15
Open

hardening(db): sync migrations git ↔ prod schema_migrations + fix profiles.user_id#231
adm01-debug wants to merge 8 commits into
mainfrom
hardening/migration-sync-2026-05-15

Conversation

@adm01-debug
Copy link
Copy Markdown
Owner

@adm01-debug adm01-debug commented May 15, 2026

Resumo

Elimina drift entre supabase/migrations/ (git) e supabase_migrations.schema_migrations (prod). Causa raiz do gate Supabase Preview falhando com Remote migration versions not found in local migrations directory.

Operações

Categoria Quantidade Detalhe
Renames de filename 6 timestamps realinhados pra bater com schema_migrations de prod
Deleção de duplicata 1 fix_audit_ownership_orphans_uuid_only era duplicata funcional de fix_audit_ownership_orphans_only_uuid_columns
INSERT em prod schema_migrations 5 versões aplicado FORA do PR via execute_sql MCP (ON CONFLICT DO NOTHING)
ALTER TABLE physical em prod 1 profiles.user_id ADD COLUMN + backfill + RLS — frontend referenciava em 7 lugares e coluna não existia

Antes / Depois

Antes: 17 versions em prod, 17 versions em git, mas
       7 desalinhadas + 5 ausentes em prod + 1 duplicata em git

Depois: 17 versions em prod = 17 versions em git (paridade 100%)

Validação

  • Pré-flight do ALTER em profiles: 8 profiles, 8 auth.users, FK profiles_id_fkey íntegra, 0 órfãos
  • Pós-execução: profiles.user_id existe + 8/8 backfilled + UNIQUE constraint + 3 policies RLS
  • B-1 a B-9 do hardening pré-prod continuam fechados (auditoria anterior)
  • Todos os efeitos physical das 5 versões INSERTed foram pre-validados em prod

Documentação

Ver docs/hardening/MIGRATION-SYNC-2026-05-15.md (este PR) com mapeamento completo, causa raiz e pendências não endereçadas.

Não endereça neste PR

  • 10 itens manuais de go-live (Sentry DSN, MFA, transferir Lovable, etc.)
  • F2 PR-B (drop backup tables)
  • PAT GitHub exposto no VPS (manual)
  • Cobertura de testes 26% real (report-only)

Summary by cubic

Syncs Supabase migrations between git and production to eliminate drift and unblock the Supabase Preview gate. Adds and backfills profiles.user_id in prod with RLS to match the app.

  • Bug Fixes
    • Renamed 6 files in supabase/migrations/ to match supabase_migrations.schema_migrations timestamps; removed one duplicate.
    • Registered 5 missing versions in prod; git ↔ prod now at 17/17 parity (fixes “Remote migration versions not found in local migrations directory”).
    • Added profiles.user_id in prod, backfilled, set UNIQUE, restored RLS policies, and enabled RLS.
    • Added docs/hardening/MIGRATION-SYNC-2026-05-15.md with the mapping and validations.

Written for commit 7d3f934. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

Release Notes

  • Chores
    • Sincronizou e corrigiu inconsistências internas entre configurações de banco de dados.
    • Removeu código duplicado e não utilizado do sistema.
    • Realizou limpeza de migrações para garantir consistência de infraestrutura.

Review Change Stack

Copilot AI review requested due to automatic review settings May 15, 2026 18:31
@vercel
Copy link
Copy Markdown

vercel Bot commented May 15, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
promo-gifts Ready Ready Preview, Comment May 15, 2026 6:32pm

@supabase
Copy link
Copy Markdown

supabase Bot commented May 15, 2026

Updates to Preview Branch (hardening/migration-sync-2026-05-15) ↗︎

Deployments Status Updated
Database Fri, 15 May 2026 18:33:42 UTC
Services Fri, 15 May 2026 18:33:42 UTC
APIs Fri, 15 May 2026 18:33:42 UTC

Tasks are run on every commit but only new migration files are pushed.
Close and reopen this PR if you want to apply changes from existing seed or migration files.

Tasks Status Updated
Configurations Fri, 15 May 2026 18:33:53 UTC
Migrations Fri, 15 May 2026 18:34:06 UTC
Seeding ⏸️ Fri, 15 May 2026 18:31:49 UTC
Edge Functions ⏸️ Fri, 15 May 2026 18:31:49 UTC

❌ Branch Error • Fri, 15 May 2026 18:34:07 UTC

ERROR: syntax error at or near "LS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIEdJRlRTIFNUT1JFIC0gUkxTIENPTSBPUkdBTklaQVRJT05TIChNVUxUSS1URU5BTlQpCi0tIEFwbGljYSBSb3cgTGV2ZWwgU2VjdXJpdHkgYmFzZWFkbyBlbSBPcmdhbml6YXRpb25zCi0tIERhdGE6IDAzLzAxLzIwMjUKLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIEd1YXJkOiB0aGlzIGVudGlyZSBtaWdyYXRpb24gaXMgd3JhcHBlZCBpbiBhIERPIGJsb2NrIHNvIGl0Ci0tIGV4aXRzIGNsZWFubHkgd2hlbiBwdWJsaWMub3JnYW5pemF0aW9ucyBkb2Vzbid0IGV4aXN0IHlldC4KLS0gT24gYSBmcmVzaCBTdXBhYmFzZSBQcmV2aWV3IEJyYW5jaCB0aGF0IHJlcGxheXMgYWxsIG1pZ3JhdGlvbnMKLS0gZnJvbSBzY3JhdGNoLCBvcmdhbml6YXRpb25zIGlzIGNyZWF0ZWQgbGF0ZXIgaW4gdGhlIHNlcXVlbmNlLgotLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkRPICRvdXRlciQKQkVHSU4KICBJRiBOT1QgRVhJU1RTICgKICAgIFNFTEVDVCAxIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcwogICAgV0hFUkUgdGFibGVfc2NoZW1hID0gJ3B1YmxpYycgQU5EIHRhYmxlX25hbWUgPSAnb3JnYW5pemF0aW9ucycKICApIFRIRU4KICAgIFJBSVNFIE5PVElDRSAnTWlncmF0aW9uIDIwMjUwMTAzXzAyX3Jsc19vcmdhbml6YXRpb25zIHNraXBwZWQ6IHB1YmxpYy5vcmdhbml6YXRpb25zIGRvZXMgbm90IGV4aXN0IHlldC4nOwogICAgUkVUVVJOOwogIEVORCBJRjsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgMTogQURJQ0lPTkFSIG9yZ2FuaXphdGlvbl9pZCBOQVMgVEFCRUxBUyBQUklOQ0lQQUlTCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5jYXRlZ29yaWVzCiAgICBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgb3JnYW5pemF0aW9uX2lkIFVVSUQgUkVGRVJFTkNFUyBwdWJsaWMub3JnYW5pemF0aW9ucyhpZCkgT04gREVMRVRFIENBU0NBREU7CiAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NhdGVnb3JpZXNfb3JnIE9OIHB1YmxpYy5jYXRlZ29yaWVzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5zdXBwbGllcnMKICAgIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBvcmdhbml6YXRpb25faWQgVVVJRCBSRUZFUkVOQ0VTIHB1YmxpYy5vcmdhbml6YXRpb25zKGlkKSBPTiBERUxFVEUgQ0FTQ0FERTsKICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfc3VwcGxpZXJzX29yZyBPTiBwdWJsaWMuc3VwcGxpZXJzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5wcm9kdWN0cwogICAgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIG9yZ2FuaXphdGlvbl9pZCBVVUlEIFJFRkVSRU5DRVMgcHVibGljLm9yZ2FuaXphdGlvbnMoaWQpIE9OIERFTEVURSBDQVNDQURFOwogIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9wcm9kdWN0c19vcmcgT04gcHVibGljLnByb2R1Y3RzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5xdW90ZXMKICAgIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBvcmdhbml6YXRpb25faWQgVVVJRCBSRUZFUkVOQ0VTIHB1YmxpYy5vcmdhbml6YXRpb25zKGlkKSBPTiBERUxFVEUgQ0FTQ0FERTsKICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfcXVvdGVzX29yZyBPTiBwdWJsaWMucXVvdGVzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5vcmRlcnMKICAgIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBvcmdhbml6YXRpb25faWQgVVVJRCBSRUZFUkVOQ0VTIHB1YmxpYy5vcmdhbml6YXRpb25zKGlkKSBPTiBERUxFVEUgQ0FTQ0FERTsKICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfb3JkZXJzX29yZyBPTiBwdWJsaWMub3JkZXJzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5iaXRyaXhfY2xpZW50cwogICAgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIG9yZ2FuaXphdGlvbl9pZCBVVUlEIFJFRkVSRU5DRVMgcHVibGljLm9yZ2FuaXphdGlvbnMoaWQpIE9OIERFTEVURSBDQVNDQURFOwogIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9iaXRyaXhfY2xpZW50c19vcmcgT04gcHVibGljLmJpdHJpeF9jbGllbnRzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5tb2NrdXBfZ2VuZXJhdGlvbl9qb2JzCiAgICBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgb3JnYW5pemF0aW9uX2lkIFVVSUQgUkVGRVJFTkNFUyBwdWJsaWMub3JnYW5pemF0aW9ucyhpZCkgT04gREVMRVRFIENBU0NBREU7CiAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X21vY2t1cF9qb2JzX29yZyBPTiBwdWJsaWMubW9ja3VwX2dlbmVyYXRpb25fam9icyhvcmdhbml6YXRpb25faWQpOwoKICBBTFRFUiBUQUJMRSBwdWJsaWMuY29sbGVjdGlvbnMKICAgIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBvcmdhbml6YXRpb25faWQgVVVJRCBSRUZFUkVOQ0VTIHB1YmxpYy5vcmdhbml6YXRpb25zKGlkKSBPTiBERUxFVEUgQ0FTQ0FERTsKICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY29sbGVjdGlvbnNfb3JnIE9OIHB1YmxpYy5jb2xsZWN0aW9ucyhvcmdhbml6YXRpb25faWQpOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAyOiBGVU7Dh8ODTyBIRUxQRVIgLSBWZXJpZmljYXIgc2UgdXNlciBwZXJ0ZW5jZSDDoCBvcmcKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gcHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdfaWQgVVVJRCkKICBSRVRVUk5TIEJPT0xFQU4gQVMgJGZuJAogIEJFR0lOCiAgICBSRVRVUk4gRVhJU1RTICgKICAgICAgU0VMRUNUIDEKICAgICAgRlJPTSBwdWJsaWMudXNlcl9vcmdhbml6YXRpb25zCiAgICAgIFdIRVJFIG9yZ2FuaXphdGlvbl9pZCA9IG9yZ19pZAogICAgICAgIEFORCB1c2VyX2lkID0gYXV0aC51aWQoKQogICAgKTsKICBFTkQ7CiAgJGZuJCBMQU5HVUFHRSBwbHBnc3FsIFNFQ1VSSVRZIERFRklORVIgU1RBQkxFOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAzOiBBUExJQ0FSIFJMUyBFTSBUT0RBUyBBUyBUQUJFTEFTCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5jYXRlZ29yaWVzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLnN1cHBsaWVycyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5wcm9kdWN0cyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5wcm9kdWN0X3ZhcmlhbnRzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLnF1b3RlcyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5xdW90ZV9pdGVtcyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5vcmRlcnMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKICBBTFRFUiBUQUJMRSBwdWJsaWMub3JkZXJfaXRlbXMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKICBJRiBFWElTVFMgKFNFTEVDVCAxIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9zY2hlbWE9J3B1YmxpYycgQU5EIHRhYmxlX25hbWU9J3BheW1lbnRzJykgVEhFTgogICAgQUxURVIgVEFCTEUgcHVibGljLnBheW1lbnRzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgRU5EIElGOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5iaXRyaXhfY2xpZW50cyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5tb2NrdXBfZ2VuZXJhdGlvbl9qb2JzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLmdlbmVyYXRlZF9tb2NrdXBzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLmNvbGxlY3Rpb25zIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLmNvbGxlY3Rpb25fcHJvZHVjdHMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKICBBTFRFUiBUQUJMRSBwdWJsaWMucGVyc29uYWxpemF0aW9uX3RlY2huaXF1ZXMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKICBBTFRFUiBUQUJMRSBwdWJsaWMubm90aWZpY2F0aW9ucyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5mZWF0dXJlX2ZsYWdzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLnN5c3RlbV9zZXR0aW5ncyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSA0OiBQT0xJQ0lFUyAtIENBVEVHT1JJRVMKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X2NhdGVnb3JpZXMiIE9OIHB1YmxpYy5jYXRlZ29yaWVzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3ZpZXdfY2F0ZWdvcmllcyIKICAgIE9OIHB1YmxpYy5jYXRlZ29yaWVzIEZPUiBTRUxFQ1QgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKHB1YmxpYy51c2VyX2lzX29yZ19tZW1iZXIob3JnYW5pemF0aW9uX2lkKSk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX2FkbWluc19jcmVhdGVfY2F0ZWdvcmllcyIgT04gcHVibGljLmNhdGVnb3JpZXM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX2FkbWluc19jcmVhdGVfY2F0ZWdvcmllcyIKICAgIE9OIHB1YmxpYy5jYXRlZ29yaWVzIEZPUiBJTlNFUlQgVE8gYXV0aGVudGljYXRlZAogICAgV0lUSCBDSEVDSyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX3VwZGF0ZV9jYXRlZ29yaWVzIiBPTiBwdWJsaWMuY2F0ZWdvcmllczsKICBDUkVBVEUgUE9MSUNZICJvcmdfYWRtaW5zX3VwZGF0ZV9jYXRlZ29yaWVzIgogICAgT04gcHVibGljLmNhdGVnb3JpZXMgRk9SIFVQREFURSBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKQogICAgV0lUSCBDSEVDSyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX2RlbGV0ZV9jYXRlZ29yaWVzIiBPTiBwdWJsaWMuY2F0ZWdvcmllczsKICBDUkVBVEUgUE9MSUNZICJvcmdfYWRtaW5zX2RlbGV0ZV9jYXRlZ29yaWVzIgogICAgT04gcHVibGljLmNhdGVnb3JpZXMgRk9SIERFTEVURSBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKTsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgNTogUE9MSUNJRVMgLSBTVVBQTElFUlMKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X3N1cHBsaWVycyIgT04gcHVibGljLnN1cHBsaWVyczsKICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc192aWV3X3N1cHBsaWVycyIKICAgIE9OIHB1YmxpYy5zdXBwbGllcnMgRk9SIFNFTEVDVCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX21hbmFnZV9zdXBwbGllcnMiIE9OIHB1YmxpYy5zdXBwbGllcnM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX2FkbWluc19tYW5hZ2Vfc3VwcGxpZXJzIgogICAgT04gcHVibGljLnN1cHBsaWVycyBGT1IgQUxMIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChwdWJsaWMuaXNfb3JnX293bmVyX29yX2FkbWluKG9yZ2FuaXphdGlvbl9pZCkpCiAgICBXSVRIIENIRUNLIChwdWJsaWMuaXNfb3JnX293bmVyX29yX2FkbWluKG9yZ2FuaXphdGlvbl9pZCkpOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSA2OiBQT0xJQ0lFUyAtIFBST0RVQ1RTCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX21lbWJlcnNfdmlld19wcm9kdWN0cyIgT04gcHVibGljLnByb2R1Y3RzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3ZpZXdfcHJvZHVjdHMiCiAgICBPTiBwdWJsaWMucHJvZHVjdHMgRk9SIFNFTEVDVCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX21hbmFnZV9wcm9kdWN0cyIgT04gcHVibGljLnByb2R1Y3RzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19hZG1pbnNfbWFuYWdlX3Byb2R1Y3RzIgogICAgT04gcHVibGljLnByb2R1Y3RzIEZPUiBBTEwgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKSkKICAgIFdJVEggQ0hFQ0sgKHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKSk7CgogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC0tIFBBUlRFIDc6IFBPTElDSUVTIC0gUFJPRFVDVF9WQVJJQU5UUwogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX3ZpZXdfdmFyaWFudHMiIE9OIHB1YmxpYy5wcm9kdWN0X3ZhcmlhbnRzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3ZpZXdfdmFyaWFudHMiCiAgICBPTiBwdWJsaWMucHJvZHVjdF92YXJpYW50cyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5wcm9kdWN0cwogICAgICAgIFdIRVJFIGlkID0gcHJvZHVjdF92YXJpYW50cy5wcm9kdWN0X2lkCiAgICAgICAgICBBTkQgcHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpCiAgICAgICkKICAgICk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX2FkbWluc19tYW5hZ2VfdmFyaWFudHMiIE9OIHB1YmxpYy5wcm9kdWN0X3ZhcmlhbnRzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19hZG1pbnNfbWFuYWdlX3ZhcmlhbnRzIgogICAgT04gcHVibGljLnByb2R1Y3RfdmFyaWFudHMgRk9SIEFMTCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAoCiAgICAgIEVYSVNUUyAoCiAgICAgICAgU0VMRUNUIDEgRlJPTSBwdWJsaWMucHJvZHVjdHMKICAgICAgICBXSEVSRSBpZCA9IHByb2R1Y3RfdmFyaWFudHMucHJvZHVjdF9pZAogICAgICAgICAgQU5EIHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKQogICAgICApCiAgICApCiAgICBXSVRIIENIRUNLICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5wcm9kdWN0cwogICAgICAgIFdIRVJFIGlkID0gcHJvZHVjdF92YXJpYW50cy5wcm9kdWN0X2lkCiAgICAgICAgICBBTkQgcHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpCiAgICAgICkKICAgICk7CgogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC0tIFBBUlRFIDg6IFBPTElDSUVTIC0gUVVPVEVTCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX21lbWJlcnNfdmlld19xdW90ZXMiIE9OIHB1YmxpYy5xdW90ZXM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfdmlld19xdW90ZXMiCiAgICBPTiBwdWJsaWMucXVvdGVzIEZPUiBTRUxFQ1QgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKHB1YmxpYy51c2VyX2lzX29yZ19tZW1iZXIob3JnYW5pemF0aW9uX2lkKSk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX21lbWJlcnNfY3JlYXRlX3F1b3RlcyIgT04gcHVibGljLnF1b3RlczsKICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc19jcmVhdGVfcXVvdGVzIgogICAgT04gcHVibGljLnF1b3RlcyBGT1IgSU5TRVJUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFdJVEggQ0hFQ0sgKHB1YmxpYy51c2VyX2lzX29yZ19tZW1iZXIob3JnYW5pemF0aW9uX2lkKSk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX21lbWJlcnNfdXBkYXRlX293bl9xdW90ZXMiIE9OIHB1YmxpYy5xdW90ZXM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfdXBkYXRlX293bl9xdW90ZXMiCiAgICBPTiBwdWJsaWMucXVvdGVzIEZPUiBVUERBVEUgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKAogICAgICBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgQU5EIChjcmVhdGVkX2J5ID0gYXV0aC51aWQoKSBPUiBwdWJsaWMuaXNfb3JnX2FkbWluKG9yZ2FuaXphdGlvbl9pZCkpCiAgICApOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19hZG1pbnNfZGVsZXRlX3F1b3RlcyIgT04gcHVibGljLnF1b3RlczsKICBDUkVBVEUgUE9MSUNZICJvcmdfYWRtaW5zX2RlbGV0ZV9xdW90ZXMiCiAgICBPTiBwdWJsaWMucXVvdGVzIEZPUiBERUxFVEUgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKSk7CgogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC0tIFBBUlRFIDk6IFBPTElDSUVTIC0gUVVPVEVfSVRFTVMKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X3F1b3RlX2l0ZW1zIiBPTiBwdWJsaWMucXVvdGVfaXRlbXM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfdmlld19xdW90ZV9pdGVtcyIKICAgIE9OIHB1YmxpYy5xdW90ZV9pdGVtcyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5xdW90ZXMKICAgICAgICBXSEVSRSBpZCA9IHF1b3RlX2l0ZW1zLnF1b3RlX2lkCiAgICAgICAgICBBTkQgcHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpCiAgICAgICkKICAgICk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX21lbWJlcnNfbWFuYWdlX3F1b3RlX2l0ZW1zIiBPTiBwdWJsaWMucXVvdGVfaXRlbXM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfbWFuYWdlX3F1b3RlX2l0ZW1zIgogICAgT04gcHVibGljLnF1b3RlX2l0ZW1zIEZPUiBBTEwgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKAogICAgICBFWElTVFMgKAogICAgICAgIFNFTEVDVCAxIEZST00gcHVibGljLnF1b3RlcwogICAgICAgIFdIRVJFIGlkID0gcXVvdGVfaXRlbXMucXVvdGVfaWQKICAgICAgICAgIEFORCAoY3JlYXRlZF9ieSA9IGF1dGgudWlkKCkgT1IgcHVibGljLmlzX29yZ19hZG1pbihvcmdhbml6YXRpb25faWQpKQogICAgICApCiAgICApCiAgICBXSVRIIENIRUNLICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5xdW90ZXMKICAgICAgICBXSEVSRSBpZCA9IHF1b3RlX2l0ZW1zLnF1b3RlX2lkCiAgICAgICAgICBBTkQgcHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpCiAgICAgICkKICAgICk7CgogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC0tIFBBUlRFIDEwOiBQT0xJQ0lFUyAtIE9SREVSUwogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX3ZpZXdfb3JkZXJzIiBPTiBwdWJsaWMub3JkZXJzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3ZpZXdfb3JkZXJzIgogICAgT04gcHVibGljLm9yZGVycyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkpOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX2NyZWF0ZV9vcmRlcnMiIE9OIHB1YmxpYy5vcmRlcnM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfY3JlYXRlX29yZGVycyIKICAgIE9OIHB1YmxpYy5vcmRlcnMgRk9SIElOU0VSVCBUTyBhdXRoZW50aWNhdGVkCiAgICBXSVRIIENIRUNLIChwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkpOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX3VwZGF0ZV9vd25fb3JkZXJzIiBPTiBwdWJsaWMub3JkZXJzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3VwZGF0ZV9vd25fb3JkZXJzIgogICAgT04gcHVibGljLm9yZGVycyBGT1IgVVBEQVRFIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HICgKICAgICAgcHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpCiAgICAgIEFORCAoY3JlYXRlZF9ieSA9IGF1dGgudWlkKCkgT1IgcHVibGljLmlzX29yZ19hZG1pbihvcmdhbml6YXRpb25faWQpKQogICAgKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX2RlbGV0ZV9vcmRlcnMiIE9OIHB1YmxpYy5vcmRlcnM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX2FkbWluc19kZWxldGVfb3JkZXJzIgogICAgT04gcHVibGljLm9yZGVycyBGT1IgREVMRVRFIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChwdWJsaWMuaXNfb3JnX293bmVyX29yX2FkbWluKG9yZ2FuaXphdGlvbl9pZCkpOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAxMTogUE9MSUNJRVMgLSBPUkRFUl9JVEVNUwogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX3ZpZXdfb3JkZXJfaXRlbXMiIE9OIHB1YmxpYy5vcmRlcl9pdGVtczsKICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc192aWV3X29yZGVyX2l0ZW1zIgogICAgT04gcHVibGljLm9yZGVyX2l0ZW1zIEZPUiBTRUxFQ1QgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKAogICAgICBFWElTVFMgKAogICAgICAgIFNFTEVDVCAxIEZST00gcHVibGljLm9yZGVycwogICAgICAgIFdIRVJFIGlkID0gb3JkZXJfaXRlbXMub3JkZXJfaWQKICAgICAgICAgIEFORCBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgKQogICAgKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc19tYW5hZ2Vfb3JkZXJfaXRlbXMiIE9OIHB1YmxpYy5vcmRlcl9pdGVtczsKICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc19tYW5hZ2Vfb3JkZXJfaXRlbXMiCiAgICBPTiBwdWJsaWMub3JkZXJfaXRlbXMgRk9SIEFMTCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAoCiAgICAgIEVYSVNUUyAoCiAgICAgICAgU0VMRUNUIDEgRlJPTSBwdWJsaWMub3JkZXJzCiAgICAgICAgV0hFUkUgaWQgPSBvcmRlcl9pdGVtcy5vcmRlcl9pZAogICAgICAgICAgQU5EIChjcmVhdGVkX2J5ID0gYXV0aC51aWQoKSBPUiBwdWJsaWMuaXNfb3JnX2FkbWluKG9yZ2FuaXphdGlvbl9pZCkpCiAgICAgICkKICAgICkKICAgIFdJVEggQ0hFQ0sgKAogICAgICBFWElTVFMgKAogICAgICAgIFNFTEVDVCAxIEZST00gcHVibGljLm9yZGVycwogICAgICAgIFdIRVJFIGlkID0gb3JkZXJfaXRlbXMub3JkZXJfaWQKICAgICAgICAgIEFORCBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgKQogICAgKTsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgMTI6IFBPTElDSUVTIC0gUEFZTUVOVFMgKGd1YXJkZWQ6IHRhYmxlIG1heSBub3QgZXhpc3QgeWV0KQogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBJRiBFWElTVFMgKFNFTEVDVCAxIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9zY2hlbWE9J3B1YmxpYycgQU5EIHRhYmxlX25hbWU9J3BheW1lbnRzJykgVEhFTgogICAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X3BheW1lbnRzIiBPTiBwdWJsaWMucGF5bWVudHM7CiAgICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc192aWV3X3BheW1lbnRzIgogICAgICBPTiBwdWJsaWMucGF5bWVudHMgRk9SIFNFTEVDVCBUTyBhdXRoZW50aWNhdGVkCiAgICAgIFVTSU5HICgKICAgICAgICBFWElTVFMgKAogICAgICAgICAgU0VMRUNUIDEgRlJPTSBwdWJsaWMub3JkZXJzCiAgICAgICAgICBXSEVSRSBpZCA9IHBheW1lbnRzLm9yZGVyX2lkCiAgICAgICAgICAgIEFORCBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgICApCiAgICAgICk7CgogICAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX21hbmFnZV9wYXltZW50cyIgT04gcHVibGljLnBheW1lbnRzOwogICAgQ1JFQVRFIFBPTElDWSAib3JnX2FkbWluc19tYW5hZ2VfcGF5bWVudHMiCiAgICAgIE9OIHB1YmxpYy5wYXltZW50cyBGT1IgQUxMIFRPIGF1dGhlbnRpY2F0ZWQKICAgICAgVVNJTkcgKAogICAgICAgIEVYSVNUUyAoCiAgICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5vcmRlcnMKICAgICAgICAgIFdIRVJFIGlkID0gcGF5bWVudHMub3JkZXJfaWQKICAgICAgICAgICAgQU5EIHB1YmxpYy5pc19vcmdfYWRtaW4ob3JnYW5pemF0aW9uX2lkKQogICAgICAgICkKICAgICAgKQogICAgICBXSVRIIENIRUNLICgKICAgICAgICBFWElTVFMgKAogICAgICAgICAgU0VMRUNUIDEgRlJPTSBwdWJsaWMub3JkZXJzCiAgICAgICAgICBXSEVSRSBpZCA9IHBheW1lbnRzLm9yZGVyX2lkCiAgICAgICAgICAgIEFORCBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgICApCiAgICAgICk7CiAgRU5EIElGOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAxMzogUE9MSUNJRVMgLSBCSVRSSVhfQ0xJRU5UUwogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX3ZpZXdfY2xpZW50cyIgT04gcHVibGljLmJpdHJpeF9jbGllbnRzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3ZpZXdfY2xpZW50cyIKICAgIE9OIHB1YmxpYy5iaXRyaXhfY2xpZW50cyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkpOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19hZG1pbnNfbWFuYWdlX2NsaWVudHMiIE9OIHB1YmxpYy5iaXRyaXhfY2xpZW50czsKICBDUkVBVEUgUE9MSUNZICJvcmdfYWRtaW5zX21hbmFnZV9jbGllbnRzIgogICAgT04gcHVibGljLmJpdHJpeF9jbGllbnRzIEZPUiBBTEwgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKSkKICAgIFdJVEggQ0hFQ0sgKHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKSk7CgogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC0tIFBBUlRFIDE0OiBQT0xJQ0lFUyAtIE1PQ0tVUFMKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X21vY2t1cF9qb2JzIiBPTiBwdWJsaWMubW9ja3VwX2dlbmVyYXRpb25fam9iczsKICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc192aWV3X21vY2t1cF9qb2JzIgogICAgT04gcHVibGljLm1vY2t1cF9nZW5lcmF0aW9uX2pvYnMgRk9SIFNFTEVDVCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc19jcmVhdGVfbW9ja3VwX2pvYnMiIE9OIHB1YmxpYy5tb2NrdXBfZ2VuZXJhdGlvbl9qb2JzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX2NyZWF0ZV9tb2NrdXBfam9icyIKICAgIE9OIHB1YmxpYy5tb2NrdXBfZ2VuZXJhdGlvbl9qb2JzIEZPUiBJTlNFUlQgVE8gYXV0aGVudGljYXRlZAogICAgV0lUSCBDSEVDSyAocHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X2dlbmVyYXRlZF9tb2NrdXBzIiBPTiBwdWJsaWMuZ2VuZXJhdGVkX21vY2t1cHM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfdmlld19nZW5lcmF0ZWRfbW9ja3VwcyIKICAgIE9OIHB1YmxpYy5nZW5lcmF0ZWRfbW9ja3VwcyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5tb2NrdXBfZ2VuZXJhdGlvbl9qb2JzCiAgICAgICAgV0hFUkUgaWQgPSBnZW5lcmF0ZWRfbW9ja3Vwcy5qb2JfaWQKICAgICAgICAgIEFORCBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgKQogICAgKTsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgMTU6IFBPTElDSUVTIC0gQ09MTEVDVElPTlMKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X2NvbGxlY3Rpb25zIiBPTiBwdWJsaWMuY29sbGVjdGlvbnM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfdmlld19jb2xsZWN0aW9ucyIKICAgIE9OIHB1YmxpYy5jb2xsZWN0aW9ucyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkpOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19hZG1pbnNfbWFuYWdlX2NvbGxlY3Rpb25zIiBPTiBwdWJsaWMuY29sbGVjdGlvbnM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX2FkbWluc19tYW5hZ2VfY29sbGVjdGlvbnMiCiAgICBPTiBwdWJsaWMuY29sbGVjdGlvbnMgRk9SIEFMTCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKQogICAgV0lUSCBDSEVDSyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKTsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgMTY6IFBPTElDSUVTIC0gUEVSU09OQUxJWkFUSU9OX1RFQ0hOSVFVRVMgKEdMT0JBTCkKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJhbnlvbmVfdmlld190ZWNobmlxdWVzIiBPTiBwdWJsaWMucGVyc29uYWxpemF0aW9uX3RlY2huaXF1ZXM7CiAgQ1JFQVRFIFBPTElDWSAiYW55b25lX3ZpZXdfdGVjaG5pcXVlcyIKICAgIE9OIHB1YmxpYy5wZXJzb25hbGl6YXRpb25fdGVjaG5pcXVlcyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChpc19hY3RpdmUgPSB0cnVlKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJhZG1pbnNfbWFuYWdlX3RlY2huaXF1ZXMiIE9OIHB1YmxpYy5wZXJzb25hbGl6YXRpb25fdGVjaG5pcXVlczsKICBDUkVBVEUgUE9MSUNZICJhZG1pbnNfbWFuYWdlX3RlY2huaXF1ZXMiCiAgICBPTiBwdWJsaWMucGVyc29uYWxpemF0aW9uX3RlY2huaXF1ZXMgRk9SIEFMTCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAoCiAgICAgIEVYSVNUUyAoCiAgICAgICAgU0VMRUNUIDEgRlJPTSBwdWJsaWMudXNlcl9vcmdhbml6YXRpb25zCiAgICAgICAgV0hFUkUgdXNlcl9pZCA9IGF1dGgudWlkKCkKICAgICAgICAgIEFORCByb2xlIElOICgnb3duZXInLCAnYWRtaW4nKQogICAgICApCiAgICApOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAxNzogUE9MSUNJRVMgLSBOT1RJRklDQVRJT05TIChVU0VSLVNDT1BFRCkKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJ1c2Vyc192aWV3X293bl9ub3RpZmljYXRpb25zIiBPTiBwdWJsaWMubm90aWZpY2F0aW9uczsKICBDUkVBVEUgUE9MSUNZICJ1c2Vyc192aWV3X293bl9ub3RpZmljYXRpb25zIgogICAgT04gcHVibGljLm5vdGlmaWNhdGlvbnMgRk9SIFNFTEVDVCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAodXNlcl9pZCA9IGF1dGgudWlkKCkpOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgInVzZXJzX3VwZGF0ZV9vd25fbm90aWZpY2F0aW9ucyIgT04gcHVibGljLm5vdGlmaWNhdGlvbnM7CiAgQ1JFQVRFIFBPTElDWSAidXNlcnNfdXBkYXRlX293bl9ub3RpZmljYXRpb25zIgogICAgT04gcHVibGljLm5vdGlmaWNhdGlvbnMgRk9SIFVQREFURSBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAodXNlcl9pZCA9IGF1dGgudWlkKCkpOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAxODogUE9MSUNJRVMgLSBTWVNURU0gVEFCTEVTIChBRE1JTiBPTkxZKQogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgImFkbWluc192aWV3X2ZlYXR1cmVfZmxhZ3MiIE9OIHB1YmxpYy5mZWF0dXJlX2ZsYWdzOwogIENSRUFURSBQT0xJQ1kgImFkbWluc192aWV3X2ZlYXR1cmVfZmxhZ3MiCiAgICBPTiBwdWJsaWMuZmVhdHVyZV9mbGFncyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy51c2VyX29yZ2FuaXphdGlvbnMKICAgICAgICBXSEVSRSB1c2VyX2lkID0gYXV0aC51aWQoKQogICAgICAgICAgQU5EIHJvbGUgSU4gKCdvd25lcicsICdhZG1pbicpCiAgICAgICkKICAgICk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAiYWRtaW5zX21hbmFnZV9zeXN0ZW1fc2V0dGluZ3MiIE9OIHB1YmxpYy5zeXN0ZW1fc2V0dGluZ3M7CiAgQ1JFQVRFIFBPTElDWSAiYWRtaW5zX21hbmFnZV9zeXN0ZW1fc2V0dGluZ3MiCiAgICBPTiBwdWJsaWMuc3lzdGVtX3NldHRpbmdzIEZPUiBBTEwgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKAogICAgICBFWElTVFMgKAogICAgICAgIFNFTEVDVCAxIEZST00gcHVibGljLnVzZXJfb3JnYW5pemF0aW9ucwogICAgICAgIFdIRVJFIHVzZXJfaWQgPSBhdXRoLnVpZCgpCiAgICAgICAgICBBTkQgcm9sZSBJTiAoJ293bmVyJywgJ2FkbWluJykKICAgICAgKQogICAgKTsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgMTk6IEdSQU5UUwogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBHUkFOVCBTRUxFQ1QgT04gcHVibGljLmNhdGVnb3JpZXMgVE8gYXV0aGVudGljYXRlZDsKICBHUkFOVCBTRUxFQ1QgT04gcHVibGljLnN1cHBsaWVycyBUTyBhdXRoZW50aWNhdGVkOwogIEdSQU5UIFNFTEVDVCBPTiBwdWJsaWMucHJvZHVjdHMgVE8gYXV0aGVudGljYXRlZDsKICBHUkFOVCBTRUxFQ1QgT04gcHVibGljLnF1b3RlcyBUTyBhdXRoZW50aWNhdGVkOwogIEdSQU5UIFNFTEVDVCBPTiBwdWJsaWMub3JkZXJzIFRPIGF1dGhlbnRpY2F0ZWQ7CiAgSUYgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hPSdwdWJsaWMnIEFORCB0YWJsZV9uYW1lPSdwYXltZW50cycpIFRIRU4KICAgIEdSQU5UIFNFTEVDVCBPTiBwdWJsaWMucGF5bWVudHMgVE8gYXV0aGVudGljYXRlZDsKICBFTkQgSUY7CgogIFJBSVNFIE5PVElDRSAnTWlncmF0aW9uIDIwMjUwMTAzXzAyX3Jsc19vcmdhbml6YXRpb25zIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5Lic7CkVORCAkb3V0ZXIkOwo" (SQLSTATE 42601)
At statement: 0
LS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIEdJRlRTIFNUT1JFIC0gUkxTIENPTSBPUkdBTklaQVRJT05TIChNVUxUSS1URU5BTlQpCi0tIEFwbGljYSBSb3cgTGV2ZWwgU2VjdXJpdHkgYmFzZWFkbyBlbSBPcmdhbml6YXRpb25zCi0tIERhdGE6IDAzLzAxLzIwMjUKLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIEd1YXJkOiB0aGlzIGVudGlyZSBtaWdyYXRpb24gaXMgd3JhcHBlZCBpbiBhIERPIGJsb2NrIHNvIGl0Ci0tIGV4aXRzIGNsZWFubHkgd2hlbiBwdWJsaWMub3JnYW5pemF0aW9ucyBkb2Vzbid0IGV4aXN0IHlldC4KLS0gT24gYSBmcmVzaCBTdXBhYmFzZSBQcmV2aWV3IEJyYW5jaCB0aGF0IHJlcGxheXMgYWxsIG1pZ3JhdGlvbnMKLS0gZnJvbSBzY3JhdGNoLCBvcmdhbml6YXRpb25zIGlzIGNyZWF0ZWQgbGF0ZXIgaW4gdGhlIHNlcXVlbmNlLgotLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkRPICRvdXRlciQKQkVHSU4KICBJRiBOT1QgRVhJU1RTICgKICAgIFNFTEVDVCAxIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcwogICAgV0hFUkUgdGFibGVfc2NoZW1hID0gJ3B1YmxpYycgQU5EIHRhYmxlX25hbWUgPSAnb3JnYW5pemF0aW9ucycKICApIFRIRU4KICAgIFJBSVNFIE5PVElDRSAnTWlncmF0aW9uIDIwMjUwMTAzXzAyX3Jsc19vcmdhbml6YXRpb25zIHNraXBwZWQ6IHB1YmxpYy5vcmdhbml6YXRpb25zIGRvZXMgbm90IGV4aXN0IHlldC4nOwogICAgUkVUVVJOOwogIEVORCBJRjsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgMTogQURJQ0lPTkFSIG9yZ2FuaXphdGlvbl9pZCBOQVMgVEFCRUxBUyBQUklOQ0lQQUlTCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5jYXRlZ29yaWVzCiAgICBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgb3JnYW5pemF0aW9uX2lkIFVVSUQgUkVGRVJFTkNFUyBwdWJsaWMub3JnYW5pemF0aW9ucyhpZCkgT04gREVMRVRFIENBU0NBREU7CiAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NhdGVnb3JpZXNfb3JnIE9OIHB1YmxpYy5jYXRlZ29yaWVzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5zdXBwbGllcnMKICAgIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBvcmdhbml6YXRpb25faWQgVVVJRCBSRUZFUkVOQ0VTIHB1YmxpYy5vcmdhbml6YXRpb25zKGlkKSBPTiBERUxFVEUgQ0FTQ0FERTsKICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfc3VwcGxpZXJzX29yZyBPTiBwdWJsaWMuc3VwcGxpZXJzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5wcm9kdWN0cwogICAgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIG9yZ2FuaXphdGlvbl9pZCBVVUlEIFJFRkVSRU5DRVMgcHVibGljLm9yZ2FuaXphdGlvbnMoaWQpIE9OIERFTEVURSBDQVNDQURFOwogIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9wcm9kdWN0c19vcmcgT04gcHVibGljLnByb2R1Y3RzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5xdW90ZXMKICAgIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBvcmdhbml6YXRpb25faWQgVVVJRCBSRUZFUkVOQ0VTIHB1YmxpYy5vcmdhbml6YXRpb25zKGlkKSBPTiBERUxFVEUgQ0FTQ0FERTsKICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfcXVvdGVzX29yZyBPTiBwdWJsaWMucXVvdGVzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5vcmRlcnMKICAgIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBvcmdhbml6YXRpb25faWQgVVVJRCBSRUZFUkVOQ0VTIHB1YmxpYy5vcmdhbml6YXRpb25zKGlkKSBPTiBERUxFVEUgQ0FTQ0FERTsKICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfb3JkZXJzX29yZyBPTiBwdWJsaWMub3JkZXJzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5iaXRyaXhfY2xpZW50cwogICAgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIG9yZ2FuaXphdGlvbl9pZCBVVUlEIFJFRkVSRU5DRVMgcHVibGljLm9yZ2FuaXphdGlvbnMoaWQpIE9OIERFTEVURSBDQVNDQURFOwogIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9iaXRyaXhfY2xpZW50c19vcmcgT04gcHVibGljLmJpdHJpeF9jbGllbnRzKG9yZ2FuaXphdGlvbl9pZCk7CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5tb2NrdXBfZ2VuZXJhdGlvbl9qb2JzCiAgICBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgb3JnYW5pemF0aW9uX2lkIFVVSUQgUkVGRVJFTkNFUyBwdWJsaWMub3JnYW5pemF0aW9ucyhpZCkgT04gREVMRVRFIENBU0NBREU7CiAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X21vY2t1cF9qb2JzX29yZyBPTiBwdWJsaWMubW9ja3VwX2dlbmVyYXRpb25fam9icyhvcmdhbml6YXRpb25faWQpOwoKICBBTFRFUiBUQUJMRSBwdWJsaWMuY29sbGVjdGlvbnMKICAgIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBvcmdhbml6YXRpb25faWQgVVVJRCBSRUZFUkVOQ0VTIHB1YmxpYy5vcmdhbml6YXRpb25zKGlkKSBPTiBERUxFVEUgQ0FTQ0FERTsKICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY29sbGVjdGlvbnNfb3JnIE9OIHB1YmxpYy5jb2xsZWN0aW9ucyhvcmdhbml6YXRpb25faWQpOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAyOiBGVU7Dh8ODTyBIRUxQRVIgLSBWZXJpZmljYXIgc2UgdXNlciBwZXJ0ZW5jZSDDoCBvcmcKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gcHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdfaWQgVVVJRCkKICBSRVRVUk5TIEJPT0xFQU4gQVMgJGZuJAogIEJFR0lOCiAgICBSRVRVUk4gRVhJU1RTICgKICAgICAgU0VMRUNUIDEKICAgICAgRlJPTSBwdWJsaWMudXNlcl9vcmdhbml6YXRpb25zCiAgICAgIFdIRVJFIG9yZ2FuaXphdGlvbl9pZCA9IG9yZ19pZAogICAgICAgIEFORCB1c2VyX2lkID0gYXV0aC51aWQoKQogICAgKTsKICBFTkQ7CiAgJGZuJCBMQU5HVUFHRSBwbHBnc3FsIFNFQ1VSSVRZIERFRklORVIgU1RBQkxFOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAzOiBBUExJQ0FSIFJMUyBFTSBUT0RBUyBBUyBUQUJFTEFTCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEFMVEVSIFRBQkxFIHB1YmxpYy5jYXRlZ29yaWVzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLnN1cHBsaWVycyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5wcm9kdWN0cyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5wcm9kdWN0X3ZhcmlhbnRzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLnF1b3RlcyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5xdW90ZV9pdGVtcyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5vcmRlcnMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKICBBTFRFUiBUQUJMRSBwdWJsaWMub3JkZXJfaXRlbXMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKICBJRiBFWElTVFMgKFNFTEVDVCAxIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9zY2hlbWE9J3B1YmxpYycgQU5EIHRhYmxlX25hbWU9J3BheW1lbnRzJykgVEhFTgogICAgQUxURVIgVEFCTEUgcHVibGljLnBheW1lbnRzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgRU5EIElGOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5iaXRyaXhfY2xpZW50cyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5tb2NrdXBfZ2VuZXJhdGlvbl9qb2JzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLmdlbmVyYXRlZF9tb2NrdXBzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLmNvbGxlY3Rpb25zIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLmNvbGxlY3Rpb25fcHJvZHVjdHMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKICBBTFRFUiBUQUJMRSBwdWJsaWMucGVyc29uYWxpemF0aW9uX3RlY2huaXF1ZXMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKICBBTFRFUiBUQUJMRSBwdWJsaWMubm90aWZpY2F0aW9ucyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwogIEFMVEVSIFRBQkxFIHB1YmxpYy5mZWF0dXJlX2ZsYWdzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CiAgQUxURVIgVEFCTEUgcHVibGljLnN5c3RlbV9zZXR0aW5ncyBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSA0OiBQT0xJQ0lFUyAtIENBVEVHT1JJRVMKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X2NhdGVnb3JpZXMiIE9OIHB1YmxpYy5jYXRlZ29yaWVzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3ZpZXdfY2F0ZWdvcmllcyIKICAgIE9OIHB1YmxpYy5jYXRlZ29yaWVzIEZPUiBTRUxFQ1QgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKHB1YmxpYy51c2VyX2lzX29yZ19tZW1iZXIob3JnYW5pemF0aW9uX2lkKSk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX2FkbWluc19jcmVhdGVfY2F0ZWdvcmllcyIgT04gcHVibGljLmNhdGVnb3JpZXM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX2FkbWluc19jcmVhdGVfY2F0ZWdvcmllcyIKICAgIE9OIHB1YmxpYy5jYXRlZ29yaWVzIEZPUiBJTlNFUlQgVE8gYXV0aGVudGljYXRlZAogICAgV0lUSCBDSEVDSyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX3VwZGF0ZV9jYXRlZ29yaWVzIiBPTiBwdWJsaWMuY2F0ZWdvcmllczsKICBDUkVBVEUgUE9MSUNZICJvcmdfYWRtaW5zX3VwZGF0ZV9jYXRlZ29yaWVzIgogICAgT04gcHVibGljLmNhdGVnb3JpZXMgRk9SIFVQREFURSBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKQogICAgV0lUSCBDSEVDSyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX2RlbGV0ZV9jYXRlZ29yaWVzIiBPTiBwdWJsaWMuY2F0ZWdvcmllczsKICBDUkVBVEUgUE9MSUNZICJvcmdfYWRtaW5zX2RlbGV0ZV9jYXRlZ29yaWVzIgogICAgT04gcHVibGljLmNhdGVnb3JpZXMgRk9SIERFTEVURSBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKTsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgNTogUE9MSUNJRVMgLSBTVVBQTElFUlMKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X3N1cHBsaWVycyIgT04gcHVibGljLnN1cHBsaWVyczsKICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc192aWV3X3N1cHBsaWVycyIKICAgIE9OIHB1YmxpYy5zdXBwbGllcnMgRk9SIFNFTEVDVCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX21hbmFnZV9zdXBwbGllcnMiIE9OIHB1YmxpYy5zdXBwbGllcnM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX2FkbWluc19tYW5hZ2Vfc3VwcGxpZXJzIgogICAgT04gcHVibGljLnN1cHBsaWVycyBGT1IgQUxMIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChwdWJsaWMuaXNfb3JnX293bmVyX29yX2FkbWluKG9yZ2FuaXphdGlvbl9pZCkpCiAgICBXSVRIIENIRUNLIChwdWJsaWMuaXNfb3JnX293bmVyX29yX2FkbWluKG9yZ2FuaXphdGlvbl9pZCkpOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSA2OiBQT0xJQ0lFUyAtIFBST0RVQ1RTCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX21lbWJlcnNfdmlld19wcm9kdWN0cyIgT04gcHVibGljLnByb2R1Y3RzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3ZpZXdfcHJvZHVjdHMiCiAgICBPTiBwdWJsaWMucHJvZHVjdHMgRk9SIFNFTEVDVCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX21hbmFnZV9wcm9kdWN0cyIgT04gcHVibGljLnByb2R1Y3RzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19hZG1pbnNfbWFuYWdlX3Byb2R1Y3RzIgogICAgT04gcHVibGljLnByb2R1Y3RzIEZPUiBBTEwgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKSkKICAgIFdJVEggQ0hFQ0sgKHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKSk7CgogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC0tIFBBUlRFIDc6IFBPTElDSUVTIC0gUFJPRFVDVF9WQVJJQU5UUwogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX3ZpZXdfdmFyaWFudHMiIE9OIHB1YmxpYy5wcm9kdWN0X3ZhcmlhbnRzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3ZpZXdfdmFyaWFudHMiCiAgICBPTiBwdWJsaWMucHJvZHVjdF92YXJpYW50cyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5wcm9kdWN0cwogICAgICAgIFdIRVJFIGlkID0gcHJvZHVjdF92YXJpYW50cy5wcm9kdWN0X2lkCiAgICAgICAgICBBTkQgcHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpCiAgICAgICkKICAgICk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX2FkbWluc19tYW5hZ2VfdmFyaWFudHMiIE9OIHB1YmxpYy5wcm9kdWN0X3ZhcmlhbnRzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19hZG1pbnNfbWFuYWdlX3ZhcmlhbnRzIgogICAgT04gcHVibGljLnByb2R1Y3RfdmFyaWFudHMgRk9SIEFMTCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAoCiAgICAgIEVYSVNUUyAoCiAgICAgICAgU0VMRUNUIDEgRlJPTSBwdWJsaWMucHJvZHVjdHMKICAgICAgICBXSEVSRSBpZCA9IHByb2R1Y3RfdmFyaWFudHMucHJvZHVjdF9pZAogICAgICAgICAgQU5EIHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKQogICAgICApCiAgICApCiAgICBXSVRIIENIRUNLICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5wcm9kdWN0cwogICAgICAgIFdIRVJFIGlkID0gcHJvZHVjdF92YXJpYW50cy5wcm9kdWN0X2lkCiAgICAgICAgICBBTkQgcHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpCiAgICAgICkKICAgICk7CgogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC0tIFBBUlRFIDg6IFBPTElDSUVTIC0gUVVPVEVTCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX21lbWJlcnNfdmlld19xdW90ZXMiIE9OIHB1YmxpYy5xdW90ZXM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfdmlld19xdW90ZXMiCiAgICBPTiBwdWJsaWMucXVvdGVzIEZPUiBTRUxFQ1QgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKHB1YmxpYy51c2VyX2lzX29yZ19tZW1iZXIob3JnYW5pemF0aW9uX2lkKSk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX21lbWJlcnNfY3JlYXRlX3F1b3RlcyIgT04gcHVibGljLnF1b3RlczsKICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc19jcmVhdGVfcXVvdGVzIgogICAgT04gcHVibGljLnF1b3RlcyBGT1IgSU5TRVJUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFdJVEggQ0hFQ0sgKHB1YmxpYy51c2VyX2lzX29yZ19tZW1iZXIob3JnYW5pemF0aW9uX2lkKSk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX21lbWJlcnNfdXBkYXRlX293bl9xdW90ZXMiIE9OIHB1YmxpYy5xdW90ZXM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfdXBkYXRlX293bl9xdW90ZXMiCiAgICBPTiBwdWJsaWMucXVvdGVzIEZPUiBVUERBVEUgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKAogICAgICBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgQU5EIChjcmVhdGVkX2J5ID0gYXV0aC51aWQoKSBPUiBwdWJsaWMuaXNfb3JnX2FkbWluKG9yZ2FuaXphdGlvbl9pZCkpCiAgICApOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19hZG1pbnNfZGVsZXRlX3F1b3RlcyIgT04gcHVibGljLnF1b3RlczsKICBDUkVBVEUgUE9MSUNZICJvcmdfYWRtaW5zX2RlbGV0ZV9xdW90ZXMiCiAgICBPTiBwdWJsaWMucXVvdGVzIEZPUiBERUxFVEUgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKSk7CgogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC0tIFBBUlRFIDk6IFBPTElDSUVTIC0gUVVPVEVfSVRFTVMKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X3F1b3RlX2l0ZW1zIiBPTiBwdWJsaWMucXVvdGVfaXRlbXM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfdmlld19xdW90ZV9pdGVtcyIKICAgIE9OIHB1YmxpYy5xdW90ZV9pdGVtcyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5xdW90ZXMKICAgICAgICBXSEVSRSBpZCA9IHF1b3RlX2l0ZW1zLnF1b3RlX2lkCiAgICAgICAgICBBTkQgcHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpCiAgICAgICkKICAgICk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAib3JnX21lbWJlcnNfbWFuYWdlX3F1b3RlX2l0ZW1zIiBPTiBwdWJsaWMucXVvdGVfaXRlbXM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfbWFuYWdlX3F1b3RlX2l0ZW1zIgogICAgT04gcHVibGljLnF1b3RlX2l0ZW1zIEZPUiBBTEwgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKAogICAgICBFWElTVFMgKAogICAgICAgIFNFTEVDVCAxIEZST00gcHVibGljLnF1b3RlcwogICAgICAgIFdIRVJFIGlkID0gcXVvdGVfaXRlbXMucXVvdGVfaWQKICAgICAgICAgIEFORCAoY3JlYXRlZF9ieSA9IGF1dGgudWlkKCkgT1IgcHVibGljLmlzX29yZ19hZG1pbihvcmdhbml6YXRpb25faWQpKQogICAgICApCiAgICApCiAgICBXSVRIIENIRUNLICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5xdW90ZXMKICAgICAgICBXSEVSRSBpZCA9IHF1b3RlX2l0ZW1zLnF1b3RlX2lkCiAgICAgICAgICBBTkQgcHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpCiAgICAgICkKICAgICk7CgogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC0tIFBBUlRFIDEwOiBQT0xJQ0lFUyAtIE9SREVSUwogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX3ZpZXdfb3JkZXJzIiBPTiBwdWJsaWMub3JkZXJzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3ZpZXdfb3JkZXJzIgogICAgT04gcHVibGljLm9yZGVycyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkpOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX2NyZWF0ZV9vcmRlcnMiIE9OIHB1YmxpYy5vcmRlcnM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfY3JlYXRlX29yZGVycyIKICAgIE9OIHB1YmxpYy5vcmRlcnMgRk9SIElOU0VSVCBUTyBhdXRoZW50aWNhdGVkCiAgICBXSVRIIENIRUNLIChwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkpOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX3VwZGF0ZV9vd25fb3JkZXJzIiBPTiBwdWJsaWMub3JkZXJzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3VwZGF0ZV9vd25fb3JkZXJzIgogICAgT04gcHVibGljLm9yZGVycyBGT1IgVVBEQVRFIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HICgKICAgICAgcHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpCiAgICAgIEFORCAoY3JlYXRlZF9ieSA9IGF1dGgudWlkKCkgT1IgcHVibGljLmlzX29yZ19hZG1pbihvcmdhbml6YXRpb25faWQpKQogICAgKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX2RlbGV0ZV9vcmRlcnMiIE9OIHB1YmxpYy5vcmRlcnM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX2FkbWluc19kZWxldGVfb3JkZXJzIgogICAgT04gcHVibGljLm9yZGVycyBGT1IgREVMRVRFIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChwdWJsaWMuaXNfb3JnX293bmVyX29yX2FkbWluKG9yZ2FuaXphdGlvbl9pZCkpOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAxMTogUE9MSUNJRVMgLSBPUkRFUl9JVEVNUwogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX3ZpZXdfb3JkZXJfaXRlbXMiIE9OIHB1YmxpYy5vcmRlcl9pdGVtczsKICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc192aWV3X29yZGVyX2l0ZW1zIgogICAgT04gcHVibGljLm9yZGVyX2l0ZW1zIEZPUiBTRUxFQ1QgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKAogICAgICBFWElTVFMgKAogICAgICAgIFNFTEVDVCAxIEZST00gcHVibGljLm9yZGVycwogICAgICAgIFdIRVJFIGlkID0gb3JkZXJfaXRlbXMub3JkZXJfaWQKICAgICAgICAgIEFORCBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgKQogICAgKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc19tYW5hZ2Vfb3JkZXJfaXRlbXMiIE9OIHB1YmxpYy5vcmRlcl9pdGVtczsKICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc19tYW5hZ2Vfb3JkZXJfaXRlbXMiCiAgICBPTiBwdWJsaWMub3JkZXJfaXRlbXMgRk9SIEFMTCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAoCiAgICAgIEVYSVNUUyAoCiAgICAgICAgU0VMRUNUIDEgRlJPTSBwdWJsaWMub3JkZXJzCiAgICAgICAgV0hFUkUgaWQgPSBvcmRlcl9pdGVtcy5vcmRlcl9pZAogICAgICAgICAgQU5EIChjcmVhdGVkX2J5ID0gYXV0aC51aWQoKSBPUiBwdWJsaWMuaXNfb3JnX2FkbWluKG9yZ2FuaXphdGlvbl9pZCkpCiAgICAgICkKICAgICkKICAgIFdJVEggQ0hFQ0sgKAogICAgICBFWElTVFMgKAogICAgICAgIFNFTEVDVCAxIEZST00gcHVibGljLm9yZGVycwogICAgICAgIFdIRVJFIGlkID0gb3JkZXJfaXRlbXMub3JkZXJfaWQKICAgICAgICAgIEFORCBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgKQogICAgKTsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgMTI6IFBPTElDSUVTIC0gUEFZTUVOVFMgKGd1YXJkZWQ6IHRhYmxlIG1heSBub3QgZXhpc3QgeWV0KQogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBJRiBFWElTVFMgKFNFTEVDVCAxIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9zY2hlbWE9J3B1YmxpYycgQU5EIHRhYmxlX25hbWU9J3BheW1lbnRzJykgVEhFTgogICAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X3BheW1lbnRzIiBPTiBwdWJsaWMucGF5bWVudHM7CiAgICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc192aWV3X3BheW1lbnRzIgogICAgICBPTiBwdWJsaWMucGF5bWVudHMgRk9SIFNFTEVDVCBUTyBhdXRoZW50aWNhdGVkCiAgICAgIFVTSU5HICgKICAgICAgICBFWElTVFMgKAogICAgICAgICAgU0VMRUNUIDEgRlJPTSBwdWJsaWMub3JkZXJzCiAgICAgICAgICBXSEVSRSBpZCA9IHBheW1lbnRzLm9yZGVyX2lkCiAgICAgICAgICAgIEFORCBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgICApCiAgICAgICk7CgogICAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfYWRtaW5zX21hbmFnZV9wYXltZW50cyIgT04gcHVibGljLnBheW1lbnRzOwogICAgQ1JFQVRFIFBPTElDWSAib3JnX2FkbWluc19tYW5hZ2VfcGF5bWVudHMiCiAgICAgIE9OIHB1YmxpYy5wYXltZW50cyBGT1IgQUxMIFRPIGF1dGhlbnRpY2F0ZWQKICAgICAgVVNJTkcgKAogICAgICAgIEVYSVNUUyAoCiAgICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5vcmRlcnMKICAgICAgICAgIFdIRVJFIGlkID0gcGF5bWVudHMub3JkZXJfaWQKICAgICAgICAgICAgQU5EIHB1YmxpYy5pc19vcmdfYWRtaW4ob3JnYW5pemF0aW9uX2lkKQogICAgICAgICkKICAgICAgKQogICAgICBXSVRIIENIRUNLICgKICAgICAgICBFWElTVFMgKAogICAgICAgICAgU0VMRUNUIDEgRlJPTSBwdWJsaWMub3JkZXJzCiAgICAgICAgICBXSEVSRSBpZCA9IHBheW1lbnRzLm9yZGVyX2lkCiAgICAgICAgICAgIEFORCBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgICApCiAgICAgICk7CiAgRU5EIElGOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAxMzogUE9MSUNJRVMgLSBCSVRSSVhfQ0xJRU5UUwogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19tZW1iZXJzX3ZpZXdfY2xpZW50cyIgT04gcHVibGljLmJpdHJpeF9jbGllbnRzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX3ZpZXdfY2xpZW50cyIKICAgIE9OIHB1YmxpYy5iaXRyaXhfY2xpZW50cyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkpOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19hZG1pbnNfbWFuYWdlX2NsaWVudHMiIE9OIHB1YmxpYy5iaXRyaXhfY2xpZW50czsKICBDUkVBVEUgUE9MSUNZICJvcmdfYWRtaW5zX21hbmFnZV9jbGllbnRzIgogICAgT04gcHVibGljLmJpdHJpeF9jbGllbnRzIEZPUiBBTEwgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKSkKICAgIFdJVEggQ0hFQ0sgKHB1YmxpYy5pc19vcmdfb3duZXJfb3JfYWRtaW4ob3JnYW5pemF0aW9uX2lkKSk7CgogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC0tIFBBUlRFIDE0OiBQT0xJQ0lFUyAtIE1PQ0tVUFMKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X21vY2t1cF9qb2JzIiBPTiBwdWJsaWMubW9ja3VwX2dlbmVyYXRpb25fam9iczsKICBDUkVBVEUgUE9MSUNZICJvcmdfbWVtYmVyc192aWV3X21vY2t1cF9qb2JzIgogICAgT04gcHVibGljLm1vY2t1cF9nZW5lcmF0aW9uX2pvYnMgRk9SIFNFTEVDVCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc19jcmVhdGVfbW9ja3VwX2pvYnMiIE9OIHB1YmxpYy5tb2NrdXBfZ2VuZXJhdGlvbl9qb2JzOwogIENSRUFURSBQT0xJQ1kgIm9yZ19tZW1iZXJzX2NyZWF0ZV9tb2NrdXBfam9icyIKICAgIE9OIHB1YmxpYy5tb2NrdXBfZ2VuZXJhdGlvbl9qb2JzIEZPUiBJTlNFUlQgVE8gYXV0aGVudGljYXRlZAogICAgV0lUSCBDSEVDSyAocHVibGljLnVzZXJfaXNfb3JnX21lbWJlcihvcmdhbml6YXRpb25faWQpKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X2dlbmVyYXRlZF9tb2NrdXBzIiBPTiBwdWJsaWMuZ2VuZXJhdGVkX21vY2t1cHM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfdmlld19nZW5lcmF0ZWRfbW9ja3VwcyIKICAgIE9OIHB1YmxpYy5nZW5lcmF0ZWRfbW9ja3VwcyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy5tb2NrdXBfZ2VuZXJhdGlvbl9qb2JzCiAgICAgICAgV0hFUkUgaWQgPSBnZW5lcmF0ZWRfbW9ja3Vwcy5qb2JfaWQKICAgICAgICAgIEFORCBwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkKICAgICAgKQogICAgKTsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgMTU6IFBPTElDSUVTIC0gQ09MTEVDVElPTlMKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJvcmdfbWVtYmVyc192aWV3X2NvbGxlY3Rpb25zIiBPTiBwdWJsaWMuY29sbGVjdGlvbnM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX21lbWJlcnNfdmlld19jb2xsZWN0aW9ucyIKICAgIE9OIHB1YmxpYy5jb2xsZWN0aW9ucyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChwdWJsaWMudXNlcl9pc19vcmdfbWVtYmVyKG9yZ2FuaXphdGlvbl9pZCkpOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgIm9yZ19hZG1pbnNfbWFuYWdlX2NvbGxlY3Rpb25zIiBPTiBwdWJsaWMuY29sbGVjdGlvbnM7CiAgQ1JFQVRFIFBPTElDWSAib3JnX2FkbWluc19tYW5hZ2VfY29sbGVjdGlvbnMiCiAgICBPTiBwdWJsaWMuY29sbGVjdGlvbnMgRk9SIEFMTCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKQogICAgV0lUSCBDSEVDSyAocHVibGljLmlzX29yZ19vd25lcl9vcl9hZG1pbihvcmdhbml6YXRpb25faWQpKTsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgMTY6IFBPTElDSUVTIC0gUEVSU09OQUxJWkFUSU9OX1RFQ0hOSVFVRVMgKEdMT0JBTCkKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJhbnlvbmVfdmlld190ZWNobmlxdWVzIiBPTiBwdWJsaWMucGVyc29uYWxpemF0aW9uX3RlY2huaXF1ZXM7CiAgQ1JFQVRFIFBPTElDWSAiYW55b25lX3ZpZXdfdGVjaG5pcXVlcyIKICAgIE9OIHB1YmxpYy5wZXJzb25hbGl6YXRpb25fdGVjaG5pcXVlcyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HIChpc19hY3RpdmUgPSB0cnVlKTsKCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJhZG1pbnNfbWFuYWdlX3RlY2huaXF1ZXMiIE9OIHB1YmxpYy5wZXJzb25hbGl6YXRpb25fdGVjaG5pcXVlczsKICBDUkVBVEUgUE9MSUNZICJhZG1pbnNfbWFuYWdlX3RlY2huaXF1ZXMiCiAgICBPTiBwdWJsaWMucGVyc29uYWxpemF0aW9uX3RlY2huaXF1ZXMgRk9SIEFMTCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAoCiAgICAgIEVYSVNUUyAoCiAgICAgICAgU0VMRUNUIDEgRlJPTSBwdWJsaWMudXNlcl9vcmdhbml6YXRpb25zCiAgICAgICAgV0hFUkUgdXNlcl9pZCA9IGF1dGgudWlkKCkKICAgICAgICAgIEFORCByb2xlIElOICgnb3duZXInLCAnYWRtaW4nKQogICAgICApCiAgICApOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAxNzogUE9MSUNJRVMgLSBOT1RJRklDQVRJT05TIChVU0VSLVNDT1BFRCkKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRFJPUCBQT0xJQ1kgSUYgRVhJU1RTICJ1c2Vyc192aWV3X293bl9ub3RpZmljYXRpb25zIiBPTiBwdWJsaWMubm90aWZpY2F0aW9uczsKICBDUkVBVEUgUE9MSUNZICJ1c2Vyc192aWV3X293bl9ub3RpZmljYXRpb25zIgogICAgT04gcHVibGljLm5vdGlmaWNhdGlvbnMgRk9SIFNFTEVDVCBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAodXNlcl9pZCA9IGF1dGgudWlkKCkpOwoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgInVzZXJzX3VwZGF0ZV9vd25fbm90aWZpY2F0aW9ucyIgT04gcHVibGljLm5vdGlmaWNhdGlvbnM7CiAgQ1JFQVRFIFBPTElDWSAidXNlcnNfdXBkYXRlX293bl9ub3RpZmljYXRpb25zIgogICAgT04gcHVibGljLm5vdGlmaWNhdGlvbnMgRk9SIFVQREFURSBUTyBhdXRoZW50aWNhdGVkCiAgICBVU0lORyAodXNlcl9pZCA9IGF1dGgudWlkKCkpOwoKICAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAtLSBQQVJURSAxODogUE9MSUNJRVMgLSBTWVNURU0gVEFCTEVTIChBRE1JTiBPTkxZKQogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBEUk9QIFBPTElDWSBJRiBFWElTVFMgImFkbWluc192aWV3X2ZlYXR1cmVfZmxhZ3MiIE9OIHB1YmxpYy5mZWF0dXJlX2ZsYWdzOwogIENSRUFURSBQT0xJQ1kgImFkbWluc192aWV3X2ZlYXR1cmVfZmxhZ3MiCiAgICBPTiBwdWJsaWMuZmVhdHVyZV9mbGFncyBGT1IgU0VMRUNUIFRPIGF1dGhlbnRpY2F0ZWQKICAgIFVTSU5HICgKICAgICAgRVhJU1RTICgKICAgICAgICBTRUxFQ1QgMSBGUk9NIHB1YmxpYy51c2VyX29yZ2FuaXphdGlvbnMKICAgICAgICBXSEVSRSB1c2VyX2lkID0gYXV0aC51aWQoKQogICAgICAgICAgQU5EIHJvbGUgSU4gKCdvd25lcicsICdhZG1pbicpCiAgICAgICkKICAgICk7CgogIERST1AgUE9MSUNZIElGIEVYSVNUUyAiYWRtaW5zX21hbmFnZV9zeXN0ZW1fc2V0dGluZ3MiIE9OIHB1YmxpYy5zeXN0ZW1fc2V0dGluZ3M7CiAgQ1JFQVRFIFBPTElDWSAiYWRtaW5zX21hbmFnZV9zeXN0ZW1fc2V0dGluZ3MiCiAgICBPTiBwdWJsaWMuc3lzdGVtX3NldHRpbmdzIEZPUiBBTEwgVE8gYXV0aGVudGljYXRlZAogICAgVVNJTkcgKAogICAgICBFWElTVFMgKAogICAgICAgIFNFTEVDVCAxIEZST00gcHVibGljLnVzZXJfb3JnYW5pemF0aW9ucwogICAgICAgIFdIRVJFIHVzZXJfaWQgPSBhdXRoLnVpZCgpCiAgICAgICAgICBBTkQgcm9sZSBJTiAoJ293bmVyJywgJ2FkbWluJykKICAgICAgKQogICAgKTsKCiAgLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLS0gUEFSVEUgMTk6IEdSQU5UUwogIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBHUkFOVCBTRUxFQ1QgT04gcHVibGljLmNhdGVnb3JpZXMgVE8gYXV0aGVudGljYXRlZDsKICBHUkFOVCBTRUxFQ1QgT04gcHVibGljLnN1cHBsaWVycyBUTyBhdXRoZW50aWNhdGVkOwogIEdSQU5UIFNFTEVDVCBPTiBwdWJsaWMucHJvZHVjdHMgVE8gYXV0aGVudGljYXRlZDsKICBHUkFOVCBTRUxFQ1QgT04gcHVibGljLnF1b3RlcyBUTyBhdXRoZW50aWNhdGVkOwogIEdSQU5UIFNFTEVDVCBPTiBwdWJsaWMub3JkZXJzIFRPIGF1dGhlbnRpY2F0ZWQ7CiAgSUYgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hPSdwdWJsaWMnIEFORCB0YWJsZV9uYW1lPSdwYXltZW50cycpIFRIRU4KICAgIEdSQU5UIFNFTEVDVCBPTiBwdWJsaWMucGF5bWVudHMgVE8gYXV0aGVudGljYXRlZDsKICBFTkQgSUY7CgogIFJBSVNFIE5PVElDRSAnTWlncmF0aW9uIDIwMjUwMTAzXzAyX3Jsc19vcmdhbml6YXRpb25zIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5Lic7CkVORCAkb3V0ZXIkOwo=
^

View logs for this Workflow Run ↗︎.
Learn more about Supabase for Git ↗︎.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 15, 2026

Walkthrough

PR sincroniza migrations entre git e produção após detecção de drift por timestamp, aplicando ajustes em produção (backfill de schema_migrations, aplicação de migration de profiles) e no repositório (6 renames de SQL, remoção de função duplicate). Documentação descreve operações, causa raiz e validações finais.

Mudanças

Sincronização de Migrations e Hardening

Layer / File(s) Resumo
Documentação de sincronização e remoção de função
docs/hardening/MIGRATION-SYNC-2026-05-15.md, supabase/migrations/20260515120000_fix_audit_ownership_orphans_uuid_only.sql
Documento de hardening registra sincronização total de migrations entre git e produção: operações em produção incluem backfill de 5 versões em schema_migrations e aplicação física de migration de profiles; ajustes no git incluem 6 renames de arquivos SQL para realinhar timestamps de execução com filenames e remoção de 1 função PL/pgSQL duplicate (public.audit_ownership_orphans). Também documenta causa raiz do drift (timestamps derivados de hora de execução via MCP, não de filenames) e validações finais.

Esforço estimado de revisão

🎯 3 (Moderado) | ⏱️ ~25 minutos

Requer validação da sincronização de timestamps, verificação de que a remoção de função não quebra dependências, e confirmação de que todas as 6 renomeações foram executadas corretamente em produção.

PRs potencialmente relacionadas

  • adm01-debug/Promo_Gifts#223: Trata da mesma função public.audit_ownership_orphans em supabase/migrations/20260515120000_fix_audit_ownership_orphans_uuid_only.sql, abordando issue de casting UUID/Text na auditoria de ownership.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed O título descreve precisamente as mudanças principais: sincronização de migrações entre git e schema_migrations de produção, além da correção na coluna profiles.user_id.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch hardening/migration-sync-2026-05-15

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

-- ============================================================================

P1 Badge Remove placeholder duplicates before reusing versions

When the real migration is renamed to 20260514233703_*, the existing 20260514233703_applied_to_production.sql placeholder remains in the same directory, so the local migration set now has two files with the same Supabase version (and the same pattern repeats for 20260514235639, 20260515005303, 20260515005356, 20260515020250, and 20260515103945). The Supabase CLI docs state files are keyed by the <timestamp>_<name>.sql timestamp and that the migration history inserts the timestamp as the unique id; on a preview/local reset that applies local migrations, the placeholder will record this version and the real migration will then collide/skip, leaving the schema changes unapplied or failing with a duplicate migration id. Please delete or rename the matching *_applied_to_production.sql placeholders whenever a real migration takes over that timestamp.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
docs/hardening/MIGRATION-SYNC-2026-05-15.md (1)

62-70: Causa raiz identificada corretamente — considerar automação futura.

A análise da causa raiz (timestamps gerados na hora da execução via apply_migration MCP, não baseados no filename) está bem documentada. Para evitar recorrência, considere:

  1. Migration naming convention: Gerar timestamps ANTES de aplicar (script pre-apply que cria o arquivo com timestamp correto)
  2. Validation gate: Script que compara supabase/migrations/*.sql vs schema_migrations e falha se houver drift > threshold
  3. MCP wrapper: Camada que force sincronização filename ↔ prod timestamp
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/hardening/MIGRATION-SYNC-2026-05-15.md` around lines 62 - 70, The
root-cause analysis is correct but the repo lacks automation to prevent future
drift: implement a pre-apply migration step that generates the canonical
timestamp-based filename before calling apply_migration (so timestamps are
derived from filename, not runtime), add a CI "validation gate" script that
compares supabase/migrations/*.sql filenames against the database's
schema_migrations entries and fails the build when drift exceeds a configurable
threshold, and add an MCP wrapper (e.g., a script that wraps apply_migration)
that enforces and syncs filename ↔ production timestamp (creating placeholder
files or updating schema_migrations atomically when needed); update README/docs
to describe the new pre-apply, validation script, and MCP wrapper behaviours so
maintainers know how to run and troubleshoot them.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/hardening/MIGRATION-SYNC-2026-05-15.md`:
- Line 90: The document currently lists the exposed PAT
`github_pat_11BXDMV7Q0CbI9L78vrLi...` with status "aguardando revogação"; revoke
that token IMMEDIATELY in GitHub (Settings → Developer settings → Personal
access tokens), remove any copies from the remote VPS, generate a new PAT with
the minimum required scopes, and update this file (MIGRATION-SYNC-2026-05-15.md)
to replace "aguardando revogação" with "revogado" plus a confirmation line
containing the revocation timestamp and the actor who performed it; also remove
or redact the full token string from the document.

---

Nitpick comments:
In `@docs/hardening/MIGRATION-SYNC-2026-05-15.md`:
- Around line 62-70: The root-cause analysis is correct but the repo lacks
automation to prevent future drift: implement a pre-apply migration step that
generates the canonical timestamp-based filename before calling apply_migration
(so timestamps are derived from filename, not runtime), add a CI "validation
gate" script that compares supabase/migrations/*.sql filenames against the
database's schema_migrations entries and fails the build when drift exceeds a
configurable threshold, and add an MCP wrapper (e.g., a script that wraps
apply_migration) that enforces and syncs filename ↔ production timestamp
(creating placeholder files or updating schema_migrations atomically when
needed); update README/docs to describe the new pre-apply, validation script,
and MCP wrapper behaviours so maintainers know how to run and troubleshoot them.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d09faa96-68c8-4dda-8d8f-e6d0ca65b23f

📥 Commits

Reviewing files that changed from the base of the PR and between e5916d3 and 7d3f934.

📒 Files selected for processing (8)
  • docs/hardening/MIGRATION-SYNC-2026-05-15.md
  • supabase/migrations/20260514233703_onda16_drop_legacy_email_like_admin_policies.sql
  • supabase/migrations/20260514235639_onda17_fn_quotes_recalc_subtotal_completo.sql
  • supabase/migrations/20260515005303_onda18a_quote_isolation_rls.sql
  • supabase/migrations/20260515005356_onda18b_backfill_user_organizations.sql
  • supabase/migrations/20260515020250_onda19_numeric_precision.sql
  • supabase/migrations/20260515103945_onda19_followup_track_functions_fix_view_security.sql
  • supabase/migrations/20260515120000_fix_audit_ownership_orphans_uuid_only.sql
💤 Files with no reviewable changes (1)
  • supabase/migrations/20260515120000_fix_audit_ownership_orphans_uuid_only.sql

| 10 itens manuais de go-live (Sentry DSN, MFA, transferir Lovable, etc.) | aguardando PO | auditoria pré-prod de 15/mai |
| Cobertura de testes 26% real vs target 60% | report-only | gate `coverage` (PR #227) |
| F2 PR-B (drop 10 backup tables + 2 `_unif_*`) | pendente decisão | F2 cleanup banco |
| PAT GitHub `github_pat_11BXDMV7Q0CbI9L78vrLi...` exposto no remote VPS | aguardando revogação | manual |
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

PAT exposto deve ser revogado IMEDIATAMENTE, não "aguardando".

Token GitHub com prefixo github_pat_11BXDMV7Q0CbI9L78vrLi... está ativo no VPS remoto e representa risco crítico de segurança (write access ao repositório). Status "aguardando revogação" é inaceitável — a revogação deve acontecer AGORA, antes do merge deste PR.

Ação imediata requerida:

  1. Revogar o PAT em GitHub Settings → Developer settings → Personal access tokens
  2. Remover do VPS
  3. Gerar novo PAT com escopo mínimo necessário
  4. Atualizar este doc confirmando revogação + timestamp
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/hardening/MIGRATION-SYNC-2026-05-15.md` at line 90, The document
currently lists the exposed PAT `github_pat_11BXDMV7Q0CbI9L78vrLi...` with
status "aguardando revogação"; revoke that token IMMEDIATELY in GitHub (Settings
→ Developer settings → Personal access tokens), remove any copies from the
remote VPS, generate a new PAT with the minimum required scopes, and update this
file (MIGRATION-SYNC-2026-05-15.md) to replace "aguardando revogação" with
"revogado" plus a confirmation line containing the revocation timestamp and the
actor who performed it; also remove or redact the full token string from the
document.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR attempts to reconcile Supabase migration history between git and production while documenting the migration-sync operation and adding/fixing several hardening migrations around RLS, quote calculations, numeric precision, and view/function security.

Changes:

  • Renames/reintroduces several applied migration files with production-aligned timestamps.
  • Adds migrations for quote subtotal recalculation, quote access isolation, user organization backfill, numeric precision, and follow-up trigger/view hardening.
  • Documents the production migration-sync process and remaining operational follow-ups.

Reviewed changes

Copilot reviewed 2 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
supabase/migrations/20260515120000_fix_audit_ownership_orphans_uuid_only.sql Deletes a duplicate audit ownership migration.
supabase/migrations/20260515103945_onda19_followup_track_functions_fix_view_security.sql Adds missing trigger functions and restores hardened view access.
supabase/migrations/20260515020250_onda19_numeric_precision.sql Alters numeric precision and recreates dependent triggers/view.
supabase/migrations/20260515005356_onda18b_backfill_user_organizations.sql Backfills missing organization memberships from user roles.
supabase/migrations/20260515005303_onda18a_quote_isolation_rls.sql Adds quote-scoped access helper and quote-related RLS policies.
supabase/migrations/20260514235639_onda17_fn_quotes_recalc_subtotal_completo.sql Replaces quote subtotal recalculation logic.
supabase/migrations/20260514233703_onda16_drop_legacy_email_like_admin_policies.sql Drops legacy email-based admin policies.
docs/hardening/MIGRATION-SYNC-2026-05-15.md Documents migration sync operations, validation, and pending items.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

| 10 itens manuais de go-live (Sentry DSN, MFA, transferir Lovable, etc.) | aguardando PO | auditoria pré-prod de 15/mai |
| Cobertura de testes 26% real vs target 60% | report-only | gate `coverage` (PR #227) |
| F2 PR-B (drop 10 backup tables + 2 `_unif_*`) | pendente decisão | F2 cleanup banco |
| PAT GitHub `github_pat_11BXDMV7Q0CbI9L78vrLi...` exposto no remote VPS | aguardando revogação | manual |

Em **2026-05-15**, post-execução:

- `SELECT DISTINCT version FROM supabase_migrations.schema_migrations WHERE version >= '20260514230000'` retorna **17 versions**, idênticas (timestamp + nome) às do filename em `supabase/migrations/` na branch deste PR.
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 8 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="docs/hardening/MIGRATION-SYNC-2026-05-15.md">

<violation number="1" location="docs/hardening/MIGRATION-SYNC-2026-05-15.md:90">
P1: Do not commit credential/token material in docs. Replace the PAT value with a fully redacted placeholder.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.
Re-trigger cubic

| 10 itens manuais de go-live (Sentry DSN, MFA, transferir Lovable, etc.) | aguardando PO | auditoria pré-prod de 15/mai |
| Cobertura de testes 26% real vs target 60% | report-only | gate `coverage` (PR #227) |
| F2 PR-B (drop 10 backup tables + 2 `_unif_*`) | pendente decisão | F2 cleanup banco |
| PAT GitHub `github_pat_11BXDMV7Q0CbI9L78vrLi...` exposto no remote VPS | aguardando revogação | manual |
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot May 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Do not commit credential/token material in docs. Replace the PAT value with a fully redacted placeholder.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/hardening/MIGRATION-SYNC-2026-05-15.md, line 90:

<comment>Do not commit credential/token material in docs. Replace the PAT value with a fully redacted placeholder.</comment>

<file context>
@@ -0,0 +1,99 @@
+| 10 itens manuais de go-live (Sentry DSN, MFA, transferir Lovable, etc.) | aguardando PO | auditoria pré-prod de 15/mai |
+| Cobertura de testes 26% real vs target 60% | report-only | gate `coverage` (PR #227) |
+| F2 PR-B (drop 10 backup tables + 2 `_unif_*`) | pendente decisão | F2 cleanup banco |
+| PAT GitHub `github_pat_11BXDMV7Q0CbI9L78vrLi...` exposto no remote VPS | aguardando revogação | manual |
+
+---
</file context>
Suggested change
| PAT GitHub `github_pat_11BXDMV7Q0CbI9L78vrLi...` exposto no remote VPS | aguardando revogação | manual |
| PAT GitHub `[REDACTED]` exposto no remote VPS | aguardando revogação | manual |
Fix with Cubic

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants