@agent-cards/sdk 0.23.19 → 0.23.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +61 -2
  2. package/PREFLIGHT.md +4 -0
  3. package/README.md +175 -7
  4. package/dist/amadeus.d.ts +4 -2
  5. package/dist/amadeus.js +16 -3
  6. package/dist/buy.d.ts +84 -2
  7. package/dist/buy.js +16 -1
  8. package/dist/card-endpoint-facts.d.ts +2 -1
  9. package/dist/card-endpoint-facts.js +18 -9
  10. package/dist/card-endpoint.d.ts +20 -4
  11. package/dist/card-endpoint.js +38 -4
  12. package/dist/card-fields.generated.js +1444 -51
  13. package/dist/cdp.d.ts +29 -0
  14. package/dist/cdp.js +444 -24
  15. package/dist/client.d.ts +134 -7
  16. package/dist/client.js +350 -25
  17. package/dist/comgate.d.ts +50 -0
  18. package/dist/comgate.js +80 -0
  19. package/dist/cybersource-secure-acceptance.generated.d.ts +1 -1
  20. package/dist/eprotect.generated.d.ts +1 -1
  21. package/dist/gmo.generated.js +7 -3
  22. package/dist/hipay.generated.d.ts +56 -0
  23. package/dist/hipay.generated.js +392 -0
  24. package/dist/hold.d.ts +180 -0
  25. package/dist/hold.js +270 -0
  26. package/dist/hosted-entry.d.ts +4 -0
  27. package/dist/hosted-entry.js +32 -0
  28. package/dist/index.d.ts +4 -1
  29. package/dist/index.js +1 -0
  30. package/dist/lifecycle.d.ts +10 -0
  31. package/dist/lifecycle.js +21 -0
  32. package/dist/merchant-card-endpoints.generated.js +102 -11
  33. package/dist/paddle-tokenex.generated.js +7 -3
  34. package/dist/paddle-vgs.generated.d.ts +3 -2
  35. package/dist/paddle-vgs.generated.js +9 -5
  36. package/dist/payrails.generated.js +7 -3
  37. package/dist/pre-claim.d.ts +20 -0
  38. package/dist/pre-claim.js +202 -22
  39. package/dist/preflight-catalog.json +58 -0
  40. package/dist/preflight-schemas.json +4 -0
  41. package/dist/preflight.generated.js +26 -2
  42. package/dist/prepared-processor.d.ts +6 -2
  43. package/dist/prepared-processor.js +18 -2
  44. package/dist/primer.generated.js +1487 -94
  45. package/dist/przelewy24.d.ts +47 -0
  46. package/dist/przelewy24.js +88 -0
  47. package/dist/quickpay.d.ts +44 -0
  48. package/dist/quickpay.js +65 -0
  49. package/dist/registry.d.ts +6 -5
  50. package/dist/registry.js +27 -7
  51. package/dist/shiji-sts.generated.js +7 -3
  52. package/dist/stripe-checkout.generated.js +744 -13
  53. package/dist/tokenex-iframe.d.ts +93 -0
  54. package/dist/tokenex-iframe.generated.d.ts +81 -0
  55. package/dist/tokenex-iframe.generated.js +403 -0
  56. package/dist/tokenex-iframe.js +195 -0
  57. package/dist/transbank.d.ts +45 -0
  58. package/dist/transbank.js +73 -0
  59. package/dist/twoc2p.d.ts +54 -0
  60. package/dist/twoc2p.generated.d.ts +33 -0
  61. package/dist/twoc2p.generated.js +1149 -0
  62. package/dist/twoc2p.js +85 -0
  63. package/dist/voice.d.ts +16 -13
  64. package/dist/voice.js +13 -10
  65. package/examples/preflight/kernel-native/inventory.json +1 -1
  66. package/package.json +3 -3
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  // Generated from @agent-cards/payment-core. Do not edit.
3
- // artifact-sha256: 75a1d6551b8b0f5af53c9ce72e709e523f6911e0f96a1705fca0855b180d8532
3
+ // artifact-sha256: 7544ef9813a4b2b55031179301878be4c74d1f1363eacca7552d7ba0f5bb4843
4
4
  // src/deep-freeze.js
5
5
  function deepFreeze(value) {
6
6
  if (value && typeof value === "object" && !Object.isFrozen(value)) {
@@ -600,6 +600,102 @@ var PROCESSOR_DEFINITIONS = deepFreeze([
600
600
  dedupe: ["checkout-account", "checkout-transaction-id"]
601
601
  }
602
602
  },
603
+ {
604
+ psp: "eximbay",
605
+ // Eximbay's payment window, the Korean gateway that takes foreign cards for Korean merchants selling
606
+ // abroad. The merchant's page posts a
607
+ // signed ENTRY form, top-level or into a popup, to https://secureapi.eximbay.com/Gateway/BasicProcessor.krp
608
+ // (Eximbay's integration v230, which its JavaScript SDK submits too): the amount, the merchant's mid, its
609
+ // order reference, its return and status URLs and an fgkey, a SHA-256 over every field under the
610
+ // merchant's secret key, and no card. Eximbay answers with a page that posts itself, with a paramkey, into
611
+ // its window under a JSESSIONID cookie, so a card form rebuilt away from that session has no payment to pay
612
+ // (processors/eximbay.js). The paused request is therefore the entry, a Document navigation that carries no
613
+ // card: the cardholder's device repeats it over the end-to-end TLS relay, fills the card into the window
614
+ // Eximbay returns to it and posts it back in that same session, and the runtime resolves the paused
615
+ // navigation with the hosted_form notice. Only the entry path is matched, exactly (processors/eximbay.js
616
+ // isEximbayEntryUrl: a query would reach Eximbay's servlet as fields beside the signed body). The window's
617
+ // card lookup (checkCardBin.do) and its card post (checkApprv.jsp) carry a card and are never paused, and
618
+ // the agent's browser never loads the window while the entry waits. No SDK gate refuses those two posts
619
+ // in the agent's browser yet (checkout/src/pre-claim.ts holds Redsys's and NMI's, none for Eximbay), and
620
+ // until one does the SDK does not declare this capability. Eximbay's test host serves the same window
621
+ // for test merchants, so a live row reaches the live host only and a test row the test host only. Dark:
622
+ // served only to a client that declares the capability, and gated off for every org the operator has not
623
+ // allowlisted.
624
+ capability: "eximbay_hosted_payment_page",
625
+ match: "secureapi\\.(?:test\\.)?eximbay\\.com/Gateway/BasicProcessor\\.krp",
626
+ hosts: ["^secureapi\\.eximbay\\.com$", "^secureapi\\.test\\.eximbay\\.com$"],
627
+ sandboxHosts: ["^secureapi\\.test\\.eximbay\\.com$"],
628
+ hostEnvironmentPinned: true,
629
+ encoding: "form",
630
+ passthroughHeaders: [],
631
+ mode: "hosted_form",
632
+ hostedForm: {
633
+ // The card goes into the window Eximbay returns to the device, not into the paused entry, which must
634
+ // carry none (processors/eximbay.js checkEximbayEntry). The device never posts a form of its own: the
635
+ // Vault's form-action policy leaves these hosts out.
636
+ cardIn: "processor_page",
637
+ // The entry's own rules (processors/eximbay.js checkEximbayEntry), the reviewed merchants among them: the
638
+ // create runs them, and naming them here makes the cardholder's device run them again on the entry it is
639
+ // about to repeat (forms.js hostedFormTemplateRefusal).
640
+ policy: "eximbay",
641
+ required: ["ver", "mid", "txntype", "ref", "cur", "amt", "buyer", "email", "lang", "returnurl", "statusurl", "fgkey"],
642
+ // The window's own card fields, which the device fills in the window (never in the entry). The window's
643
+ // script also splits the number into cardno1 to cardno4 beside cardNum.
644
+ card: { number: "cardNum", month: "month", year: "year", cvc: "cvc" },
645
+ // The merchant, its order reference and the amount name one payment.
646
+ dedupe: ["mid", "ref", "amt", "cur"]
647
+ }
648
+ },
649
+ {
650
+ psp: "barion",
651
+ // Barion's Smart Gateway (Barion Payment Zrt.), where Hungarian, Czech and Slovak shops send a buyer who pays
652
+ // by card as a guest. The merchant's SERVER starts the payment (POST api.barion.com/v2/Payment/Start under its
653
+ // POSKey: the amount, the shop, its RedirectUrl) and sends the buyer's browser to
654
+ // secure.barion.com/Pay?Id={PaymentId}, a GET. That ENTRY is the payment's id alone: no card, no amount and no
655
+ // merchant, all of which Barion bound to the id on its own server. Barion answers with the gateway under a
656
+ // session of its own (an ASP.NET session and an anti-forgery token), whose script posts the card to
657
+ // /Pay/PrepareCardPaymentForGuest and /Pay/CompletePaymentAsGuestWithCard on the same host in that session, so a
658
+ // card post made away from that session has no payment to pay (processors/barion.js). The paused request is
659
+ // therefore the entry, a Document navigation that carries no card: the cardholder's device repeats it over the
660
+ // end-to-end TLS relay and makes the gateway's posts itself in that same session, and the runtime resolves the
661
+ // paused navigation with the hosted_form notice. Only the entry is matched, exactly (processors/barion.js
662
+ // isBarionEntryUrl: the path /Pay and one Id or id parameter, since the gateway acts on others): the card posts,
663
+ // the email check and the 3-D Secure steps share the host, and none of them is the entry. secure.test.barion.com
664
+ // runs the same gateway for Barion's test shops: a live row reaches only the live host and a test row only the
665
+ // test host, which takes only Barion's test cards. Dark: served only to a client that declares the capability,
666
+ // and gated off for every org the operator has not allowlisted.
667
+ capability: "barion_hosted_payment_page",
668
+ match: "secure(?:\\.test)?\\.barion\\.com/Pay",
669
+ hosts: ["^secure\\.barion\\.com$", "^secure\\.test\\.barion\\.com$"],
670
+ sandboxHosts: ["^secure\\.test\\.barion\\.com$"],
671
+ hostEnvironmentPinned: true,
672
+ // `encoding` describes the gateway's own posts, which the device makes as the gateway's script does, since the
673
+ // entry has no body. No captured header is ever replayed.
674
+ encoding: "form",
675
+ passthroughHeaders: [],
676
+ // The entry is the GET the merchant's redirect makes, and it carries no card: the card goes into the gateway's
677
+ // own posts on the device. A client that pauses a GET only for a processor whose request it checks (the
678
+ // checkout SDK's isRecognizerRequest) never pauses this one until it learns the entry.
679
+ request: { method: "GET", cardIn: "none", response: "html_page" },
680
+ mode: "hosted_form",
681
+ hostedForm: {
682
+ // The card goes into the gateway's posts the device makes, never into the paused entry, which carries no
683
+ // body at all (processors/barion.js checkBarionEntry). The device never posts a form of its own: the Vault's
684
+ // form-action policy leaves these hosts out.
685
+ cardIn: "processor_page",
686
+ // The entry's own rules (processors/barion.js checkBarionEntry): the create runs them, and naming them here
687
+ // makes the cardholder's device run them again on the entry it is about to repeat (forms.js
688
+ // hostedFormTemplateRefusal).
689
+ policy: "barion",
690
+ // The entry is a bodiless GET, so no form field is required of it.
691
+ required: [],
692
+ // The fields of the gateway's charge post, which the device fills there (never in the entry).
693
+ card: { number: "CardNumber", expiry: "CardExpiration", cvc: "CardCVC" },
694
+ // The payment id in the entry's URL names one payment Barion started; the policy reads it there
695
+ // (checkBarionEntry's dedupe), since no form field holds it.
696
+ dedupe: ["(paymentId)"]
697
+ }
698
+ },
603
699
  // ── Verified tokenizers (plaintext PAN in the body) ───────────────────────
604
700
  // Each entry below was checked against the PSP's own shipped browser SDK or a
605
701
  // live probe, then run through resolveRecognizerForUrl with positive, sibling
@@ -2106,16 +2202,17 @@ var PROCESSOR_DEFINITIONS = deepFreeze([
2106
2202
  psp: "sumup",
2107
2203
  // SumUp's online payments (UK, EEA, US, Latin America): the Payment Widget
2108
2204
  // (gateway.sumup.com/gateway/ecom/card/v2/sdk.js) that SumUp's WooCommerce plugin, its Payment Links, Online
2109
- // Store and invoices all mount (its hosted checkout page too, which this lane refuses: that page serves every
2110
- // merchant from one origin). Each card field is a frame on gateway.sumup.com, and a
2205
+ // Store and invoices all mount (its hosted checkout page too, which this lane refuses: that page sends a body
2206
+ // nobody has reviewed). Each card field is a frame on gateway.sumup.com, and a
2111
2207
  // hidden form frame there sends the card in one PUT to https://api.sumup.com/v0.2/checkouts/<checkout id>:
2112
2208
  // JSON {"payment_type":"card","device_information":..,"card":{"name","number","expiry_month":"MM",
2113
2209
  // "expiry_year":"YY" or "YYYY","cvv"},"installments":1,..}, unencrypted, with X-Sumup-Correlation-Id naming
2114
2210
  // the same checkout. sumup.js holds the request rule the pause decision, the API's create and the device all
2115
2211
  // read: exactly that URL, a JSON Content-Type, the correlation id, and the widget's body byte for byte, with
2116
2212
  // a body that carries a recurring mandate, which keeps the card at SumUp, refused. The body names no
2117
- // amount and no merchant: the checkout the merchant's server created holds both, so a live request is taken
2118
- // only for a checkout origin a reviewed pin lists. The request carries no cookie and no Authorization
2213
+ // amount and no merchant: the checkout the merchant's server created holds both, so the API reads the checkout
2214
+ // from SumUp by its id and takes a live request only for a merchant code a reviewed pin lists (sumup.js
2215
+ // SUMUP_MERCHANT_PINS). The request carries no cookie and no Authorization
2119
2216
  // header (the checkout id is its credential), and the API answers any browser origin's preflight with
2120
2217
  // credentials omitted. The answer is the checkout: PAID, FAILED, or PENDING with a 3-D Secure step the
2121
2218
  // widget then runs in the page. SumUp's sandbox merchants share the live host, so no sandbox host is
@@ -2133,6 +2230,320 @@ var PROCESSOR_DEFINITIONS = deepFreeze([
2133
2230
  passthroughHeaders: ["^x-sumup-correlation-id$", "^x-sumup-widget-session-id$"],
2134
2231
  jsonCardFields: [["card", "number"]],
2135
2232
  request: { method: "PUT", cardIn: "body", response: "json" }
2233
+ },
2234
+ {
2235
+ psp: "twoc2p",
2236
+ // 2C2P's hosted payment page (pgw-ui.2c2p.com, builds 4.1 to 4.5), where most 2C2P merchants in Thailand,
2237
+ // Malaysia and Singapore send a buyer, top level or in a frame. On Pay the page encrypts the card with
2238
+ // 2C2P's own library under one static RSA-1024 key and posts one JSON request to
2239
+ // pgwv4.2c2p.com/payment/<build>/Payment (sandbox-pgwv4 for a sandbox token), the card only as
2240
+ // payment.data.securePayToken. twoc2p.js holds the rule the pause decision, the API's create, the approve
2241
+ // and the SDK read: the exact Payment URL of a reviewed build, the page's own body, and a request that keeps,
2242
+ // reuses or exposes a card, pays in instalments, converts the currency or redeems points refused. cse mode,
2243
+ // as Paddle TokenEx and Shiji STS ship: the cardholder's device writes a new securePayToken from the real
2244
+ // card under the key payment-core pins (twoc2p-keys.js), the runtime swaps it over the placeholder's, and the
2245
+ // agent's page continues the request (substituteTwoC2p). A Payment request with no card field (a QR code, a
2246
+ // bank transfer) carries none of the cardholder's cards and continues untouched (passWithoutCard). The
2247
+ // request names no amount and no merchant: the payment token binds both, which the API reads from 2C2P's
2248
+ // own session answer (twoc2p-answers.js), and a live payment is taken only for a merchant a reviewed pin
2249
+ // names. Ships dark: served only to a client that declares `twoc2p_secure_pay`, gated off for every org
2250
+ // until an operator lists one (`twoc2p:<org>`), and autopilot never sends this request (autopilot.js
2251
+ // DEVICE_REPLAY_REFUSED_OPERATIONS). The environment is pinned (S7): sandbox-pgwv4 only on test rows and
2252
+ // only with documented test cards. `(?![\w/.-])` ends the path for a consumer that tests `match` unanchored.
2253
+ capability: "twoc2p_secure_pay",
2254
+ match: "(?:sandbox-)?pgwv4\\.2c2p\\.com/payment/4\\.[0-9]{1,2}/Payment(?![\\w/.-])",
2255
+ hosts: ["^pgwv4\\.2c2p\\.com$", "^sandbox-pgwv4\\.2c2p\\.com$"],
2256
+ sandboxHosts: ["^sandbox-pgwv4\\.2c2p\\.com$"],
2257
+ hostEnvironmentPinned: true,
2258
+ encoding: "json",
2259
+ // The page continues its own request with its own headers; none is stored.
2260
+ passthroughHeaders: [],
2261
+ jsonCardFields: [["payment", "data", "securePayToken"]],
2262
+ passWithoutCard: "(?:sandbox-)?pgwv4\\.2c2p\\.com/payment/4\\.[0-9]{1,2}/Payment",
2263
+ clientSideEncrypted: true,
2264
+ mode: "cse",
2265
+ cse: { scheme: "twoc2p-secure-pay", at: "payment.data", fields: ["securePayToken"] },
2266
+ // The device's one field carries the whole card (number, expiry and code), so the client table names it once.
2267
+ encryptedCardFields: { card: "securePayToken" }
2268
+ },
2269
+ {
2270
+ psp: "hipay",
2271
+ // HiPay Enterprise (France, Portugal, Italy, Spain): HiPay's JavaScript SDK (libs.hipay.com/js/sdkjs.js)
2272
+ // takes the card in hosted fields, and their hidden controller frame on libs.hipay.com (or a direct post
2273
+ // from the merchant's own origin) posts it as one JSON body to HiPay's Secure Vault under the merchant's
2274
+ // public Basic credential: card_number, card_expiry_month (MM), card_expiry_year (YYYY), cvc, card_holder
2275
+ // when the page has the field, and multi_use. hipay.js holds the request rule the pause decision, the API's
2276
+ // create, the prepared bind and the device all read: exactly a token URL, a JSON Content-Type, a public
2277
+ // username of the vault's own environment, and a complete create byte for byte. The hosted fields also post
2278
+ // the number alone while it is typed; that body is refused (hipay_number_only) and the SDK fails it in the
2279
+ // browser, so the frame keeps the number and Pay sends one complete create. The merchant's page gives the
2280
+ // frame 20 seconds after Pay, so the lane is prepared only (preparationRequired). HiPay's vault answers any
2281
+ // browser origin, so the card leaves the cardholder's device by a direct fetch. The body names no amount and
2282
+ // no merchant: a live request is taken only for a checkout origin and a public username one reviewed pin
2283
+ // names together. stage-secure2-vault.hipay-tpp.com is HiPay's stage vault: pinned (S7) to test rows, which
2284
+ // send only test cards. Ships dark: served only to a client that declares `hipay_vault_token`, gated off
2285
+ // for every org until an operator lists one (`hipay:<org>`), and autopilot never sends this request
2286
+ // (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS). `(?![\w/.-])` ends the path for a consumer that tests
2287
+ // `match` unanchored, so /rest/v2/token/update is never this entry.
2288
+ capability: "hipay_vault_token",
2289
+ match: "(?:stage-)?secure2-vault\\.hipay-tpp\\.com/rest/v2/token(?![\\w/.-])",
2290
+ hosts: ["^secure2-vault\\.hipay-tpp\\.com$", "^stage-secure2-vault\\.hipay-tpp\\.com$"],
2291
+ sandboxHosts: ["^stage-secure2-vault\\.hipay-tpp\\.com$"],
2292
+ hostEnvironmentPinned: true,
2293
+ preparationRequired: true,
2294
+ encoding: "json",
2295
+ // The merchant's public credential and the frame's JSON Accept. Origin, Referer and cookies never ride.
2296
+ passthroughHeaders: ["^authorization$", "^accept$"]
2297
+ },
2298
+ {
2299
+ psp: "amazon_payment_services",
2300
+ // Amazon Payment Services (formerly PayFort; the UAE, Saudi Arabia, Egypt), its custom merchant page: the
2301
+ // merchant's own card form posts top-level, as a document navigation, to /FortAPI/paymentPage on
2302
+ // checkout.payfort.com, form encoded, with service_command=TOKENIZATION and the merchant's signed fields
2303
+ // beside card_number, expiry_date (YYMM) and card_security_code. amazon-payment-services.js holds the rule
2304
+ // the pause decision reads: exactly that URL, and the form field by field, with another service command, a
2305
+ // saved card (token_name) and a recurring agreement (merchant_extra) refused by name. The same URL takes
2306
+ // APS's redirection and iframe entries, which carry no card and continue untouched (passWithoutCard); APS's
2307
+ // own page then takes the card, and no Vault mode pays it. The request names no amount: the merchant
2308
+ // charges the token APS answers with later, from its own server, so the agent's amount is the figure the
2309
+ // cardholder approves. APS answers no browser origin, so the card leaves the cardholder's device only
2310
+ // through the checkout relay, with the page's own Origin and Referer. sbcheckout.payfort.com is APS's
2311
+ // sandbox: pinned (S7) to test rows, which send only test cards.
2312
+ // Ships dark: served only to a client that declares `aps_custom_merchant_page`, gated off for every org
2313
+ // until an operator lists one (`amazon_payment_services:<org>`), and autopilot never sends this request
2314
+ // (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS). `(?![\w/.%-])` ends the path for a consumer that tests
2315
+ // `match` unanchored.
2316
+ capability: "aps_custom_merchant_page",
2317
+ match: "(?:sb)?checkout\\.payfort\\.com/FortAPI/paymentPage(?![\\w/.%-])",
2318
+ hosts: ["^checkout\\.payfort\\.com$", "^sbcheckout\\.payfort\\.com$"],
2319
+ sandboxHosts: ["^sbcheckout\\.payfort\\.com$"],
2320
+ hostEnvironmentPinned: true,
2321
+ encoding: "form",
2322
+ // The form's own Origin and Referer: a browser sends both on the page's POST, and the request rule holds
2323
+ // them to the checkout page. Cookies and every other header never ride.
2324
+ passthroughHeaders: ["^origin$", "^referer$"],
2325
+ cardFields: ["card_number"],
2326
+ passWithoutCard: "(?:sb)?checkout\\.payfort\\.com/FortAPI/paymentPage"
2327
+ },
2328
+ {
2329
+ psp: "paypal",
2330
+ // PayPal Card Fields (Advanced Credit and Debit Card Payments) on Orders v2: one JSON POST from a
2331
+ // PayPal-owned frame to confirm-payment-source for the order the merchant's server created. Card
2332
+ // Fields v5 (www.paypal.com/smart/card-field) sends it to its own origin, v6 to api-m.paypal.com.
2333
+ // PAN@ payment_source.card.number, expiry YYYY-MM @ .expiry, CVC @ .security_code; a Bearer token
2334
+ // PayPal minted into the frame; no amount, no encryption. paypal.js holds the rule the pause
2335
+ // decision, the API's create and the device all read: exactly the confirm URL with an upper-case
2336
+ // order id, and the frames' own new-card body. The same URL confirms a PayPal wallet, a saved card
2337
+ // or a token with no number, which continues untouched (jsonCardFields, passWithoutCard). Not here: legacy Hosted
2338
+ // Fields on cors.api.paypal.com and PayPal's guest card form, which the checkout SDK refuses for
2339
+ // every company, the order's other calls, subscriptions and /v2/payments/find-bin-details.
2340
+ // PayPal-Auth-Assertion is a server-side header and never rides.
2341
+ // Ships dark: served only to a client that declares `paypal_card_fields`, gated off for every org
2342
+ // until an operator lists one (`paypal:<org>`), and autopilot never sends this request
2343
+ // (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS). The environment is pinned (S7): the sandbox
2344
+ // hosts only on test rows and only with documented test cards, the live hosts only on live rows.
2345
+ capability: "paypal_card_fields",
2346
+ match: "(?:www|api-m)(?:\\.sandbox)?\\.paypal\\.com/v2/checkout/orders/[A-Z0-9]{1,36}/confirm-payment-source(?![\\w/-])",
2347
+ hosts: ["^www\\.paypal\\.com$", "^www\\.sandbox\\.paypal\\.com$", "^api-m\\.paypal\\.com$", "^api-m\\.sandbox\\.paypal\\.com$"],
2348
+ sandboxHosts: ["^www\\.sandbox\\.paypal\\.com$", "^api-m\\.sandbox\\.paypal\\.com$"],
2349
+ hostEnvironmentPinned: true,
2350
+ encoding: "json",
2351
+ passthroughHeaders: [
2352
+ "^authorization$",
2353
+ "^prefer$",
2354
+ "^paypal-client-metadata-id$",
2355
+ "^paypal-partner-attribution-id$",
2356
+ "^paypal-integration-artifact$",
2357
+ "^fn_sync_data$"
2358
+ ],
2359
+ jsonCardFields: [["payment_source", "card", "number"]],
2360
+ passWithoutCard: "(?:www|api-m)(?:\\.sandbox)?\\.paypal\\.com/v2/checkout/orders/[A-Z0-9]{1,36}/confirm-payment-source"
2361
+ },
2362
+ {
2363
+ psp: "clover",
2364
+ // Clover (a Fiserv company), North America. Clover's card frame (the INTERMEDIATE frame of
2365
+ // checkout.clover.com/widget.html, which checkout.clover.com/sdk.js mounts on Clover's payment links, Hosted
2366
+ // Checkout and Online Ordering and on every merchant site that embeds Clover's iframe) sends the card to Clover's
2367
+ // token API, which answers with a single-use clv_ token the merchant's server charges afterwards. One JSON POST
2368
+ // to exactly https://token.clover.com/v1/tokens (token-sandbox.dev.clover.com on Clover's sandbox), under the
2369
+ // merchant's public Ecommerce key in the apikey header and X-Clover-Client-Type HOSTED_IFRAME, with the card in
2370
+ // `card`: the number as encrypted_pan, RSA-OAEP under Clover's published TransArmor key, and the code, expiry,
2371
+ // first six, last four and brand in plain text. clover.js holds the request rule the pause decision and the
2372
+ // device read, and the API's create once its Clover branch lands: exactly that URL, the frame's three headers,
2373
+ // and the frame's single-use card body with nothing the frame does not write. The body names no amount, so a
2374
+ // live request is taken only for a store and key a reviewed pin names together. As for GMO, the paused body
2375
+ // holds the agent's placeholder ciphertext and nothing can be written into it: injectCard and
2376
+ // prepareDeviceReplay refuse this psp, and the cardholder's device builds the request with the real card under
2377
+ // the key payment-core pins and sends it itself (the token API answers the Vault's origin), with no relay. A
2378
+ // multi-pay token, the frame's reCAPTCHA variant, a number sent in the clear and every gift card, ACH or wallet
2379
+ // token request to the same URL are refused. token-sandbox.dev.clover.com is Clover's sandbox: pinned (S7) to
2380
+ // test rows, which send only Clover's test cards.
2381
+ // Ships dark: served only to a client that declares `clover_card_token`, gated off for every org until an
2382
+ // operator lists one (`clover:<org>`), and autopilot never sends this request (autopilot.js
2383
+ // DEVICE_REPLAY_REFUSED_OPERATIONS). `(?![\w/.%-])` keeps /v1/tokens/<id> and /v1/tokens.json out of `match`;
2384
+ // every consumer anchors it, and recognition.js takes only the exact URL (isCloverTokenUrl).
2385
+ capability: "clover_card_token",
2386
+ match: "token(?:-sandbox\\.dev)?\\.clover\\.com/v1/tokens(?![\\w/.%-])",
2387
+ hosts: ["^token\\.clover\\.com$", "^token-sandbox\\.dev\\.clover\\.com$"],
2388
+ sandboxHosts: ["^token-sandbox\\.dev\\.clover\\.com$"],
2389
+ hostEnvironmentPinned: true,
2390
+ encoding: "json",
2391
+ // The merchant's key and the frame's client type are what the token API reads beside the body, and the Accept
2392
+ // rides as the frame sent it; origin, referer and cookies never do.
2393
+ passthroughHeaders: ["^apikey$", "^x-clover-client-type$", "^accept$"],
2394
+ jsonCardFields: [["card", "encrypted_pan"]]
2395
+ },
2396
+ {
2397
+ psp: "tap_payments",
2398
+ // Tap Payments' Card SDK v2 frame (sdk.tap.company/v2/card/index.html), the card form of Tap's hosted
2399
+ // checkout (checkout.tap.company) and of every merchant embedding the Card SDK, in Kuwait, Saudi
2400
+ // Arabia, the UAE, Bahrain, Qatar and Oman. The frame encrypts the card itself: JSEncrypt
2401
+ // (RSAES-PKCS1-v1_5, base64) of JSON.stringify({cvc, exp_month, exp_year, name, number}) under the
2402
+ // merchant's own RSA key, sent as encryptedData in one JSON POST to /v2/card/token with the merchant's
2403
+ // publishable key as Authorization. Tap answers a token (tok_...); 3-D Secure and the charge follow,
2404
+ // card free. tap-payments.js holds the request rule the pause decision, the API, the device and the
2405
+ // swap read: the exact URL, the frame's body, a one-time purpose, and a publishable key a reviewed pin
2406
+ // lists with the merchant's key (TAP_PAYMENTS_MERCHANT_PINS). cse mode, as GMO, Shiji STS and Paddle
2407
+ // TokenEx ship: the cardholder's device encrypts the real card under the pinned key, the runtime swaps
2408
+ // encryptedData (substituteTapPayments), and the agent's frame sends the request (the token endpoint
2409
+ // answers no preflight from the Vault's origin). A save purpose, a consent to keep the card and a
2410
+ // payment agreement are refused. Test and live keys share the host, and a key's own prefix names its
2411
+ // environment, so no sandbox host is marked.
2412
+ // Ships dark: served only to a client that declares `tap_card_sdk_token`, gated off for every org
2413
+ // until an operator lists one (`tap_payments:<org>`), and autopilot never sends this request
2414
+ // (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS).
2415
+ capability: "tap_card_sdk_token",
2416
+ match: "sdk\\.tap\\.company/v2/card/token(?![\\w/.-])",
2417
+ hosts: ["^sdk\\.tap\\.company$"],
2418
+ encoding: "json",
2419
+ // The publishable key names the merchant the card is encrypted for; the frame's other headers (mdn,
2420
+ // application) ride on the page's own request and are never recorded.
2421
+ passthroughHeaders: ["^authorization$"],
2422
+ // The one ciphertext, by the role the client table names, so it carries the same encrypted-field set
2423
+ // the approve leg accepts (vault-allowlist-drift). The generic Adyen substitution refuses it (RSA
2424
+ // base64, not a JWE): only substituteTapPayments writes this body, dispatched by psp.
2425
+ encryptedCardFields: { number: "encryptedData" },
2426
+ clientSideEncrypted: true,
2427
+ mode: "cse",
2428
+ cse: { scheme: "rsa-pkcs1v15", at: "", fields: ["encryptedData"] }
2429
+ },
2430
+ {
2431
+ psp: "conekta",
2432
+ // Conekta (Mexico) through Conekta.js, the tokenizer a merchant's own page loads from cdn.conekta.io or hosts
2433
+ // itself: on Pay it posts the card with one XHR, in clear JSON, to https://api.conekta.io/tokens under the
2434
+ // merchant's public key (Basic authorization) and Accept application/vnd.conekta-v0.3.0+json, as
2435
+ // {"card":{<the page's members>,"device_fingerprint"}}: card.number, card.cvc, card.exp_month, card.exp_year and
2436
+ // card.name, in the page's order. The answer is a single-use token the merchant's server charges later; the request
2437
+ // names no amount, so the agent's amount is the price the cardholder approves. conekta.js holds the rules the pause
2438
+ // decision, the API's create and the device read: the exact URL, the tokenizer's headers, and the page's card body
2439
+ // member by member, with the tokenizer's fingerprint last. Conekta's Component (pay.conekta.com/api/tokens, the
2440
+ // frame behind the WooCommerce plugin 5.x and 6.x, the Shopify app, hosted checkout and payment links) seals its
2441
+ // token form in the page, so its two token URLs are named here only to be refused: its POST by name
2442
+ // (conekta_component_unsupported) at the pause, the API's create and the device; its PUT, not this recognizer's
2443
+ // method, continues untouched with the agent's placeholder, and the create refuses it as a method no Conekta card
2444
+ // request uses. Conekta's API answers any browser origin, so the card leaves the cardholder's
2445
+ // device by a direct fetch. Test and live share api.conekta.io and Conekta's keys name no mode, so no sandbox host
2446
+ // is marked and the lane takes live rows alone: a live request pays only an origin and a key one reviewed pin lists
2447
+ // together (conekta.js conektaMerchantRefusal), and none is listed yet. Conekta can answer a refusal inside a 2xx,
2448
+ // so its own judge reads every answer (conekta.js conektaAnswerOutcome), never the shared status rule.
2449
+ // Ships dark: served only to a client that declares `conekta_tokenizer`, gated off for every org until an
2450
+ // operator lists `conekta:<org>`, and autopilot never sends it (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS).
2451
+ // `(?![\w/.-])` ends the path for a consumer that tests `match` unanchored.
2452
+ capability: "conekta_tokenizer",
2453
+ match: "(?:api\\.conekta\\.io/tokens|pay\\.conekta\\.com/api/tokens/?)(?![\\w/.-])",
2454
+ hosts: ["^api\\.conekta\\.io$", "^pay\\.conekta\\.com$"],
2455
+ encoding: "json",
2456
+ // Conekta.js's public key, its API version and the four headers beside them. Origin, Referer and cookies never ride.
2457
+ passthroughHeaders: ["^authorization$", "^accept$", "^accept-language$", "^conekta-client-user-agent$", "^raisehtmlerror$", "^x-tokenization-source$"],
2458
+ jsonCardFields: [["card", "number"]]
2459
+ },
2460
+ {
2461
+ psp: "makecommerce",
2462
+ // MakeCommerce (Maksekeskus AS; Estonia, Latvia, Lithuania, Finland), which takes the card in its own card frame
2463
+ // (https://cc.maksekeskus.ee/card) over the shop's order page. On Pay the frame posts the card in clear JSON to its
2464
+ // own origin, https://cc.maksekeskus.ee/card-payment, under the shop's publishable key (Basic authorization):
2465
+ // card.number, card.exp_month (MM), card.exp_year (YY), card.cvc and card.name, beside the transaction's id, the
2466
+ // shop's id and host, and the "Remember my card" and subscription boxes. makecommerce.js holds the request rule
2467
+ // the pause decision, the API's create and the device all read: exactly the card endpoint URL, the JSON type,
2468
+ // the body's own key under Basic, and the frame's body byte for byte, with either box ticked refused (it keeps
2469
+ // the card on file). The body names no amount: MakeCommerce's transaction holds it, in EUR. The endpoint answers
2470
+ // no browser origin, so the card leaves the cardholder's device only through the checkout relay, and only the
2471
+ // publishable key rides beside the card. cc-test.maksekeskus.ee is MakeCommerce's TEST environment: pinned (S7)
2472
+ // to test rows, which send only its published test cards.
2473
+ // Ships dark: served only to a client that declares `makecommerce_card_frame`, gated off for every org until an
2474
+ // operator lists one (`makecommerce:<org>`), and autopilot never sends this request (autopilot.js
2475
+ // DEVICE_REPLAY_REFUSED_OPERATIONS). `(?![\w/.%-])` ends the path for a consumer that tests `match` unanchored.
2476
+ capability: "makecommerce_card_frame",
2477
+ match: "cc(?:-test)?\\.maksekeskus\\.ee/card-payment(?![\\w/.%-])",
2478
+ hosts: ["^cc\\.maksekeskus\\.ee$", "^cc-test\\.maksekeskus\\.ee$"],
2479
+ sandboxHosts: ["^cc-test\\.maksekeskus\\.ee$"],
2480
+ hostEnvironmentPinned: true,
2481
+ encoding: "json",
2482
+ // The frame's publishable key. Origin, Referer and cookies never ride.
2483
+ passthroughHeaders: ["^authorization$"],
2484
+ jsonCardFields: [["card", "number"]]
2485
+ },
2486
+ {
2487
+ psp: "tokenex_iframe",
2488
+ // TokenEx hosted iframe v3 (v3.min.js?version=latest, read 2026-10-18) in PCI mode
2489
+ // with its CVV frame: JetBlue's booking checkout (TokenExID 9014311640612780, Origin
2490
+ // https://www.jetblue.com). PAN@ Data, CVV@ CvvValue (json). TokenEx's own card-number iframe document
2491
+ // on htp.tokenex.com reads the CVV from its same-origin CVV frame and posts the whole card as one XHR
2492
+ // to its own document URL, query included: application/json, with TokenExID, Origin, the
2493
+ // AuthenticationKey the merchant's server minted, Timestamp and TokenScheme (each echoed in the
2494
+ // query), the frame's flags, and no amount, cookie or merchant session. The cardholder name and the
2495
+ // expiry stay on the merchant's page. tokenex-iframe.js judges the whole request (the exact URL and
2496
+ // its query, the body's keys in order and their types, the query and body agreeing), refuses a
2497
+ // cvvOnly or PCI-only frame, a placeholder of another brand than the card, and an account it has not
2498
+ // reviewed, and writes only Data and CvvValue. BinLookup and Forter post to their own paths under
2499
+ // /iframe/v3 and never match (the right-edge boundary and the exact-URL rule in
2500
+ // resolveRecognizerForUrl); a post with an empty Data carries no card and continues untouched
2501
+ // (passWithoutCard). Hosts are the two literal labels (never *.tokenex.com: api. and test-api. are
2502
+ // TokenEx's server API, which carries merchant credentials); the test host is pinned (S7): it takes
2503
+ // only documented test cards, and a live row never points at it.
2504
+ // Ships dark: served only to a client that declares `tokenex_iframe_tokenize`, gated off for every
2505
+ // org until an operator allowlists one, and autopilot never sends this request (autopilot.js
2506
+ // DEVICE_REPLAY_REFUSED_OPERATIONS). Not paddle_tokenex: that lane is Paddle's own frame, which
2507
+ // encrypts the card for TokenEx inside Paddle's /pay.
2508
+ capability: "tokenex_iframe_tokenize",
2509
+ match: "(?:test-)?htp\\.tokenex\\.com/iframe/v3(?:[?#]|$)",
2510
+ hosts: ["^htp\\.tokenex\\.com$", "^test-htp\\.tokenex\\.com$"],
2511
+ sandboxHosts: ["^test-htp\\.tokenex\\.com$"],
2512
+ hostEnvironmentPinned: true,
2513
+ encoding: "json",
2514
+ passthroughHeaders: [],
2515
+ // only the content type rides: no cookie, origin or referer
2516
+ jsonCardFields: [["Data"]],
2517
+ passWithoutCard: "(?:test-)?htp\\.tokenex\\.com/iframe/v3"
2518
+ },
2519
+ {
2520
+ psp: "poynt",
2521
+ // GoDaddy Payments' card frame, Poynt Collect (cdn.poynt.net/collect/payment-form), on a GoDaddy
2522
+ // Online Store checkout: one JSON POST to generate-nonce for the store the URL names. PAN@
2523
+ // card.number, with expirationMonth ("MM"), expirationYear ("20YY") and the network the frame read
2524
+ // (type) beside it, and the security code outside the card, at verificationData.cvData. poynt.js
2525
+ // holds the request rule the pause decision, the API's create and the device all read: exactly the
2526
+ // URL, the frame's headers and the frame's body byte for byte. Poynt answers with a nonce that
2527
+ // GoDaddy's server charges. services.poynt.net refuses every browser origin but the frame's, so the
2528
+ // card leaves the cardholder's device only through the checkout relay. The frame's open-tokenize
2529
+ // path, for a page that names no store, is not matched, so it continues untouched. No sandbox host.
2530
+ // Ships dark: served only to a client that declares `poynt_collect_nonce`, gated off for every org
2531
+ // until an operator lists one (`poynt:<org>`), held to the stores poynt.js pins per checkout
2532
+ // origin, and autopilot never sends this request (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS).
2533
+ capability: "poynt_collect_nonce",
2534
+ match: "services\\.poynt\\.net/v1/commerce/stores/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/payment-tokens/generate-nonce",
2535
+ hosts: ["^services\\.poynt\\.net$"],
2536
+ encoding: "json",
2537
+ // The frame's own session, request and version ids, Sardine's session and the reCAPTCHA Enterprise
2538
+ // token Poynt checks; never the page's Authorization, which GoDaddy's checkout does not pass.
2539
+ passthroughHeaders: [
2540
+ "^poynt-session-id$",
2541
+ "^poynt-request-id$",
2542
+ "^poynt-collect-version$",
2543
+ "^poynt-sardine-session-id$",
2544
+ "^recaptcha-token$",
2545
+ "^recaptcha-type$"
2546
+ ]
2136
2547
  }
2137
2548
  ]);
2138
2549
  var PSP_RECOGNIZERS = deepFreeze(PROCESSOR_DEFINITIONS.map(({ compose, encryptedCardFields, deviceSteps, deviceEncrypt, ...definition }) => definition));
@@ -2313,6 +2724,14 @@ var WIX_PAYMENTS_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2313
2724
  // src/paymongo.js
2314
2725
  var PAYMONGO_CHECKOUT_HOST = "checkout.paymongo.com";
2315
2726
  var ORIGIN = `https://${PAYMONGO_CHECKOUT_HOST}/`;
2727
+ // src/gopay.js
2728
+ var GOPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2729
+ Object.freeze({ id: "caramilla", merchant: "Caramilla.cz", origins: Object.freeze(["https://www.caramilla.cz"]) })
2730
+ ]);
2731
+ // src/payrexx.js
2732
+ var PAYREXX_FOLLOW_UP_WINDOW_MS = 15 * 60 * 1e3;
2733
+ var PAYREXX_FOLLOW_UP_IDLE_MS = 60 * 1e3;
2734
+ var PAYREXX_FOLLOW_UP_CHALLENGE_MS = 11 * 60 * 1e3;
2316
2735
  // src/paygent.js
2317
2736
  var PAYGENT_PSP = "paygent";
2318
2737
  var PAYGENT_TOKEN_HOSTS = /* @__PURE__ */ Object.freeze({
@@ -2335,6 +2754,203 @@ var PAY_NL_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2335
2754
  ]);
2336
2755
  var ERROR_KEYS = /* @__PURE__ */ Object.freeze(["errorId", "errorTag", "errorMessage", "errorFieldName"]);
2337
2756
  var REQUEST_KEYS = /* @__PURE__ */ Object.freeze(["result", ...ERROR_KEYS]);
2757
+ // src/twoc2p-keys.js
2758
+ var TWOC2P_KEYS = /* @__PURE__ */ Object.freeze({
2759
+ production: Object.freeze({
2760
+ spki: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/1ljsxI+r6qQraTFrHfWNrV41vxumBF+4ILAG3WsN6HEBQU2wSUv/IyQmZkiys1ilOb+OOuQTH8OXMnqQg9E4epyePW3L7IeOieSbIIDeSX6UpTWmT/Fs7moWZkN8RpuCV0u87n3AY2tQbtcSqwEKi2sxzWLFwscoGn6N5yVIpQIDAQAB",
2761
+ sha256: "bb8f27929ce140c6ef0ec9c4a20d7ca0b83376bc35a501985dc40d16669384fe",
2762
+ script: Object.freeze({ url: "https://t.2c2p.com/SecurePayment/api/my2c2p.1.7.6.min.js", sha256: "4a745a37765a2e28e299d64f6ea5811aab27b176da61db6f840fa85d6a47e763" })
2763
+ }),
2764
+ sandbox: Object.freeze({
2765
+ spki: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKakJC+2MSZikKoPzlNqXvJCuWNLhejg3gMRePSetYNNgnhyqFwwAR7t7i/B2QFZoixSYc2/23cJz0jA5O+q+Cu3fycqKlf1L9966+X3B9nyHe2eKQZr8KrcS/8+sEKcd0pLATY4AleW1iktuN+2oghrDKuv+aDNztWcOy+PTofwIDAQAB",
2766
+ sha256: "7f80c07f1d72db28ede10dae942940657c72dfa789836c9fdf283cba6feff2e6",
2767
+ script: Object.freeze({ url: "https://demo2.2c2p.com/2C2PFrontEnd/SecurePayment/api/my2c2p.1.7.6.min.js", sha256: "435723d92bfefb00607a56851967e0b745d52b8d49443de5f0000f0583fde5cc" })
2768
+ })
2769
+ });
2770
+ // src/hipay.js
2771
+ var pin5 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), usernames: Object.freeze([...fields.usernames]) });
2772
+ var HIPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2773
+ pin5({ id: "happybulle", merchant: "HappyBulle", origins: ["https://www.happybulle.com"], usernames: ["94683309.secure-gateway.hipay-tpp.com"] })
2774
+ ]);
2775
+ // src/amazon-payment-services.js
2776
+ var BODY_LIMIT = 32 * 1024;
2777
+ var ANSWER_LIMIT = 64 * 1024;
2778
+ // src/clover.js
2779
+ var REQUIRED_KEYS = /* @__PURE__ */ Object.freeze(["encrypted_pan", "exp_month", "exp_year", "cvv", "first6", "last4", "brand"]);
2780
+ var OPTIONAL_KEYS = /* @__PURE__ */ Object.freeze(["address_line1", "phone_numbers", "email_address", "name", "address_zip"]);
2781
+ var CARD_ORDER = /* @__PURE__ */ Object.freeze([...REQUIRED_KEYS, ...OPTIONAL_KEYS]);
2782
+ // src/tap-payments.js
2783
+ var pin6 = (fields) => Object.freeze({
2784
+ ...fields,
2785
+ origins: Object.freeze([...fields.origins]),
2786
+ sessions: Object.freeze({ ...fields.sessions }),
2787
+ key: Object.freeze({ ...fields.key })
2788
+ });
2789
+ var TAP_PAYMENTS_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2790
+ pin6({
2791
+ id: "casefilegame",
2792
+ merchant: "Casefilegame",
2793
+ tapMerchantId: "67977048",
2794
+ publishableKey: "pk_live_ydlRjrWcLXaVvpsSBQKOie86",
2795
+ environment: "production",
2796
+ origins: ["https://checkout.tap.company"],
2797
+ // The WooCommerce plugin's redirect (Plugin-WooCommerce-All-in-one tap.php 567-586, read 2026-10-17)
2798
+ // creates the src_all charge with save_card false and names no agreement, subscription or destinations.
2799
+ sessions: { saveCard: false, agreement: false, subscription: false, destinations: false },
2800
+ key: {
2801
+ spki: "MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAzja2vB+Iyafj2Mm3pFg65z7Yvj9ZeoFLdMBgWFyyjF020r5HSPKVhuZ39uJkjs0U/kWgEpKDzHZAKdtGv36dS33NjMAzYpgFkD8j+9/YWqpvAGRj5nv1b/q7NaiZk3b1wm7aXHJOx5L6rPQf2qDQxhcSNHocU+Uy8wGmGxRRu6QRKN3khaz4o4jJDzqxns4h/ShzHjdZeWIVfpCAyVoED0IESBYrvGEhJeyKnga5XdHdBU2yP8P1huO4RbSKcZv00ZgxVHAQQ9CqArW3TE8SyLLnJPkSpSHHBnIPSQS1z3ld1mImy/zqTd4ltkV6XHpYqVvoPmys2EuZX3pMvCcPGwIBEQ==",
2802
+ sha256: "6eb4e89a1e05a06a39d631f6fb450c052a9cad9935edc1921e84e80207470552",
2803
+ // The shared parser takes exponent 17 only under a pin that names it (rsa-pkcs1v15.js).
2804
+ exponent: 17
2805
+ }
2806
+ })
2807
+ ]);
2808
+ // src/conekta.js
2809
+ var LETTERS = "A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u017F";
2810
+ var PAGE_NAME = new RegExp(`^[${LETTERS} .'-]{1,64}$`);
2811
+ var HAS_LETTER = new RegExp(`[${LETTERS}]`);
2812
+ var ADDRESS_VALUE = new RegExp(`^[\\x20-\\x7e\\u00a0-\\u017f]{0,128}$`);
2813
+ var PAN_LIKE = new RegExp(`(?:[0-9][^0-9${LETTERS}]*){12,}`);
2814
+ var HOLDER = new RegExp(`^[${LETTERS}](?:[${LETTERS} .'-]{0,62}[${LETTERS}.])?$`);
2815
+ var ERROR_TYPE_STATUS = /* @__PURE__ */ Object.freeze({
2816
+ malformed_request_error: 400,
2817
+ authentication_error: 401,
2818
+ processing_error: 402,
2819
+ resource_not_found_error: 404,
2820
+ conflict_error: 409,
2821
+ precondition_required_error: 412,
2822
+ parameter_validation_error: 422
2823
+ });
2824
+ var CONEKTA_ANSWER_ERROR_TYPES = /* @__PURE__ */ Object.freeze(Object.keys(ERROR_TYPE_STATUS));
2825
+ // src/tokenex-iframe.js
2826
+ var TOKENEX_IFRAME_HOSTS = Object.freeze(["htp.tokenex.com", "test-htp.tokenex.com"]);
2827
+ var TOKENEX_IFRAME_REFUSAL_REASONS = Object.freeze(["unsupported", "brand_mismatch", "unreviewed_account"]);
2828
+ var TOKENEX_IFRAME_BODY_KEYS = Object.freeze([
2829
+ "TokenExID",
2830
+ "Origin",
2831
+ "AuthenticationKey",
2832
+ "Timestamp",
2833
+ "Data",
2834
+ "CvvValue",
2835
+ "TokenScheme",
2836
+ "CvvOnly",
2837
+ "PCI",
2838
+ "ReturnHash",
2839
+ "use3DS",
2840
+ "ThreeDSMethodNotificationUrl",
2841
+ "kountSessionId",
2842
+ "fraudMerchantId",
2843
+ "UseKount",
2844
+ "kountMode",
2845
+ "kountAnId",
2846
+ "FraudServicesRiskRequestModel",
2847
+ "EnforceLuhnCompliance",
2848
+ "CustomDataLuhnCheck"
2849
+ ]);
2850
+ var TOKENEX_IFRAME_TOKEN_SCHEMES = Object.freeze(["sixTOKENfour"]);
2851
+ var TOKENEX_IFRAME_REVIEWED_ACCOUNTS = Object.freeze({
2852
+ "htp.tokenex.com": Object.freeze({}),
2853
+ "test-htp.tokenex.com": Object.freeze({})
2854
+ });
2855
+ var TOKENEX_IFRAME_ACCOUNT_NAMES = Object.freeze({
2856
+ "htp.tokenex.com": Object.freeze({}),
2857
+ "test-htp.tokenex.com": Object.freeze({})
2858
+ });
2859
+ var exact = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
2860
+ var text = (value, max) => typeof value === "string" && value.length <= max && !/[\u0000-\u001f\u007f]/.test(value);
2861
+ var digits = (value, min, max) => typeof value === "string" && value.length >= min && value.length <= max && !/[^0-9]/.test(value);
2862
+ var panLike = (value) => (value.match(/\p{Nd}/gu) ?? []).length >= 12;
2863
+ var plain = (value, max) => text(value, max) && !panLike(value);
2864
+ var TOKENEX_ID = /^[0-9]{16}$/;
2865
+ var AUTHENTICATION_KEY = /^[A-Za-z0-9+/]{43}=$/;
2866
+ var TIMESTAMP = /^20[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12][0-9]|3[01])(?:[01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]$/;
2867
+ function isOrigin(value) {
2868
+ if (typeof value !== "string" || value.length > 255 || !value.startsWith("https://"))
2869
+ return false;
2870
+ try {
2871
+ return new URL(value).origin === value;
2872
+ }
2873
+ catch {
2874
+ return false;
2875
+ }
2876
+ }
2877
+ var BOUND = {
2878
+ TokenExID: (value) => exact(TOKENEX_ID, value),
2879
+ Origin: isOrigin,
2880
+ AuthenticationKey: (value) => exact(AUTHENTICATION_KEY, value),
2881
+ Timestamp: (value) => exact(TIMESTAMP, value),
2882
+ TokenScheme: (value) => TOKENEX_IFRAME_TOKEN_SCHEMES.includes(value)
2883
+ };
2884
+ var BOUND_KEYS = Object.keys(BOUND);
2885
+ var BOOLEAN = /^(?:true|false)$/i;
2886
+ var QUERY_RULES = {
2887
+ ...BOUND,
2888
+ Mode: (value) => value === "Data",
2889
+ PCI: (value) => exact(/^true$/i, value),
2890
+ CVV: (value) => exact(/^true$/i, value),
2891
+ Container: (value) => exact(/^[A-Za-z][A-Za-z0-9_-]{0,63}$/, value),
2892
+ CvvContainer: (value) => exact(/^[A-Za-z][A-Za-z0-9_-]{0,63}$/, value),
2893
+ EnforceLuhnCompliance: (value) => exact(BOOLEAN, value),
2894
+ CustomDataLabel: (value) => plain(value, 64),
2895
+ CustomCvvDataLabel: (value) => plain(value, 64),
2896
+ ExpiresInSeconds: (value) => exact(/^[1-9][0-9]{0,3}$/, value),
2897
+ ReturnAutoCompleteValues: (value) => exact(BOOLEAN, value)
2898
+ };
2899
+ var QUERY_REQUIRED = [...BOUND_KEYS, "Mode", "PCI", "CVV"];
2900
+ var PLACEHOLDER = /^[0-9]{1,19}(?: [0-9]{1,19}){0,5}$/;
2901
+ var placeholderDigits = (value) => exact(PLACEHOLDER, value) && value.length <= 23 ? value.replace(/ /g, "") : null;
2902
+ var RULES = {
2903
+ ...BOUND,
2904
+ Data: (value) => {
2905
+ const pan = placeholderDigits(value);
2906
+ return pan !== null && pan.length >= 13 && pan.length <= 19;
2907
+ },
2908
+ CvvValue: (value) => digits(value, 3, 4),
2909
+ CvvOnly: (value) => value === "False",
2910
+ PCI: (value) => value === "True",
2911
+ ReturnHash: (value) => value === null,
2912
+ use3DS: (value) => value === "False",
2913
+ ThreeDSMethodNotificationUrl: (value) => value === "",
2914
+ kountSessionId: (value) => value === "",
2915
+ fraudMerchantId: (value) => value === "",
2916
+ UseKount: (value) => value === "False",
2917
+ kountMode: (value) => value === "",
2918
+ kountAnId: (value) => value === "",
2919
+ FraudServicesRiskRequestModel: (value) => value === "",
2920
+ EnforceLuhnCompliance: (value) => value === "true" || value === "false",
2921
+ CustomDataLuhnCheck: (value) => value === true
2922
+ };
2923
+ var TOKENEX_IFRAME_GATE_CODES = Object.freeze(["tokenex_iframe_url_refused", "tokenex_iframe_body_unsupported", "tokenex_iframe_query_mismatch"]);
2924
+ var SUCCESS_RULES = {
2925
+ token: (value) => digits(value, 13, 19),
2926
+ firstSix: (value) => digits(value, 6, 6),
2927
+ lastFour: (value) => digits(value, 4, 4),
2928
+ referenceNumber: (value) => exact(/^[A-Za-z0-9-]{1,64}$/, value),
2929
+ tokenHMAC: (value) => exact(/^[A-Za-z0-9+/]{1,128}={0,2}$/, value),
2930
+ cvvIncluded: (value) => typeof value === "boolean"
2931
+ };
2932
+ var SUCCESS_KEYS = Object.keys(SUCCESS_RULES);
2933
+ // src/poynt.js
2934
+ var UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
2935
+ var NONCE_URL = new RegExp(`^https://services\\.poynt\\.net/v1/commerce/stores/(${UUID})/payment-tokens/generate-nonce$`);
2936
+ var STORE_ID = new RegExp(`^${UUID}$`);
2937
+ var APPLICATION_ID = new RegExp(`^urn:aid:${UUID}$`);
2938
+ var pin7 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), storeIds: Object.freeze([...fields.storeIds]) });
2939
+ var POYNT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2940
+ pin7({
2941
+ id: "yearning_for_learning",
2942
+ merchant: "Yearning for Learning Publishing & Coaching",
2943
+ origins: ["https://ff305485-ba6c-423a-87b0-cebe3f83ffe9.mysimplestore.com"],
2944
+ storeIds: ["71ac12ed-e61f-4318-95db-db0e7c649d6f"]
2945
+ }),
2946
+ pin7({
2947
+ id: "timber_ridge_bookkeeping",
2948
+ merchant: "Timber Ridge Bookkeeping",
2949
+ origins: ["https://d7d64ac3-0352-4e53-af9a-f6d8e7b5fb71.mysimplestore.com"],
2950
+ storeIds: ["27be984a-0a03-4a54-8675-e64bbbe1c43e"]
2951
+ })
2952
+ ]);
2953
+ var MAX_ANSWER_CHARS = 16 * 1024;
2338
2954
  // src/cybersource-secure-acceptance.js
2339
2955
  var SA_BODY_LIMIT = 32 * 1024;
2340
2956
  var SA_REPLY_LIMIT = 64 * 1024;
@@ -2561,7 +3177,15 @@ var METHOD_PAGE = /* @__PURE__ */ new Set(["resultadoMethod", ...BROWSER_FIELDS,
2561
3177
  var REDSYS_REFUSALS = Object.freeze(["redsys_card_page", "redsys_3ds_challenge", "redsys_declined"]);
2562
3178
  // src/processors/quickpay.js
2563
3179
  var QUICKPAY_HOSTS = Object.freeze(["payment.quickpay.net"]);
2564
- var QUICKPAY_MERCHANTS = Object.freeze([]);
3180
+ var QUICKPAY_MERCHANTS = Object.freeze([
3181
+ Object.freeze({
3182
+ merchantId: "107268",
3183
+ agreementId: null,
3184
+ merchant: "Skandinavisk Dyrepark",
3185
+ host: "shop.skandinaviskdyrepark.dk",
3186
+ callbackHost: "shop.skandinaviskdyrepark.dk"
3187
+ })
3188
+ ]);
2565
3189
  var MAX_ENTRY3 = 16 * 1024;
2566
3190
  var REQUIRED3 = Object.freeze([
2567
3191
  "version",
@@ -2617,7 +3241,9 @@ var COMGATE_GATEWAY_HOSTS = Object.freeze({
2617
3241
  "pay3.comgate.cz": "payments-gcp.comgate.cz",
2618
3242
  "pay4.comgate.cz": "payments-gcp.comgate.cz"
2619
3243
  });
2620
- var COMGATE_MERCHANTS = Object.freeze([]);
3244
+ var COMGATE_MERCHANTS = Object.freeze([
3245
+ Object.freeze({ merchant: "Dárek pro Beskydy", origins: Object.freeze(["https://darekprobeskydy.info"]), merchantIds: Object.freeze([]) })
3246
+ ]);
2621
3247
  var MAX_LOAD = 1024 * 1024;
2622
3248
  var MAX_ANSWER = 64 * 1024;
2623
3249
  var HEADER_NAMES = Object.freeze(["content-type", "x-cg-origin", "origin"]);
@@ -2625,7 +3251,9 @@ var COMGATE_REFUSALS = Object.freeze(["comgate_3ds_challenge", "comgate_declined
2625
3251
  // src/processors/przelewy24.js
2626
3252
  var PRZELEWY24_HOSTS = Object.freeze(["secure.przelewy24.pl", "sandbox.przelewy24.pl"]);
2627
3253
  var PRZELEWY24_SANDBOX_HOSTS = Object.freeze(["sandbox.przelewy24.pl"]);
2628
- var PRZELEWY24_MERCHANTS = Object.freeze([]);
3254
+ var PRZELEWY24_MERCHANTS = Object.freeze([
3255
+ Object.freeze({ id: "kupbilet", merchant: "KupBilet.pl", merchantId: null, origins: Object.freeze(["https://www.kupbilet.pl"]) })
3256
+ ]);
2629
3257
  var MAX_PAGE4 = 256 * 1024;
2630
3258
  var CURRENCIES3 = Object.freeze(["PLN", "EUR", "GBP", "USD", "CZK", "CHF", "DKK", "NOK", "SEK", "RON", "BGN", "HUF"]);
2631
3259
  var PRZELEWY24_AJAX_HEADERS = Object.freeze({ Accept: "*/*", "X-Requested-With": "XMLHttpRequest" });
@@ -2648,7 +3276,15 @@ var TRANSBANK_HOSTS = Object.freeze(["webpay3g.transbank.cl", "webpay3gint.trans
2648
3276
  var TRANSBANK_SANDBOX_HOSTS = Object.freeze(["webpay3gint.transbank.cl"]);
2649
3277
  var TOKEN = "[0-9a-f]{64}";
2650
3278
  var ENTRY_QUERY = new RegExp(`^\\?token_ws=(${TOKEN})$`);
2651
- var TRANSBANK_MERCHANTS = Object.freeze([]);
3279
+ var TRANSBANK_MERCHANTS = Object.freeze([
3280
+ Object.freeze({
3281
+ commerceCode: null,
3282
+ fantasyName: null,
3283
+ merchant: "Teleférico Santiago",
3284
+ hosts: Object.freeze(["telefericosantiago.cl"]),
3285
+ returnHost: "telefericosantiago.cl"
3286
+ })
3287
+ ]);
2652
3288
  var MAX_PAGE5 = 64 * 1024;
2653
3289
  var JSON_HEADERS = Object.freeze({ "content-type": "application/json", accept: "application/json, text/plain, */*" });
2654
3290
  var FORM_HEADERS = Object.freeze({ "content-type": "application/x-www-form-urlencoded", accept: "application/json, text/plain, */*" });
@@ -2666,7 +3302,7 @@ var PAYTRAIL_ENTRY_FIELDS = Object.freeze([
2666
3302
  ]);
2667
3303
  var PAYTRAIL_MERCHANTS = Object.freeze([]);
2668
3304
  var UUID_SOURCE = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
2669
- var UUID = new RegExp(`^${UUID_SOURCE}$`);
3305
+ var UUID2 = new RegExp(`^${UUID_SOURCE}$`);
2670
3306
  var ENTRY_PATH = new RegExp(`^/payments/(${UUID_SOURCE})/click-to-pay/loading-and-redirect$`);
2671
3307
  var SIGNATURES = Object.freeze({ sha256: /^[0-9a-f]{64}$/, sha512: /^[0-9a-f]{128}$/ });
2672
3308
  var PAYMENT_HIGHWAY_HOSTS = Object.freeze(["v1.api.paymenthighway.io"]);
@@ -2674,6 +3310,101 @@ var CARD_PAGE_PATH = new RegExp(`^/form/(${UUID_SOURCE})/pay_with_click_to_pay$`
2674
3310
  var MAX_PAGE6 = 256 * 1024;
2675
3311
  var PAYTRAIL_CARD_HEADERS = Object.freeze({ "Content-Type": "application/json", "X-Requested-With": "PH-Form", Accept: "application/json" });
2676
3312
  var PAYTRAIL_REFUSALS = Object.freeze(["paytrail_3ds_challenge", "paytrail_card_refused"]);
3313
+ // src/processors/eximbay.js
3314
+ var EXIMBAY_HOSTS = Object.freeze(["secureapi.eximbay.com", "secureapi.test.eximbay.com"]);
3315
+ var EXIMBAY_MERCHANTS = Object.freeze([]);
3316
+ var MAX_ENTRY4 = 16 * 1024;
3317
+ var REQUIRED4 = Object.freeze(["ver", "mid", "txntype", "ref", "cur", "amt", "buyer", "email", "lang", "returnurl", "statusurl", "fgkey"]);
3318
+ var CURRENCIES4 = Object.freeze({ USD: 2, KRW: 0, JPY: 0, EUR: 2, GBP: 2, SGD: 2, HKD: 2, CAD: 2, AUD: 2, THB: 2 });
3319
+ var MAX_PAGE7 = 512 * 1024;
3320
+ var ATTRS = `(?:[^>"']|"[^"]{0,1024}"|'[^']{0,1024}'){0,512}`;
3321
+ var startTag = (name) => new RegExp(`<${name}(?=[\\t\\n\\f\\r />])${ATTRS}>`, "gi");
3322
+ var FORM_START = startTag("form");
3323
+ var INPUT_START = startTag("input");
3324
+ var SELECT_TAG = startTag("select");
3325
+ var OPTION_TAG = startTag("option");
3326
+ var BUTTON_TAG = startTag("button");
3327
+ var FIELDSET_TAG = startTag("fieldset");
3328
+ var XHR_HEADERS = Object.freeze({ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "X-Requested-With": "XMLHttpRequest" });
3329
+ var FORM_HEADERS2 = Object.freeze({ "Content-Type": "application/x-www-form-urlencoded" });
3330
+ var SKIPPED = Object.freeze([
3331
+ ["<!--", "-->", /<!--[\s\S]*?-->/g],
3332
+ ["<script", "</script", /<script\b[\s\S]*?<\/script\s*>/gi],
3333
+ ["<style", "</style", /<style\b[\s\S]*?<\/style\s*>/gi]
3334
+ ]);
3335
+ var CARD_KEYS_WINDOW = Object.freeze(["cardno1", "cardno2", "cardno3", "cardno4", "cardNum", "month", "year", "cvc"]);
3336
+ var WINDOW_FIELDS = /* @__PURE__ */ new Set([
3337
+ "paramkey",
3338
+ "cardcode",
3339
+ "channelCode",
3340
+ "issuerCountry",
3341
+ ...CARD_KEYS_WINDOW,
3342
+ "tel",
3343
+ "unioncardno",
3344
+ "unionoffcardno",
3345
+ "month_unionpay",
3346
+ "year_unionpay",
3347
+ "firstname",
3348
+ "lastname",
3349
+ "cvc_unionpay",
3350
+ "firstname_unionpay",
3351
+ "lastname_unionpay",
3352
+ "email",
3353
+ "shipTo_country",
3354
+ "shipTo_postalCode",
3355
+ "shipTo_city",
3356
+ "shipTo_street1"
3357
+ ]);
3358
+ var WRITTEN = /* @__PURE__ */ new Set(["cardcode", "issuerCountry", ...CARD_KEYS_WINDOW, "firstname", "lastname"]);
3359
+ var OTHER_CARD = Object.freeze(["unioncardno", "unionoffcardno", "month_unionpay", "year_unionpay", "cvc_unionpay"]);
3360
+ var BRANDS = Object.freeze({
3361
+ C000: /^4\d{15}$/,
3362
+ C001: /^(?:5[1-5]\d{14}|2(?:22[1-9]|2[3-9]\d|[3-6]\d{2}|7[01]\d|720)\d{12})$/,
3363
+ C002: /^3[47]\d{13}$/,
3364
+ C003: /^35(?:2[89]|[3-8]\d)\d{12}$/
3365
+ });
3366
+ var EXIMBAY_REFUSALS = Object.freeze(["eximbay_card_refused", "eximbay_3ds_challenge", "eximbay_declined"]);
3367
+ var RESULT_BINDS = Object.freeze(["mid", "txntype", "ref", "cur", "amt"]);
3368
+ // src/processors/barion.js
3369
+ var BARION_HOSTS = Object.freeze(["secure.barion.com", "secure.test.barion.com"]);
3370
+ var BARION_SANDBOX_HOSTS = Object.freeze(["secure.test.barion.com"]);
3371
+ var BARION_SHOPS = Object.freeze([]);
3372
+ var MAX_PAGE8 = 512 * 1024;
3373
+ var CURRENCIES5 = Object.freeze(["HUF", "EUR", "USD", "CZK", "RON", "PLN"]);
3374
+ var CARD_INPUTS = Object.freeze({ number: "cc-number", expiry: "cc-exp-date", cvc: "CardCVC", holder: "CardHolderName" });
3375
+ var CHECKBOXES = Object.freeze(["RegisterUser", "AcceptedTerms", "HasEmailConsent"]);
3376
+ var OTHER_INPUTS = Object.freeze({ FirstPassword: ["password"], RecaptchaToken: ["hidden"], __RequestVerificationToken: ["hidden"], Identifier: ["hidden"] });
3377
+ var BARION_AJAX_HEADERS = Object.freeze({
3378
+ Accept: "*/*",
3379
+ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
3380
+ "X-Requested-With": "XMLHttpRequest"
3381
+ });
3382
+ var CARD_TYPES2 = Object.freeze([{ prefix: /^4/, type: 20 }, { prefix: /^5[1-5]|^2[2-7]/, type: 10 }, { prefix: /^3[47]/, type: 30 }]);
3383
+ var COLOR_DEPTHS = Object.freeze([1, 4, 8, 15, 16, 24, 32, 48]);
3384
+ var BARION_REFUSALS = Object.freeze(["barion_declined", "barion_3ds_challenge", "barion_sca_soft_decline"]);
3385
+ var MAX_ANSWER2 = 64 * 1024;
3386
+ var DECLINE_CODES = Object.freeze([
3387
+ "CardError",
3388
+ "CardExpired",
3389
+ "MaximumCardPaymentAmountExceeded",
3390
+ "MinimumCardPaymentAmountNotReached",
3391
+ "PaymentExpired",
3392
+ "PaymentCancelled",
3393
+ "PaymentFailed",
3394
+ "ThreeDsNotEnabled",
3395
+ "ThreeDsAuthenticationFailed",
3396
+ "NoSuitableProviderFound",
3397
+ "EmailBelongsToValidUser",
3398
+ "InvalidEmailAddress",
3399
+ "CvcRequired",
3400
+ "CardHolderNameRequired",
3401
+ "CardRegistrationExpired",
3402
+ "StartPaymentError",
3403
+ "TheSourceAndDestinationAccountsAreMatched",
3404
+ "UserIsSuspended",
3405
+ "AccountSuspended"
3406
+ ]);
3407
+ var FRICTIONLESS_STATUSES = Object.freeze([0, 5, 7]);
2677
3408
  // src/recognition.js
2678
3409
  var PATTERN_WITHOUT_CARD_FIELDS = Object.freeze({
2679
3410
  stripe: "api\\.stripe\\.com/v1/(payment_methods|tokens|setup_intents/seti_\\w+/confirm|payment_intents/pi_\\w+/confirm)"
@@ -2864,18 +3595,18 @@ function parseStripeCheckoutContext(request) {
2864
3595
  if (entries.length !== 1 || typeof entries[0][1] !== "string" || !/^[A-Za-z0-9_-]{1,1024}$/.test(entries[0][1]))
2865
3596
  reject("context_invalid");
2866
3597
  const encoded = entries[0][1];
2867
- let text = "", bits = 0, count = 0;
3598
+ let text2 = "", bits = 0, count = 0;
2868
3599
  for (const char of encoded) {
2869
3600
  bits = bits << 6 | alphabet.indexOf(char);
2870
3601
  count += 6;
2871
3602
  if (count >= 8) {
2872
3603
  count -= 8;
2873
- text += String.fromCharCode(bits >>> count & 255);
3604
+ text2 += String.fromCharCode(bits >>> count & 255);
2874
3605
  }
2875
3606
  }
2876
3607
  let value;
2877
3608
  try {
2878
- value = context(JSON.parse(text));
3609
+ value = context(JSON.parse(text2));
2879
3610
  }
2880
3611
  catch {
2881
3612
  reject("context_invalid");