[{"data":1,"prerenderedAt":3230},["ShallowReactive",2],{"navigation_docs":3,"-quayel-gateway-plugins-firewall":91,"-quayel-gateway-plugins-firewall-surround":3225},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":90},"Quayel Gateway","i-lucide-network","\u002Fquayel-gateway","quayel-gateway",[10,29,68],{"title":11,"icon":12,"path":13,"stem":14,"children":15},"Getting Started","i-lucide-rocket","\u002Fquayel-gateway\u002Fgetting-started","quayel-gateway\u002F01.getting-started\u002Findex",[16,19,24],{"title":17,"path":13,"stem":14,"icon":18},"Introduction","i-lucide-book-open",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fquayel-gateway\u002Fgetting-started\u002Finstallation","quayel-gateway\u002F01.getting-started\u002F1.installation","i-lucide-container",{"title":25,"path":26,"stem":27,"icon":28},"Project Structure","\u002Fquayel-gateway\u002Fgetting-started\u002Fproject-structure","quayel-gateway\u002F01.getting-started\u002F2.project-structure","i-lucide-folder-tree",{"title":30,"icon":31,"path":32,"stem":33,"children":34},"Plugins","i-lucide-puzzle","\u002Fquayel-gateway\u002Fplugins","quayel-gateway\u002F02.plugins\u002Findex",[35,38,43,48,53,58,63],{"title":36,"path":32,"stem":33,"icon":37},"Overview","i-lucide-workflow",{"title":39,"path":40,"stem":41,"icon":42},"IP Intelligence","\u002Fquayel-gateway\u002Fplugins\u002Fip-intel","quayel-gateway\u002F02.plugins\u002F1.ip-intel","i-lucide-radar",{"title":44,"path":45,"stem":46,"icon":47},"Firewall","\u002Fquayel-gateway\u002Fplugins\u002Ffirewall","quayel-gateway\u002F02.plugins\u002F2.firewall","i-lucide-shield",{"title":49,"path":50,"stem":51,"icon":52},"Rate Limiting","\u002Fquayel-gateway\u002Fplugins\u002Frate-limiting","quayel-gateway\u002F02.plugins\u002F3.rate-limiting","i-lucide-gauge",{"title":54,"path":55,"stem":56,"icon":57},"Cache","\u002Fquayel-gateway\u002Fplugins\u002Fcache","quayel-gateway\u002F02.plugins\u002F4.cache","i-lucide-database",{"title":59,"path":60,"stem":61,"icon":62},"Load Balancer","\u002Fquayel-gateway\u002Fplugins\u002Fload-balancer","quayel-gateway\u002F02.plugins\u002F5.load-balancer","i-lucide-scale",{"title":64,"path":65,"stem":66,"icon":67},"Auto-SSL","\u002Fquayel-gateway\u002Fplugins\u002Fauto-ssl","quayel-gateway\u002F02.plugins\u002F6.auto-ssl","i-lucide-lock",{"title":69,"icon":70,"path":71,"stem":72,"children":73},"AI","i-lucide-bot","\u002Fquayel-gateway\u002Fai","quayel-gateway\u002F03.ai\u002Findex",[74,75,80,85],{"title":36,"path":71,"stem":72,"icon":70},{"title":76,"path":77,"stem":78,"icon":79},"The Quayel Gateway Skill","\u002Fquayel-gateway\u002Fai\u002Fskill","quayel-gateway\u002F03.ai\u002F1.skill","i-lucide-wand-sparkles",{"title":81,"path":82,"stem":83,"icon":84},"Installing the Skill","\u002Fquayel-gateway\u002Fai\u002Finstallation","quayel-gateway\u002F03.ai\u002F2.installation","i-lucide-download",{"title":86,"path":87,"stem":88,"icon":89},"AI Agent Guide","\u002Fquayel-gateway\u002Fai\u002Fagent-guide","quayel-gateway\u002F03.ai\u002F3.agent-guide","i-lucide-braces",false,{"id":92,"title":44,"body":93,"description":3218,"extension":3219,"links":3220,"meta":3221,"navigation":3222,"path":45,"seo":3223,"stem":46,"__hash__":3224},"docs\u002Fquayel-gateway\u002F02.plugins\u002F2.firewall.md",{"type":94,"value":95,"toc":3194},"minimark",[96,101,105,110,445,449,555,567,571,575,578,637,640,699,703,706,751,755,758,838,888,892,899,1001,1025,1041,1045,1048,1052,1059,1067,1071,1075,1249,1253,1475,1479,1649,1653,1851,1855,2094,2098,2272,2276,2474,2478,2488,2710,2714,3039,3043,3119,3122,3190],[97,98,100],"h1",{"id":99},"firewall-plugin","Firewall Plugin",[102,103,104],"p",{},"The firewall plugin evaluates conditions against every request and can allow, block, redirect, or modify headers. Rules are evaluated in order — first match wins.",[106,107,109],"h2",{"id":108},"configuration","Configuration",[111,112,117],"pre",{"className":113,"code":114,"language":115,"meta":116,"style":116},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"plugins\": {\n    \"firewall\": {\n      \"enabled\": true,\n      \"rules\": [\n        {\n          \"id\": \"rule-id\",\n          \"name\": \"Human readable name\",\n          \"enabled\": true,\n          \"conditions\": [\n            {\n              \"left\": \"req.path\",\n              \"operator\": \"starts_with\",\n              \"value\": \"\u002Fadmin\u002F\"\n            }\n          ],\n          \"action\": {\n            \"type\": \"block\",\n            \"status\": 403\n          }\n        }\n      ]\n    }\n  }\n}\n","json","",[118,119,120,129,148,164,181,196,202,228,249,262,276,282,305,326,346,352,358,372,394,409,415,421,427,433,439],"code",{"__ignoreMap":116},[121,122,125],"span",{"class":123,"line":124},"line",1,[121,126,128],{"class":127},"sMK4o","{\n",[121,130,132,135,139,142,145],{"class":123,"line":131},2,[121,133,134],{"class":127},"  \"",[121,136,138],{"class":137},"spNyl","plugins",[121,140,141],{"class":127},"\"",[121,143,144],{"class":127},":",[121,146,147],{"class":127}," {\n",[121,149,151,154,158,160,162],{"class":123,"line":150},3,[121,152,153],{"class":127},"    \"",[121,155,157],{"class":156},"sBMFI","firewall",[121,159,141],{"class":127},[121,161,144],{"class":127},[121,163,147],{"class":127},[121,165,167,170,174,176,178],{"class":123,"line":166},4,[121,168,169],{"class":127},"      \"",[121,171,173],{"class":172},"sbssI","enabled",[121,175,141],{"class":127},[121,177,144],{"class":127},[121,179,180],{"class":127}," true,\n",[121,182,184,186,189,191,193],{"class":123,"line":183},5,[121,185,169],{"class":127},[121,187,188],{"class":172},"rules",[121,190,141],{"class":127},[121,192,144],{"class":127},[121,194,195],{"class":127}," [\n",[121,197,199],{"class":123,"line":198},6,[121,200,201],{"class":127},"        {\n",[121,203,205,208,212,214,216,219,223,225],{"class":123,"line":204},7,[121,206,207],{"class":127},"          \"",[121,209,211],{"class":210},"swJcz","id",[121,213,141],{"class":127},[121,215,144],{"class":127},[121,217,218],{"class":127}," \"",[121,220,222],{"class":221},"sfazB","rule-id",[121,224,141],{"class":127},[121,226,227],{"class":127},",\n",[121,229,231,233,236,238,240,242,245,247],{"class":123,"line":230},8,[121,232,207],{"class":127},[121,234,235],{"class":210},"name",[121,237,141],{"class":127},[121,239,144],{"class":127},[121,241,218],{"class":127},[121,243,244],{"class":221},"Human readable name",[121,246,141],{"class":127},[121,248,227],{"class":127},[121,250,252,254,256,258,260],{"class":123,"line":251},9,[121,253,207],{"class":127},[121,255,173],{"class":210},[121,257,141],{"class":127},[121,259,144],{"class":127},[121,261,180],{"class":127},[121,263,265,267,270,272,274],{"class":123,"line":264},10,[121,266,207],{"class":127},[121,268,269],{"class":210},"conditions",[121,271,141],{"class":127},[121,273,144],{"class":127},[121,275,195],{"class":127},[121,277,279],{"class":123,"line":278},11,[121,280,281],{"class":127},"            {\n",[121,283,285,288,292,294,296,298,301,303],{"class":123,"line":284},12,[121,286,287],{"class":127},"              \"",[121,289,291],{"class":290},"su27w","left",[121,293,141],{"class":127},[121,295,144],{"class":127},[121,297,218],{"class":127},[121,299,300],{"class":221},"req.path",[121,302,141],{"class":127},[121,304,227],{"class":127},[121,306,308,310,313,315,317,319,322,324],{"class":123,"line":307},13,[121,309,287],{"class":127},[121,311,312],{"class":290},"operator",[121,314,141],{"class":127},[121,316,144],{"class":127},[121,318,218],{"class":127},[121,320,321],{"class":221},"starts_with",[121,323,141],{"class":127},[121,325,227],{"class":127},[121,327,329,331,334,336,338,340,343],{"class":123,"line":328},14,[121,330,287],{"class":127},[121,332,333],{"class":290},"value",[121,335,141],{"class":127},[121,337,144],{"class":127},[121,339,218],{"class":127},[121,341,342],{"class":221},"\u002Fadmin\u002F",[121,344,345],{"class":127},"\"\n",[121,347,349],{"class":123,"line":348},15,[121,350,351],{"class":127},"            }\n",[121,353,355],{"class":123,"line":354},16,[121,356,357],{"class":127},"          ],\n",[121,359,361,363,366,368,370],{"class":123,"line":360},17,[121,362,207],{"class":127},[121,364,365],{"class":210},"action",[121,367,141],{"class":127},[121,369,144],{"class":127},[121,371,147],{"class":127},[121,373,375,378,381,383,385,387,390,392],{"class":123,"line":374},18,[121,376,377],{"class":127},"            \"",[121,379,380],{"class":290},"type",[121,382,141],{"class":127},[121,384,144],{"class":127},[121,386,218],{"class":127},[121,388,389],{"class":221},"block",[121,391,141],{"class":127},[121,393,227],{"class":127},[121,395,397,399,402,404,406],{"class":123,"line":396},19,[121,398,377],{"class":127},[121,400,401],{"class":290},"status",[121,403,141],{"class":127},[121,405,144],{"class":127},[121,407,408],{"class":172}," 403\n",[121,410,412],{"class":123,"line":411},20,[121,413,414],{"class":127},"          }\n",[121,416,418],{"class":123,"line":417},21,[121,419,420],{"class":127},"        }\n",[121,422,424],{"class":123,"line":423},22,[121,425,426],{"class":127},"      ]\n",[121,428,430],{"class":123,"line":429},23,[121,431,432],{"class":127},"    }\n",[121,434,436],{"class":123,"line":435},24,[121,437,438],{"class":127},"  }\n",[121,440,442],{"class":123,"line":441},25,[121,443,444],{"class":127},"}\n",[106,446,448],{"id":447},"rule-structure","Rule structure",[450,451,452,471],"table",{},[453,454,455],"thead",{},[456,457,458,462,465,468],"tr",{},[459,460,461],"th",{},"Field",[459,463,464],{},"Type",[459,466,467],{},"Required",[459,469,470],{},"Description",[472,473,474,490,503,522,541],"tbody",{},[456,475,476,481,484,487],{},[477,478,479],"td",{},[118,480,211],{},[477,482,483],{},"string",[477,485,486],{},"✅",[477,488,489],{},"Unique rule identifier",[456,491,492,496,498,500],{},[477,493,494],{},[118,495,235],{},[477,497,483],{},[477,499,486],{},[477,501,502],{},"Human-readable name",[456,504,505,509,512,515],{},[477,506,507],{},[118,508,173],{},[477,510,511],{},"bool",[477,513,514],{},"—",[477,516,517,518,521],{},"Enable\u002Fdisable rule (default: ",[118,519,520],{},"true",")",[456,523,524,528,531,533],{},[477,525,526],{},[118,527,269],{},[477,529,530],{},"array",[477,532,486],{},[477,534,535,536,521],{},"Matching conditions (see ",[537,538,540],"a",{"href":539},"\u002Fquayel-gateway\u002Fconditions","Conditions",[456,542,543,547,550,552],{},[477,544,545],{},[118,546,365],{},[477,548,549],{},"object",[477,551,486],{},[477,553,554],{},"Action to take when conditions match",[556,557,558,559,561,562,566],"caution",{},"Firewall rules with empty ",[118,560,269],{}," are ",[563,564,565],"strong",{},"rejected"," at startup (unlike rate limit rules, where empty conditions mean \"always\"). A firewall rule must always state when it applies.",[106,568,570],{"id":569},"actions","Actions",[572,573,574],"h3",{"id":389},"Block",[102,576,577],{},"Returns an error response and stops the pipeline.",[111,579,581],{"className":113,"code":580,"language":115,"meta":116,"style":116},"{\n  \"action\": {\n    \"type\": \"block\",\n    \"status\": 403\n  }\n}\n",[118,582,583,587,599,617,629,633],{"__ignoreMap":116},[121,584,585],{"class":123,"line":124},[121,586,128],{"class":127},[121,588,589,591,593,595,597],{"class":123,"line":131},[121,590,134],{"class":127},[121,592,365],{"class":137},[121,594,141],{"class":127},[121,596,144],{"class":127},[121,598,147],{"class":127},[121,600,601,603,605,607,609,611,613,615],{"class":123,"line":150},[121,602,153],{"class":127},[121,604,380],{"class":156},[121,606,141],{"class":127},[121,608,144],{"class":127},[121,610,218],{"class":127},[121,612,389],{"class":221},[121,614,141],{"class":127},[121,616,227],{"class":127},[121,618,619,621,623,625,627],{"class":123,"line":166},[121,620,153],{"class":127},[121,622,401],{"class":156},[121,624,141],{"class":127},[121,626,144],{"class":127},[121,628,408],{"class":172},[121,630,631],{"class":123,"line":183},[121,632,438],{"class":127},[121,634,635],{"class":123,"line":198},[121,636,444],{"class":127},[102,638,639],{},"Response body:",[111,641,643],{"className":113,"code":642,"language":115,"meta":116,"style":116},"{\"error\": \"blocked\", \"status\": 403, \"rule_id\": \"rule-id\"}\n",[118,644,645],{"__ignoreMap":116},[121,646,647,650,652,655,657,659,661,664,666,669,671,673,675,677,680,682,684,687,689,691,693,695,697],{"class":123,"line":124},[121,648,649],{"class":127},"{",[121,651,141],{"class":127},[121,653,654],{"class":137},"error",[121,656,141],{"class":127},[121,658,144],{"class":127},[121,660,218],{"class":127},[121,662,663],{"class":221},"blocked",[121,665,141],{"class":127},[121,667,668],{"class":127},",",[121,670,218],{"class":127},[121,672,401],{"class":137},[121,674,141],{"class":127},[121,676,144],{"class":127},[121,678,679],{"class":172}," 403",[121,681,668],{"class":127},[121,683,218],{"class":127},[121,685,686],{"class":137},"rule_id",[121,688,141],{"class":127},[121,690,144],{"class":127},[121,692,218],{"class":127},[121,694,222],{"class":221},[121,696,141],{"class":127},[121,698,444],{"class":127},[572,700,702],{"id":701},"allow","Allow",[102,704,705],{},"Continues the pipeline (skips remaining firewall rules). Useful for whitelisting.",[111,707,709],{"className":113,"code":708,"language":115,"meta":116,"style":116},"{\n  \"action\": {\n    \"type\": \"allow\"\n  }\n}\n",[118,710,711,715,727,743,747],{"__ignoreMap":116},[121,712,713],{"class":123,"line":124},[121,714,128],{"class":127},[121,716,717,719,721,723,725],{"class":123,"line":131},[121,718,134],{"class":127},[121,720,365],{"class":137},[121,722,141],{"class":127},[121,724,144],{"class":127},[121,726,147],{"class":127},[121,728,729,731,733,735,737,739,741],{"class":123,"line":150},[121,730,153],{"class":127},[121,732,380],{"class":156},[121,734,141],{"class":127},[121,736,144],{"class":127},[121,738,218],{"class":127},[121,740,701],{"class":221},[121,742,345],{"class":127},[121,744,745],{"class":123,"line":166},[121,746,438],{"class":127},[121,748,749],{"class":123,"line":183},[121,750,444],{"class":127},[572,752,754],{"id":753},"redirect","Redirect",[102,756,757],{},"Returns a redirect response.",[111,759,761],{"className":113,"code":760,"language":115,"meta":116,"style":116},"{\n  \"action\": {\n    \"type\": \"redirect\",\n    \"status\": 302,\n    \"location\": \"https:\u002F\u002Fexample.com\u002Fblocked\"\n  }\n}\n",[118,762,763,767,779,797,812,830,834],{"__ignoreMap":116},[121,764,765],{"class":123,"line":124},[121,766,128],{"class":127},[121,768,769,771,773,775,777],{"class":123,"line":131},[121,770,134],{"class":127},[121,772,365],{"class":137},[121,774,141],{"class":127},[121,776,144],{"class":127},[121,778,147],{"class":127},[121,780,781,783,785,787,789,791,793,795],{"class":123,"line":150},[121,782,153],{"class":127},[121,784,380],{"class":156},[121,786,141],{"class":127},[121,788,144],{"class":127},[121,790,218],{"class":127},[121,792,753],{"class":221},[121,794,141],{"class":127},[121,796,227],{"class":127},[121,798,799,801,803,805,807,810],{"class":123,"line":166},[121,800,153],{"class":127},[121,802,401],{"class":156},[121,804,141],{"class":127},[121,806,144],{"class":127},[121,808,809],{"class":172}," 302",[121,811,227],{"class":127},[121,813,814,816,819,821,823,825,828],{"class":123,"line":183},[121,815,153],{"class":127},[121,817,818],{"class":156},"location",[121,820,141],{"class":127},[121,822,144],{"class":127},[121,824,218],{"class":127},[121,826,827],{"class":221},"https:\u002F\u002Fexample.com\u002Fblocked",[121,829,345],{"class":127},[121,831,832],{"class":123,"line":198},[121,833,438],{"class":127},[121,835,836],{"class":123,"line":204},[121,837,444],{"class":127},[450,839,840,853],{},[453,841,842],{},[456,843,844,846,848,851],{},[459,845,461],{},[459,847,464],{},[459,849,850],{},"Default",[459,852,470],{},[472,854,855,872],{},[456,856,857,861,864,869],{},[477,858,859],{},[118,860,401],{},[477,862,863],{},"int",[477,865,866],{},[118,867,868],{},"302",[477,870,871],{},"HTTP redirect status code",[456,873,874,878,880,885],{},[477,875,876],{},[118,877,818],{},[477,879,483],{},[477,881,882],{},[118,883,884],{},"\"\u002F\"",[477,886,887],{},"Redirect destination URL",[572,889,891],{"id":890},"set-request-header","Set request header",[102,893,894,895,898],{},"Injects headers into the ",[563,896,897],{},"request context"," for later plugins. The request continues to the upstream unchanged by this action.",[111,900,902],{"className":113,"code":901,"language":115,"meta":116,"style":116},"{\n  \"action\": {\n    \"type\": \"set_request_header\",\n    \"headers\": {\n      \"X-Custom-Header\": \"value\",\n      \"X-Client-Country\": \"${ip.country}\"\n    }\n  }\n}\n",[118,903,904,908,920,939,952,971,989,993,997],{"__ignoreMap":116},[121,905,906],{"class":123,"line":124},[121,907,128],{"class":127},[121,909,910,912,914,916,918],{"class":123,"line":131},[121,911,134],{"class":127},[121,913,365],{"class":137},[121,915,141],{"class":127},[121,917,144],{"class":127},[121,919,147],{"class":127},[121,921,922,924,926,928,930,932,935,937],{"class":123,"line":150},[121,923,153],{"class":127},[121,925,380],{"class":156},[121,927,141],{"class":127},[121,929,144],{"class":127},[121,931,218],{"class":127},[121,933,934],{"class":221},"set_request_header",[121,936,141],{"class":127},[121,938,227],{"class":127},[121,940,941,943,946,948,950],{"class":123,"line":166},[121,942,153],{"class":127},[121,944,945],{"class":156},"headers",[121,947,141],{"class":127},[121,949,144],{"class":127},[121,951,147],{"class":127},[121,953,954,956,959,961,963,965,967,969],{"class":123,"line":183},[121,955,169],{"class":127},[121,957,958],{"class":172},"X-Custom-Header",[121,960,141],{"class":127},[121,962,144],{"class":127},[121,964,218],{"class":127},[121,966,333],{"class":221},[121,968,141],{"class":127},[121,970,227],{"class":127},[121,972,973,975,978,980,982,984,987],{"class":123,"line":198},[121,974,169],{"class":127},[121,976,977],{"class":172},"X-Client-Country",[121,979,141],{"class":127},[121,981,144],{"class":127},[121,983,218],{"class":127},[121,985,986],{"class":221},"${ip.country}",[121,988,345],{"class":127},[121,990,991],{"class":123,"line":204},[121,992,432],{"class":127},[121,994,995],{"class":123,"line":230},[121,996,438],{"class":127},[121,998,999],{"class":123,"line":251},[121,1000,444],{"class":127},[102,1002,1003,1004,1008,1009,1012,1013,1016,1017,1020,1021,1024],{},"Injected headers are visible to everything downstream in the pipeline — condition\nresolution, ",[537,1005,1007],{"href":1006},"\u002Fquayel-gateway\u002Fplugins\u002Frate-limiting#rate-limit-keys","rate-limit keys",", and cache\nkeys — but are ",[563,1010,1011],{},"not"," written to the upstream request. (The gateway adds its own\n",[118,1014,1015],{},"X-Forwarded-Proto",", ",[118,1018,1019],{},"X-Forwarded-Host",", and ",[118,1022,1023],{},"X-Forwarded-For"," headers upstream.)",[1026,1027,1028,1029,1031,1032,1035,1036,1040],"note",{},"This makes ",[118,1030,934],{}," a request-context tagging tool: annotate a request with\n",[118,1033,1034],{},"x-risk-tier: high"," in the firewall, then key a rate limit or cache rule on it. The\n",[537,1037,1039],{"href":1038},"\u002Fquayel-gateway\u002Ftesting#verified-behaviors","Test suite"," verifies this visibility with a\ndedicated probe.",[572,1042,1044],{"id":1043},"set-response-header","Set response header",[102,1046,1047],{},"Reserved for future use. The rule matches and is logged, but no response header is\ncurrently set on the wire.",[106,1049,1051],{"id":1050},"rule-evaluation","Rule evaluation",[102,1053,1054,1055,1058],{},"Rules are evaluated ",[563,1056,1057],{},"in order",". The first matching rule wins:",[111,1060,1065],{"className":1061,"code":1063,"language":1064},[1062],"language-text","Request\n  │\n  ├── Rule 1: conditions match?\n  │   ├── YES → execute action → DONE\n  │   └── NO → continue\n  │\n  ├── Rule 2: conditions match?\n  │   ├── YES → execute action → DONE\n  │   └── NO → continue\n  │\n  └── No rules matched → Continue to next plugin\n","text",[118,1066,1063],{"__ignoreMap":116},[106,1068,1070],{"id":1069},"examples","Examples",[572,1072,1074],{"id":1073},"block-tor-exit-nodes","Block Tor exit nodes",[111,1076,1078],{"className":113,"code":1077,"language":115,"meta":116,"style":116},"{\n  \"id\": \"block-tor\",\n  \"name\": \"Block Tor Exit Nodes\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"ip.is_tor\", \"operator\": \"equals\", \"value\": true }\n  ],\n  \"action\": { \"type\": \"block\", \"status\": 403 }\n}\n",[118,1079,1080,1084,1103,1122,1134,1146,1199,1204,1245],{"__ignoreMap":116},[121,1081,1082],{"class":123,"line":124},[121,1083,128],{"class":127},[121,1085,1086,1088,1090,1092,1094,1096,1099,1101],{"class":123,"line":131},[121,1087,134],{"class":127},[121,1089,211],{"class":137},[121,1091,141],{"class":127},[121,1093,144],{"class":127},[121,1095,218],{"class":127},[121,1097,1098],{"class":221},"block-tor",[121,1100,141],{"class":127},[121,1102,227],{"class":127},[121,1104,1105,1107,1109,1111,1113,1115,1118,1120],{"class":123,"line":150},[121,1106,134],{"class":127},[121,1108,235],{"class":137},[121,1110,141],{"class":127},[121,1112,144],{"class":127},[121,1114,218],{"class":127},[121,1116,1117],{"class":221},"Block Tor Exit Nodes",[121,1119,141],{"class":127},[121,1121,227],{"class":127},[121,1123,1124,1126,1128,1130,1132],{"class":123,"line":166},[121,1125,134],{"class":127},[121,1127,173],{"class":137},[121,1129,141],{"class":127},[121,1131,144],{"class":127},[121,1133,180],{"class":127},[121,1135,1136,1138,1140,1142,1144],{"class":123,"line":183},[121,1137,134],{"class":127},[121,1139,269],{"class":137},[121,1141,141],{"class":127},[121,1143,144],{"class":127},[121,1145,195],{"class":127},[121,1147,1148,1151,1153,1155,1157,1159,1161,1164,1166,1168,1170,1172,1174,1176,1178,1181,1183,1185,1187,1189,1191,1193,1196],{"class":123,"line":198},[121,1149,1150],{"class":127},"    {",[121,1152,218],{"class":127},[121,1154,291],{"class":156},[121,1156,141],{"class":127},[121,1158,144],{"class":127},[121,1160,218],{"class":127},[121,1162,1163],{"class":221},"ip.is_tor",[121,1165,141],{"class":127},[121,1167,668],{"class":127},[121,1169,218],{"class":127},[121,1171,312],{"class":156},[121,1173,141],{"class":127},[121,1175,144],{"class":127},[121,1177,218],{"class":127},[121,1179,1180],{"class":221},"equals",[121,1182,141],{"class":127},[121,1184,668],{"class":127},[121,1186,218],{"class":127},[121,1188,333],{"class":156},[121,1190,141],{"class":127},[121,1192,144],{"class":127},[121,1194,1195],{"class":127}," true",[121,1197,1198],{"class":127}," }\n",[121,1200,1201],{"class":123,"line":204},[121,1202,1203],{"class":127},"  ],\n",[121,1205,1206,1208,1210,1212,1214,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235,1237,1239,1241,1243],{"class":123,"line":230},[121,1207,134],{"class":127},[121,1209,365],{"class":137},[121,1211,141],{"class":127},[121,1213,144],{"class":127},[121,1215,1216],{"class":127}," {",[121,1218,218],{"class":127},[121,1220,380],{"class":156},[121,1222,141],{"class":127},[121,1224,144],{"class":127},[121,1226,218],{"class":127},[121,1228,389],{"class":221},[121,1230,141],{"class":127},[121,1232,668],{"class":127},[121,1234,218],{"class":127},[121,1236,401],{"class":156},[121,1238,141],{"class":127},[121,1240,144],{"class":127},[121,1242,679],{"class":172},[121,1244,1198],{"class":127},[121,1246,1247],{"class":123,"line":251},[121,1248,444],{"class":127},[572,1250,1252],{"id":1251},"block-vpn-on-login-endpoints","Block VPN on login endpoints",[111,1254,1256],{"className":113,"code":1255,"language":115,"meta":116,"style":116},"{\n  \"id\": \"block-vpn-login\",\n  \"name\": \"Block VPN on Login\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"req.path\", \"operator\": \"starts_with\", \"value\": \"\u002Fauth\u002F\" },\n    { \"left\": \"ip.is_vpn\", \"operator\": \"equals\", \"value\": true }\n  ],\n  \"action\": { \"type\": \"block\", \"status\": 403 }\n}\n",[118,1257,1258,1262,1281,1300,1312,1324,1378,1427,1431,1471],{"__ignoreMap":116},[121,1259,1260],{"class":123,"line":124},[121,1261,128],{"class":127},[121,1263,1264,1266,1268,1270,1272,1274,1277,1279],{"class":123,"line":131},[121,1265,134],{"class":127},[121,1267,211],{"class":137},[121,1269,141],{"class":127},[121,1271,144],{"class":127},[121,1273,218],{"class":127},[121,1275,1276],{"class":221},"block-vpn-login",[121,1278,141],{"class":127},[121,1280,227],{"class":127},[121,1282,1283,1285,1287,1289,1291,1293,1296,1298],{"class":123,"line":150},[121,1284,134],{"class":127},[121,1286,235],{"class":137},[121,1288,141],{"class":127},[121,1290,144],{"class":127},[121,1292,218],{"class":127},[121,1294,1295],{"class":221},"Block VPN on Login",[121,1297,141],{"class":127},[121,1299,227],{"class":127},[121,1301,1302,1304,1306,1308,1310],{"class":123,"line":166},[121,1303,134],{"class":127},[121,1305,173],{"class":137},[121,1307,141],{"class":127},[121,1309,144],{"class":127},[121,1311,180],{"class":127},[121,1313,1314,1316,1318,1320,1322],{"class":123,"line":183},[121,1315,134],{"class":127},[121,1317,269],{"class":137},[121,1319,141],{"class":127},[121,1321,144],{"class":127},[121,1323,195],{"class":127},[121,1325,1326,1328,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348,1350,1352,1354,1356,1358,1360,1362,1364,1366,1368,1370,1373,1375],{"class":123,"line":198},[121,1327,1150],{"class":127},[121,1329,218],{"class":127},[121,1331,291],{"class":156},[121,1333,141],{"class":127},[121,1335,144],{"class":127},[121,1337,218],{"class":127},[121,1339,300],{"class":221},[121,1341,141],{"class":127},[121,1343,668],{"class":127},[121,1345,218],{"class":127},[121,1347,312],{"class":156},[121,1349,141],{"class":127},[121,1351,144],{"class":127},[121,1353,218],{"class":127},[121,1355,321],{"class":221},[121,1357,141],{"class":127},[121,1359,668],{"class":127},[121,1361,218],{"class":127},[121,1363,333],{"class":156},[121,1365,141],{"class":127},[121,1367,144],{"class":127},[121,1369,218],{"class":127},[121,1371,1372],{"class":221},"\u002Fauth\u002F",[121,1374,141],{"class":127},[121,1376,1377],{"class":127}," },\n",[121,1379,1380,1382,1384,1386,1388,1390,1392,1395,1397,1399,1401,1403,1405,1407,1409,1411,1413,1415,1417,1419,1421,1423,1425],{"class":123,"line":204},[121,1381,1150],{"class":127},[121,1383,218],{"class":127},[121,1385,291],{"class":156},[121,1387,141],{"class":127},[121,1389,144],{"class":127},[121,1391,218],{"class":127},[121,1393,1394],{"class":221},"ip.is_vpn",[121,1396,141],{"class":127},[121,1398,668],{"class":127},[121,1400,218],{"class":127},[121,1402,312],{"class":156},[121,1404,141],{"class":127},[121,1406,144],{"class":127},[121,1408,218],{"class":127},[121,1410,1180],{"class":221},[121,1412,141],{"class":127},[121,1414,668],{"class":127},[121,1416,218],{"class":127},[121,1418,333],{"class":156},[121,1420,141],{"class":127},[121,1422,144],{"class":127},[121,1424,1195],{"class":127},[121,1426,1198],{"class":127},[121,1428,1429],{"class":123,"line":230},[121,1430,1203],{"class":127},[121,1432,1433,1435,1437,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469],{"class":123,"line":251},[121,1434,134],{"class":127},[121,1436,365],{"class":137},[121,1438,141],{"class":127},[121,1440,144],{"class":127},[121,1442,1216],{"class":127},[121,1444,218],{"class":127},[121,1446,380],{"class":156},[121,1448,141],{"class":127},[121,1450,144],{"class":127},[121,1452,218],{"class":127},[121,1454,389],{"class":221},[121,1456,141],{"class":127},[121,1458,668],{"class":127},[121,1460,218],{"class":127},[121,1462,401],{"class":156},[121,1464,141],{"class":127},[121,1466,144],{"class":127},[121,1468,679],{"class":172},[121,1470,1198],{"class":127},[121,1472,1473],{"class":123,"line":264},[121,1474,444],{"class":127},[572,1476,1478],{"id":1477},"block-high-risk-ips","Block high-risk IPs",[111,1480,1482],{"className":113,"code":1481,"language":115,"meta":116,"style":116},"{\n  \"id\": \"block-high-risk\",\n  \"name\": \"Block High Risk IPs\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"ip.risk_score\", \"operator\": \"greater_than\", \"value\": 40 }\n  ],\n  \"action\": { \"type\": \"block\", \"status\": 403 }\n}\n",[118,1483,1484,1488,1507,1526,1538,1550,1601,1605,1645],{"__ignoreMap":116},[121,1485,1486],{"class":123,"line":124},[121,1487,128],{"class":127},[121,1489,1490,1492,1494,1496,1498,1500,1503,1505],{"class":123,"line":131},[121,1491,134],{"class":127},[121,1493,211],{"class":137},[121,1495,141],{"class":127},[121,1497,144],{"class":127},[121,1499,218],{"class":127},[121,1501,1502],{"class":221},"block-high-risk",[121,1504,141],{"class":127},[121,1506,227],{"class":127},[121,1508,1509,1511,1513,1515,1517,1519,1522,1524],{"class":123,"line":150},[121,1510,134],{"class":127},[121,1512,235],{"class":137},[121,1514,141],{"class":127},[121,1516,144],{"class":127},[121,1518,218],{"class":127},[121,1520,1521],{"class":221},"Block High Risk IPs",[121,1523,141],{"class":127},[121,1525,227],{"class":127},[121,1527,1528,1530,1532,1534,1536],{"class":123,"line":166},[121,1529,134],{"class":127},[121,1531,173],{"class":137},[121,1533,141],{"class":127},[121,1535,144],{"class":127},[121,1537,180],{"class":127},[121,1539,1540,1542,1544,1546,1548],{"class":123,"line":183},[121,1541,134],{"class":127},[121,1543,269],{"class":137},[121,1545,141],{"class":127},[121,1547,144],{"class":127},[121,1549,195],{"class":127},[121,1551,1552,1554,1556,1558,1560,1562,1564,1567,1569,1571,1573,1575,1577,1579,1581,1584,1586,1588,1590,1592,1594,1596,1599],{"class":123,"line":198},[121,1553,1150],{"class":127},[121,1555,218],{"class":127},[121,1557,291],{"class":156},[121,1559,141],{"class":127},[121,1561,144],{"class":127},[121,1563,218],{"class":127},[121,1565,1566],{"class":221},"ip.risk_score",[121,1568,141],{"class":127},[121,1570,668],{"class":127},[121,1572,218],{"class":127},[121,1574,312],{"class":156},[121,1576,141],{"class":127},[121,1578,144],{"class":127},[121,1580,218],{"class":127},[121,1582,1583],{"class":221},"greater_than",[121,1585,141],{"class":127},[121,1587,668],{"class":127},[121,1589,218],{"class":127},[121,1591,333],{"class":156},[121,1593,141],{"class":127},[121,1595,144],{"class":127},[121,1597,1598],{"class":172}," 40",[121,1600,1198],{"class":127},[121,1602,1603],{"class":123,"line":204},[121,1604,1203],{"class":127},[121,1606,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627,1629,1631,1633,1635,1637,1639,1641,1643],{"class":123,"line":230},[121,1608,134],{"class":127},[121,1610,365],{"class":137},[121,1612,141],{"class":127},[121,1614,144],{"class":127},[121,1616,1216],{"class":127},[121,1618,218],{"class":127},[121,1620,380],{"class":156},[121,1622,141],{"class":127},[121,1624,144],{"class":127},[121,1626,218],{"class":127},[121,1628,389],{"class":221},[121,1630,141],{"class":127},[121,1632,668],{"class":127},[121,1634,218],{"class":127},[121,1636,401],{"class":156},[121,1638,141],{"class":127},[121,1640,144],{"class":127},[121,1642,679],{"class":172},[121,1644,1198],{"class":127},[121,1646,1647],{"class":123,"line":251},[121,1648,444],{"class":127},[572,1650,1652],{"id":1651},"geo-block-countries","Geo-block countries",[111,1654,1656],{"className":113,"code":1655,"language":115,"meta":116,"style":116},"{\n  \"id\": \"geo-block\",\n  \"name\": \"Block specific countries\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"ip.country\", \"operator\": \"in\", \"value\": [\"CN\", \"RU\", \"KP\"] }\n  ],\n  \"action\": { \"type\": \"block\", \"status\": 403 }\n}\n",[118,1657,1658,1662,1681,1700,1712,1724,1803,1807,1847],{"__ignoreMap":116},[121,1659,1660],{"class":123,"line":124},[121,1661,128],{"class":127},[121,1663,1664,1666,1668,1670,1672,1674,1677,1679],{"class":123,"line":131},[121,1665,134],{"class":127},[121,1667,211],{"class":137},[121,1669,141],{"class":127},[121,1671,144],{"class":127},[121,1673,218],{"class":127},[121,1675,1676],{"class":221},"geo-block",[121,1678,141],{"class":127},[121,1680,227],{"class":127},[121,1682,1683,1685,1687,1689,1691,1693,1696,1698],{"class":123,"line":150},[121,1684,134],{"class":127},[121,1686,235],{"class":137},[121,1688,141],{"class":127},[121,1690,144],{"class":127},[121,1692,218],{"class":127},[121,1694,1695],{"class":221},"Block specific countries",[121,1697,141],{"class":127},[121,1699,227],{"class":127},[121,1701,1702,1704,1706,1708,1710],{"class":123,"line":166},[121,1703,134],{"class":127},[121,1705,173],{"class":137},[121,1707,141],{"class":127},[121,1709,144],{"class":127},[121,1711,180],{"class":127},[121,1713,1714,1716,1718,1720,1722],{"class":123,"line":183},[121,1715,134],{"class":127},[121,1717,269],{"class":137},[121,1719,141],{"class":127},[121,1721,144],{"class":127},[121,1723,195],{"class":127},[121,1725,1726,1728,1730,1732,1734,1736,1738,1741,1743,1745,1747,1749,1751,1753,1755,1758,1760,1762,1764,1766,1768,1770,1773,1775,1778,1780,1782,1784,1787,1789,1791,1793,1796,1798,1801],{"class":123,"line":198},[121,1727,1150],{"class":127},[121,1729,218],{"class":127},[121,1731,291],{"class":156},[121,1733,141],{"class":127},[121,1735,144],{"class":127},[121,1737,218],{"class":127},[121,1739,1740],{"class":221},"ip.country",[121,1742,141],{"class":127},[121,1744,668],{"class":127},[121,1746,218],{"class":127},[121,1748,312],{"class":156},[121,1750,141],{"class":127},[121,1752,144],{"class":127},[121,1754,218],{"class":127},[121,1756,1757],{"class":221},"in",[121,1759,141],{"class":127},[121,1761,668],{"class":127},[121,1763,218],{"class":127},[121,1765,333],{"class":156},[121,1767,141],{"class":127},[121,1769,144],{"class":127},[121,1771,1772],{"class":127}," [",[121,1774,141],{"class":127},[121,1776,1777],{"class":221},"CN",[121,1779,141],{"class":127},[121,1781,668],{"class":127},[121,1783,218],{"class":127},[121,1785,1786],{"class":221},"RU",[121,1788,141],{"class":127},[121,1790,668],{"class":127},[121,1792,218],{"class":127},[121,1794,1795],{"class":221},"KP",[121,1797,141],{"class":127},[121,1799,1800],{"class":127},"]",[121,1802,1198],{"class":127},[121,1804,1805],{"class":123,"line":204},[121,1806,1203],{"class":127},[121,1808,1809,1811,1813,1815,1817,1819,1821,1823,1825,1827,1829,1831,1833,1835,1837,1839,1841,1843,1845],{"class":123,"line":230},[121,1810,134],{"class":127},[121,1812,365],{"class":137},[121,1814,141],{"class":127},[121,1816,144],{"class":127},[121,1818,1216],{"class":127},[121,1820,218],{"class":127},[121,1822,380],{"class":156},[121,1824,141],{"class":127},[121,1826,144],{"class":127},[121,1828,218],{"class":127},[121,1830,389],{"class":221},[121,1832,141],{"class":127},[121,1834,668],{"class":127},[121,1836,218],{"class":127},[121,1838,401],{"class":156},[121,1840,141],{"class":127},[121,1842,144],{"class":127},[121,1844,679],{"class":172},[121,1846,1198],{"class":127},[121,1848,1849],{"class":123,"line":251},[121,1850,444],{"class":127},[572,1852,1854],{"id":1853},"allow-admin-access-from-specific-ips","Allow admin access from specific IPs",[111,1856,1858],{"className":113,"code":1857,"language":115,"meta":116,"style":116},"{\n  \"id\": \"allow-admin-whitelist\",\n  \"name\": \"Allow Admin Whitelist\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"req.path\", \"operator\": \"starts_with\", \"value\": \"\u002Fadmin\u002F\" },\n    { \"left\": \"req.ip\", \"operator\": \"not_in\", \"value\": [\"10.0.0.1\", \"10.0.0.2\"] }\n  ],\n  \"action\": { \"type\": \"block\", \"status\": 403 }\n}\n",[118,1859,1860,1864,1883,1902,1914,1926,1978,2046,2050,2090],{"__ignoreMap":116},[121,1861,1862],{"class":123,"line":124},[121,1863,128],{"class":127},[121,1865,1866,1868,1870,1872,1874,1876,1879,1881],{"class":123,"line":131},[121,1867,134],{"class":127},[121,1869,211],{"class":137},[121,1871,141],{"class":127},[121,1873,144],{"class":127},[121,1875,218],{"class":127},[121,1877,1878],{"class":221},"allow-admin-whitelist",[121,1880,141],{"class":127},[121,1882,227],{"class":127},[121,1884,1885,1887,1889,1891,1893,1895,1898,1900],{"class":123,"line":150},[121,1886,134],{"class":127},[121,1888,235],{"class":137},[121,1890,141],{"class":127},[121,1892,144],{"class":127},[121,1894,218],{"class":127},[121,1896,1897],{"class":221},"Allow Admin Whitelist",[121,1899,141],{"class":127},[121,1901,227],{"class":127},[121,1903,1904,1906,1908,1910,1912],{"class":123,"line":166},[121,1905,134],{"class":127},[121,1907,173],{"class":137},[121,1909,141],{"class":127},[121,1911,144],{"class":127},[121,1913,180],{"class":127},[121,1915,1916,1918,1920,1922,1924],{"class":123,"line":183},[121,1917,134],{"class":127},[121,1919,269],{"class":137},[121,1921,141],{"class":127},[121,1923,144],{"class":127},[121,1925,195],{"class":127},[121,1927,1928,1930,1932,1934,1936,1938,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966,1968,1970,1972,1974,1976],{"class":123,"line":198},[121,1929,1150],{"class":127},[121,1931,218],{"class":127},[121,1933,291],{"class":156},[121,1935,141],{"class":127},[121,1937,144],{"class":127},[121,1939,218],{"class":127},[121,1941,300],{"class":221},[121,1943,141],{"class":127},[121,1945,668],{"class":127},[121,1947,218],{"class":127},[121,1949,312],{"class":156},[121,1951,141],{"class":127},[121,1953,144],{"class":127},[121,1955,218],{"class":127},[121,1957,321],{"class":221},[121,1959,141],{"class":127},[121,1961,668],{"class":127},[121,1963,218],{"class":127},[121,1965,333],{"class":156},[121,1967,141],{"class":127},[121,1969,144],{"class":127},[121,1971,218],{"class":127},[121,1973,342],{"class":221},[121,1975,141],{"class":127},[121,1977,1377],{"class":127},[121,1979,1980,1982,1984,1986,1988,1990,1992,1995,1997,1999,2001,2003,2005,2007,2009,2012,2014,2016,2018,2020,2022,2024,2026,2028,2031,2033,2035,2037,2040,2042,2044],{"class":123,"line":204},[121,1981,1150],{"class":127},[121,1983,218],{"class":127},[121,1985,291],{"class":156},[121,1987,141],{"class":127},[121,1989,144],{"class":127},[121,1991,218],{"class":127},[121,1993,1994],{"class":221},"req.ip",[121,1996,141],{"class":127},[121,1998,668],{"class":127},[121,2000,218],{"class":127},[121,2002,312],{"class":156},[121,2004,141],{"class":127},[121,2006,144],{"class":127},[121,2008,218],{"class":127},[121,2010,2011],{"class":221},"not_in",[121,2013,141],{"class":127},[121,2015,668],{"class":127},[121,2017,218],{"class":127},[121,2019,333],{"class":156},[121,2021,141],{"class":127},[121,2023,144],{"class":127},[121,2025,1772],{"class":127},[121,2027,141],{"class":127},[121,2029,2030],{"class":221},"10.0.0.1",[121,2032,141],{"class":127},[121,2034,668],{"class":127},[121,2036,218],{"class":127},[121,2038,2039],{"class":221},"10.0.0.2",[121,2041,141],{"class":127},[121,2043,1800],{"class":127},[121,2045,1198],{"class":127},[121,2047,2048],{"class":123,"line":230},[121,2049,1203],{"class":127},[121,2051,2052,2054,2056,2058,2060,2062,2064,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088],{"class":123,"line":251},[121,2053,134],{"class":127},[121,2055,365],{"class":137},[121,2057,141],{"class":127},[121,2059,144],{"class":127},[121,2061,1216],{"class":127},[121,2063,218],{"class":127},[121,2065,380],{"class":156},[121,2067,141],{"class":127},[121,2069,144],{"class":127},[121,2071,218],{"class":127},[121,2073,389],{"class":221},[121,2075,141],{"class":127},[121,2077,668],{"class":127},[121,2079,218],{"class":127},[121,2081,401],{"class":156},[121,2083,141],{"class":127},[121,2085,144],{"class":127},[121,2087,679],{"class":172},[121,2089,1198],{"class":127},[121,2091,2092],{"class":123,"line":264},[121,2093,444],{"class":127},[572,2095,2097],{"id":2096},"block-by-user-agent","Block by User-Agent",[111,2099,2101],{"className":113,"code":2100,"language":115,"meta":116,"style":116},"{\n  \"id\": \"block-bots\",\n  \"name\": \"Block known bots\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"req.user_agent\", \"operator\": \"regex\", \"value\": \"(?i)(bot|crawler|spider|scraper)\" }\n  ],\n  \"action\": { \"type\": \"block\", \"status\": 403 }\n}\n",[118,2102,2103,2107,2126,2145,2157,2169,2224,2228,2268],{"__ignoreMap":116},[121,2104,2105],{"class":123,"line":124},[121,2106,128],{"class":127},[121,2108,2109,2111,2113,2115,2117,2119,2122,2124],{"class":123,"line":131},[121,2110,134],{"class":127},[121,2112,211],{"class":137},[121,2114,141],{"class":127},[121,2116,144],{"class":127},[121,2118,218],{"class":127},[121,2120,2121],{"class":221},"block-bots",[121,2123,141],{"class":127},[121,2125,227],{"class":127},[121,2127,2128,2130,2132,2134,2136,2138,2141,2143],{"class":123,"line":150},[121,2129,134],{"class":127},[121,2131,235],{"class":137},[121,2133,141],{"class":127},[121,2135,144],{"class":127},[121,2137,218],{"class":127},[121,2139,2140],{"class":221},"Block known bots",[121,2142,141],{"class":127},[121,2144,227],{"class":127},[121,2146,2147,2149,2151,2153,2155],{"class":123,"line":166},[121,2148,134],{"class":127},[121,2150,173],{"class":137},[121,2152,141],{"class":127},[121,2154,144],{"class":127},[121,2156,180],{"class":127},[121,2158,2159,2161,2163,2165,2167],{"class":123,"line":183},[121,2160,134],{"class":127},[121,2162,269],{"class":137},[121,2164,141],{"class":127},[121,2166,144],{"class":127},[121,2168,195],{"class":127},[121,2170,2171,2173,2175,2177,2179,2181,2183,2186,2188,2190,2192,2194,2196,2198,2200,2203,2205,2207,2209,2211,2213,2215,2217,2220,2222],{"class":123,"line":198},[121,2172,1150],{"class":127},[121,2174,218],{"class":127},[121,2176,291],{"class":156},[121,2178,141],{"class":127},[121,2180,144],{"class":127},[121,2182,218],{"class":127},[121,2184,2185],{"class":221},"req.user_agent",[121,2187,141],{"class":127},[121,2189,668],{"class":127},[121,2191,218],{"class":127},[121,2193,312],{"class":156},[121,2195,141],{"class":127},[121,2197,144],{"class":127},[121,2199,218],{"class":127},[121,2201,2202],{"class":221},"regex",[121,2204,141],{"class":127},[121,2206,668],{"class":127},[121,2208,218],{"class":127},[121,2210,333],{"class":156},[121,2212,141],{"class":127},[121,2214,144],{"class":127},[121,2216,218],{"class":127},[121,2218,2219],{"class":221},"(?i)(bot|crawler|spider|scraper)",[121,2221,141],{"class":127},[121,2223,1198],{"class":127},[121,2225,2226],{"class":123,"line":204},[121,2227,1203],{"class":127},[121,2229,2230,2232,2234,2236,2238,2240,2242,2244,2246,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266],{"class":123,"line":230},[121,2231,134],{"class":127},[121,2233,365],{"class":137},[121,2235,141],{"class":127},[121,2237,144],{"class":127},[121,2239,1216],{"class":127},[121,2241,218],{"class":127},[121,2243,380],{"class":156},[121,2245,141],{"class":127},[121,2247,144],{"class":127},[121,2249,218],{"class":127},[121,2251,389],{"class":221},[121,2253,141],{"class":127},[121,2255,668],{"class":127},[121,2257,218],{"class":127},[121,2259,401],{"class":156},[121,2261,141],{"class":127},[121,2263,144],{"class":127},[121,2265,679],{"class":172},[121,2267,1198],{"class":127},[121,2269,2270],{"class":123,"line":251},[121,2271,444],{"class":127},[572,2273,2275],{"id":2274},"redirect-old-urls","Redirect old URLs",[111,2277,2279],{"className":113,"code":2278,"language":115,"meta":116,"style":116},"{\n  \"id\": \"redirect-old-api\",\n  \"name\": \"Redirect old API\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"req.path\", \"operator\": \"starts_with\", \"value\": \"\u002Fv1\u002F\" }\n  ],\n  \"action\": {\n    \"type\": \"redirect\",\n    \"status\": 301,\n    \"location\": \"https:\u002F\u002Fapi.example.com\u002Fv2\u002F\"\n  }\n}\n",[118,2280,2281,2285,2304,2323,2335,2347,2400,2404,2416,2434,2449,2466,2470],{"__ignoreMap":116},[121,2282,2283],{"class":123,"line":124},[121,2284,128],{"class":127},[121,2286,2287,2289,2291,2293,2295,2297,2300,2302],{"class":123,"line":131},[121,2288,134],{"class":127},[121,2290,211],{"class":137},[121,2292,141],{"class":127},[121,2294,144],{"class":127},[121,2296,218],{"class":127},[121,2298,2299],{"class":221},"redirect-old-api",[121,2301,141],{"class":127},[121,2303,227],{"class":127},[121,2305,2306,2308,2310,2312,2314,2316,2319,2321],{"class":123,"line":150},[121,2307,134],{"class":127},[121,2309,235],{"class":137},[121,2311,141],{"class":127},[121,2313,144],{"class":127},[121,2315,218],{"class":127},[121,2317,2318],{"class":221},"Redirect old API",[121,2320,141],{"class":127},[121,2322,227],{"class":127},[121,2324,2325,2327,2329,2331,2333],{"class":123,"line":166},[121,2326,134],{"class":127},[121,2328,173],{"class":137},[121,2330,141],{"class":127},[121,2332,144],{"class":127},[121,2334,180],{"class":127},[121,2336,2337,2339,2341,2343,2345],{"class":123,"line":183},[121,2338,134],{"class":127},[121,2340,269],{"class":137},[121,2342,141],{"class":127},[121,2344,144],{"class":127},[121,2346,195],{"class":127},[121,2348,2349,2351,2353,2355,2357,2359,2361,2363,2365,2367,2369,2371,2373,2375,2377,2379,2381,2383,2385,2387,2389,2391,2393,2396,2398],{"class":123,"line":198},[121,2350,1150],{"class":127},[121,2352,218],{"class":127},[121,2354,291],{"class":156},[121,2356,141],{"class":127},[121,2358,144],{"class":127},[121,2360,218],{"class":127},[121,2362,300],{"class":221},[121,2364,141],{"class":127},[121,2366,668],{"class":127},[121,2368,218],{"class":127},[121,2370,312],{"class":156},[121,2372,141],{"class":127},[121,2374,144],{"class":127},[121,2376,218],{"class":127},[121,2378,321],{"class":221},[121,2380,141],{"class":127},[121,2382,668],{"class":127},[121,2384,218],{"class":127},[121,2386,333],{"class":156},[121,2388,141],{"class":127},[121,2390,144],{"class":127},[121,2392,218],{"class":127},[121,2394,2395],{"class":221},"\u002Fv1\u002F",[121,2397,141],{"class":127},[121,2399,1198],{"class":127},[121,2401,2402],{"class":123,"line":204},[121,2403,1203],{"class":127},[121,2405,2406,2408,2410,2412,2414],{"class":123,"line":230},[121,2407,134],{"class":127},[121,2409,365],{"class":137},[121,2411,141],{"class":127},[121,2413,144],{"class":127},[121,2415,147],{"class":127},[121,2417,2418,2420,2422,2424,2426,2428,2430,2432],{"class":123,"line":251},[121,2419,153],{"class":127},[121,2421,380],{"class":156},[121,2423,141],{"class":127},[121,2425,144],{"class":127},[121,2427,218],{"class":127},[121,2429,753],{"class":221},[121,2431,141],{"class":127},[121,2433,227],{"class":127},[121,2435,2436,2438,2440,2442,2444,2447],{"class":123,"line":264},[121,2437,153],{"class":127},[121,2439,401],{"class":156},[121,2441,141],{"class":127},[121,2443,144],{"class":127},[121,2445,2446],{"class":172}," 301",[121,2448,227],{"class":127},[121,2450,2451,2453,2455,2457,2459,2461,2464],{"class":123,"line":278},[121,2452,153],{"class":127},[121,2454,818],{"class":156},[121,2456,141],{"class":127},[121,2458,144],{"class":127},[121,2460,218],{"class":127},[121,2462,2463],{"class":221},"https:\u002F\u002Fapi.example.com\u002Fv2\u002F",[121,2465,345],{"class":127},[121,2467,2468],{"class":123,"line":284},[121,2469,438],{"class":127},[121,2471,2472],{"class":123,"line":307},[121,2473,444],{"class":127},[572,2475,2477],{"id":2476},"set-custom-headers-for-upstream","Set custom headers for upstream",[1026,2479,2480,2481,2483,2484,2487],{},"A firewall rule must have at least one condition — rules with empty ",[118,2482,269],{}," are rejected at startup. Use a catch-all condition like ",[118,2485,2486],{},"\"req.ip\" exists"," when a rule should apply to every request.",[111,2489,2491],{"className":113,"code":2490,"language":115,"meta":116,"style":116},"{\n  \"id\": \"inject-geo-headers\",\n  \"name\": \"Inject Geo Headers\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"req.ip\", \"operator\": \"exists\" }\n  ],\n  \"action\": {\n    \"type\": \"set_request_header\",\n    \"headers\": {\n      \"X-Client-Country\": \"${ip.country}\",\n      \"X-Client-ASN\": \"${ip.asn}\",\n      \"X-Client-Risk\": \"${ip.risk_score}\"\n    }\n  }\n}\n",[118,2492,2493,2497,2516,2535,2547,2559,2596,2600,2612,2630,2642,2660,2680,2698,2702,2706],{"__ignoreMap":116},[121,2494,2495],{"class":123,"line":124},[121,2496,128],{"class":127},[121,2498,2499,2501,2503,2505,2507,2509,2512,2514],{"class":123,"line":131},[121,2500,134],{"class":127},[121,2502,211],{"class":137},[121,2504,141],{"class":127},[121,2506,144],{"class":127},[121,2508,218],{"class":127},[121,2510,2511],{"class":221},"inject-geo-headers",[121,2513,141],{"class":127},[121,2515,227],{"class":127},[121,2517,2518,2520,2522,2524,2526,2528,2531,2533],{"class":123,"line":150},[121,2519,134],{"class":127},[121,2521,235],{"class":137},[121,2523,141],{"class":127},[121,2525,144],{"class":127},[121,2527,218],{"class":127},[121,2529,2530],{"class":221},"Inject Geo Headers",[121,2532,141],{"class":127},[121,2534,227],{"class":127},[121,2536,2537,2539,2541,2543,2545],{"class":123,"line":166},[121,2538,134],{"class":127},[121,2540,173],{"class":137},[121,2542,141],{"class":127},[121,2544,144],{"class":127},[121,2546,180],{"class":127},[121,2548,2549,2551,2553,2555,2557],{"class":123,"line":183},[121,2550,134],{"class":127},[121,2552,269],{"class":137},[121,2554,141],{"class":127},[121,2556,144],{"class":127},[121,2558,195],{"class":127},[121,2560,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589,2592,2594],{"class":123,"line":198},[121,2562,1150],{"class":127},[121,2564,218],{"class":127},[121,2566,291],{"class":156},[121,2568,141],{"class":127},[121,2570,144],{"class":127},[121,2572,218],{"class":127},[121,2574,1994],{"class":221},[121,2576,141],{"class":127},[121,2578,668],{"class":127},[121,2580,218],{"class":127},[121,2582,312],{"class":156},[121,2584,141],{"class":127},[121,2586,144],{"class":127},[121,2588,218],{"class":127},[121,2590,2591],{"class":221},"exists",[121,2593,141],{"class":127},[121,2595,1198],{"class":127},[121,2597,2598],{"class":123,"line":204},[121,2599,1203],{"class":127},[121,2601,2602,2604,2606,2608,2610],{"class":123,"line":230},[121,2603,134],{"class":127},[121,2605,365],{"class":137},[121,2607,141],{"class":127},[121,2609,144],{"class":127},[121,2611,147],{"class":127},[121,2613,2614,2616,2618,2620,2622,2624,2626,2628],{"class":123,"line":251},[121,2615,153],{"class":127},[121,2617,380],{"class":156},[121,2619,141],{"class":127},[121,2621,144],{"class":127},[121,2623,218],{"class":127},[121,2625,934],{"class":221},[121,2627,141],{"class":127},[121,2629,227],{"class":127},[121,2631,2632,2634,2636,2638,2640],{"class":123,"line":264},[121,2633,153],{"class":127},[121,2635,945],{"class":156},[121,2637,141],{"class":127},[121,2639,144],{"class":127},[121,2641,147],{"class":127},[121,2643,2644,2646,2648,2650,2652,2654,2656,2658],{"class":123,"line":278},[121,2645,169],{"class":127},[121,2647,977],{"class":172},[121,2649,141],{"class":127},[121,2651,144],{"class":127},[121,2653,218],{"class":127},[121,2655,986],{"class":221},[121,2657,141],{"class":127},[121,2659,227],{"class":127},[121,2661,2662,2664,2667,2669,2671,2673,2676,2678],{"class":123,"line":284},[121,2663,169],{"class":127},[121,2665,2666],{"class":172},"X-Client-ASN",[121,2668,141],{"class":127},[121,2670,144],{"class":127},[121,2672,218],{"class":127},[121,2674,2675],{"class":221},"${ip.asn}",[121,2677,141],{"class":127},[121,2679,227],{"class":127},[121,2681,2682,2684,2687,2689,2691,2693,2696],{"class":123,"line":307},[121,2683,169],{"class":127},[121,2685,2686],{"class":172},"X-Client-Risk",[121,2688,141],{"class":127},[121,2690,144],{"class":127},[121,2692,218],{"class":127},[121,2694,2695],{"class":221},"${ip.risk_score}",[121,2697,345],{"class":127},[121,2699,2700],{"class":123,"line":328},[121,2701,432],{"class":127},[121,2703,2704],{"class":123,"line":348},[121,2705,438],{"class":127},[121,2707,2708],{"class":123,"line":354},[121,2709,444],{"class":127},[572,2711,2713],{"id":2712},"allow-specific-asn-whitelist","Allow specific ASN (whitelist)",[111,2715,2717],{"className":113,"code":2716,"language":115,"meta":116,"style":116},"{\n  \"id\": \"allow-whitelist-asn\",\n  \"name\": \"Allow Whitelist ASN\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"ip.asn\", \"operator\": \"in\", \"value\": [13335, 16509, 15169] }\n  ],\n  \"action\": { \"type\": \"allow\" }\n},\n{\n  \"id\": \"block-everyone-else\",\n  \"name\": \"Block Non-Whitelisted\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"req.ip\", \"operator\": \"exists\" }\n  ],\n  \"action\": { \"type\": \"block\", \"status\": 403 }\n}\n",[118,2718,2719,2723,2742,2761,2773,2785,2849,2853,2881,2889,2893,2912,2931,2943,2955,2991,2995,3035],{"__ignoreMap":116},[121,2720,2721],{"class":123,"line":124},[121,2722,128],{"class":127},[121,2724,2725,2727,2729,2731,2733,2735,2738,2740],{"class":123,"line":131},[121,2726,134],{"class":127},[121,2728,211],{"class":137},[121,2730,141],{"class":127},[121,2732,144],{"class":127},[121,2734,218],{"class":127},[121,2736,2737],{"class":221},"allow-whitelist-asn",[121,2739,141],{"class":127},[121,2741,227],{"class":127},[121,2743,2744,2746,2748,2750,2752,2754,2757,2759],{"class":123,"line":150},[121,2745,134],{"class":127},[121,2747,235],{"class":137},[121,2749,141],{"class":127},[121,2751,144],{"class":127},[121,2753,218],{"class":127},[121,2755,2756],{"class":221},"Allow Whitelist ASN",[121,2758,141],{"class":127},[121,2760,227],{"class":127},[121,2762,2763,2765,2767,2769,2771],{"class":123,"line":166},[121,2764,134],{"class":127},[121,2766,173],{"class":137},[121,2768,141],{"class":127},[121,2770,144],{"class":127},[121,2772,180],{"class":127},[121,2774,2775,2777,2779,2781,2783],{"class":123,"line":183},[121,2776,134],{"class":127},[121,2778,269],{"class":137},[121,2780,141],{"class":127},[121,2782,144],{"class":127},[121,2784,195],{"class":127},[121,2786,2787,2789,2791,2793,2795,2797,2799,2802,2804,2806,2808,2810,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832,2835,2837,2840,2842,2845,2847],{"class":123,"line":198},[121,2788,1150],{"class":127},[121,2790,218],{"class":127},[121,2792,291],{"class":156},[121,2794,141],{"class":127},[121,2796,144],{"class":127},[121,2798,218],{"class":127},[121,2800,2801],{"class":221},"ip.asn",[121,2803,141],{"class":127},[121,2805,668],{"class":127},[121,2807,218],{"class":127},[121,2809,312],{"class":156},[121,2811,141],{"class":127},[121,2813,144],{"class":127},[121,2815,218],{"class":127},[121,2817,1757],{"class":221},[121,2819,141],{"class":127},[121,2821,668],{"class":127},[121,2823,218],{"class":127},[121,2825,333],{"class":156},[121,2827,141],{"class":127},[121,2829,144],{"class":127},[121,2831,1772],{"class":127},[121,2833,2834],{"class":172},"13335",[121,2836,668],{"class":127},[121,2838,2839],{"class":172}," 16509",[121,2841,668],{"class":127},[121,2843,2844],{"class":172}," 15169",[121,2846,1800],{"class":127},[121,2848,1198],{"class":127},[121,2850,2851],{"class":123,"line":204},[121,2852,1203],{"class":127},[121,2854,2855,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877,2879],{"class":123,"line":230},[121,2856,134],{"class":127},[121,2858,365],{"class":137},[121,2860,141],{"class":127},[121,2862,144],{"class":127},[121,2864,1216],{"class":127},[121,2866,218],{"class":127},[121,2868,380],{"class":156},[121,2870,141],{"class":127},[121,2872,144],{"class":127},[121,2874,218],{"class":127},[121,2876,701],{"class":221},[121,2878,141],{"class":127},[121,2880,1198],{"class":127},[121,2882,2883,2886],{"class":123,"line":251},[121,2884,2885],{"class":127},"}",[121,2887,227],{"class":2888},"sTEyZ",[121,2890,2891],{"class":123,"line":264},[121,2892,128],{"class":127},[121,2894,2895,2897,2899,2901,2903,2905,2908,2910],{"class":123,"line":278},[121,2896,134],{"class":127},[121,2898,211],{"class":137},[121,2900,141],{"class":127},[121,2902,144],{"class":127},[121,2904,218],{"class":127},[121,2906,2907],{"class":221},"block-everyone-else",[121,2909,141],{"class":127},[121,2911,227],{"class":127},[121,2913,2914,2916,2918,2920,2922,2924,2927,2929],{"class":123,"line":284},[121,2915,134],{"class":127},[121,2917,235],{"class":137},[121,2919,141],{"class":127},[121,2921,144],{"class":127},[121,2923,218],{"class":127},[121,2925,2926],{"class":221},"Block Non-Whitelisted",[121,2928,141],{"class":127},[121,2930,227],{"class":127},[121,2932,2933,2935,2937,2939,2941],{"class":123,"line":307},[121,2934,134],{"class":127},[121,2936,173],{"class":137},[121,2938,141],{"class":127},[121,2940,144],{"class":127},[121,2942,180],{"class":127},[121,2944,2945,2947,2949,2951,2953],{"class":123,"line":328},[121,2946,134],{"class":127},[121,2948,269],{"class":137},[121,2950,141],{"class":127},[121,2952,144],{"class":127},[121,2954,195],{"class":127},[121,2956,2957,2959,2961,2963,2965,2967,2969,2971,2973,2975,2977,2979,2981,2983,2985,2987,2989],{"class":123,"line":348},[121,2958,1150],{"class":127},[121,2960,218],{"class":127},[121,2962,291],{"class":156},[121,2964,141],{"class":127},[121,2966,144],{"class":127},[121,2968,218],{"class":127},[121,2970,1994],{"class":221},[121,2972,141],{"class":127},[121,2974,668],{"class":127},[121,2976,218],{"class":127},[121,2978,312],{"class":156},[121,2980,141],{"class":127},[121,2982,144],{"class":127},[121,2984,218],{"class":127},[121,2986,2591],{"class":221},[121,2988,141],{"class":127},[121,2990,1198],{"class":127},[121,2992,2993],{"class":123,"line":354},[121,2994,1203],{"class":127},[121,2996,2997,2999,3001,3003,3005,3007,3009,3011,3013,3015,3017,3019,3021,3023,3025,3027,3029,3031,3033],{"class":123,"line":360},[121,2998,134],{"class":127},[121,3000,365],{"class":137},[121,3002,141],{"class":127},[121,3004,144],{"class":127},[121,3006,1216],{"class":127},[121,3008,218],{"class":127},[121,3010,380],{"class":156},[121,3012,141],{"class":127},[121,3014,144],{"class":127},[121,3016,218],{"class":127},[121,3018,389],{"class":221},[121,3020,141],{"class":127},[121,3022,668],{"class":127},[121,3024,218],{"class":127},[121,3026,401],{"class":156},[121,3028,141],{"class":127},[121,3030,144],{"class":127},[121,3032,679],{"class":172},[121,3034,1198],{"class":127},[121,3036,3037],{"class":123,"line":374},[121,3038,444],{"class":127},[106,3040,3042],{"id":3041},"log-output","Log output",[111,3044,3046],{"className":113,"code":3045,"language":115,"meta":116,"style":116},"{\n  \"firewall\": {\n    \"matched\": true,\n    \"rule_id\": \"block-tor\",\n    \"action\": \"Block\"\n  }\n}\n",[118,3047,3048,3052,3064,3077,3095,3111,3115],{"__ignoreMap":116},[121,3049,3050],{"class":123,"line":124},[121,3051,128],{"class":127},[121,3053,3054,3056,3058,3060,3062],{"class":123,"line":131},[121,3055,134],{"class":127},[121,3057,157],{"class":137},[121,3059,141],{"class":127},[121,3061,144],{"class":127},[121,3063,147],{"class":127},[121,3065,3066,3068,3071,3073,3075],{"class":123,"line":150},[121,3067,153],{"class":127},[121,3069,3070],{"class":156},"matched",[121,3072,141],{"class":127},[121,3074,144],{"class":127},[121,3076,180],{"class":127},[121,3078,3079,3081,3083,3085,3087,3089,3091,3093],{"class":123,"line":166},[121,3080,153],{"class":127},[121,3082,686],{"class":156},[121,3084,141],{"class":127},[121,3086,144],{"class":127},[121,3088,218],{"class":127},[121,3090,1098],{"class":221},[121,3092,141],{"class":127},[121,3094,227],{"class":127},[121,3096,3097,3099,3101,3103,3105,3107,3109],{"class":123,"line":183},[121,3098,153],{"class":127},[121,3100,365],{"class":156},[121,3102,141],{"class":127},[121,3104,144],{"class":127},[121,3106,218],{"class":127},[121,3108,574],{"class":221},[121,3110,345],{"class":127},[121,3112,3113],{"class":123,"line":198},[121,3114,438],{"class":127},[121,3116,3117],{"class":123,"line":204},[121,3118,444],{"class":127},[102,3120,3121],{},"When no rule matches:",[111,3123,3125],{"className":113,"code":3124,"language":115,"meta":116,"style":116},"{\n  \"firewall\": {\n    \"matched\": false,\n    \"rule_id\": null,\n    \"action\": null\n  }\n}\n",[118,3126,3127,3131,3143,3156,3169,3182,3186],{"__ignoreMap":116},[121,3128,3129],{"class":123,"line":124},[121,3130,128],{"class":127},[121,3132,3133,3135,3137,3139,3141],{"class":123,"line":131},[121,3134,134],{"class":127},[121,3136,157],{"class":137},[121,3138,141],{"class":127},[121,3140,144],{"class":127},[121,3142,147],{"class":127},[121,3144,3145,3147,3149,3151,3153],{"class":123,"line":150},[121,3146,153],{"class":127},[121,3148,3070],{"class":156},[121,3150,141],{"class":127},[121,3152,144],{"class":127},[121,3154,3155],{"class":127}," false,\n",[121,3157,3158,3160,3162,3164,3166],{"class":123,"line":166},[121,3159,153],{"class":127},[121,3161,686],{"class":156},[121,3163,141],{"class":127},[121,3165,144],{"class":127},[121,3167,3168],{"class":127}," null,\n",[121,3170,3171,3173,3175,3177,3179],{"class":123,"line":183},[121,3172,153],{"class":127},[121,3174,365],{"class":156},[121,3176,141],{"class":127},[121,3178,144],{"class":127},[121,3180,3181],{"class":127}," null\n",[121,3183,3184],{"class":123,"line":198},[121,3185,438],{"class":127},[121,3187,3188],{"class":123,"line":204},[121,3189,444],{"class":127},[3191,3192,3193],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .su27w, html code.shiki .su27w{--shiki-light:#916B53;--shiki-default:#916B53;--shiki-dark:#916B53}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":116,"searchDepth":131,"depth":131,"links":3195},[3196,3197,3198,3205,3206,3217],{"id":108,"depth":131,"text":109},{"id":447,"depth":131,"text":448},{"id":569,"depth":131,"text":570,"children":3199},[3200,3201,3202,3203,3204],{"id":389,"depth":150,"text":574},{"id":701,"depth":150,"text":702},{"id":753,"depth":150,"text":754},{"id":890,"depth":150,"text":891},{"id":1043,"depth":150,"text":1044},{"id":1050,"depth":131,"text":1051},{"id":1069,"depth":131,"text":1070,"children":3207},[3208,3209,3210,3211,3212,3213,3214,3215,3216],{"id":1073,"depth":150,"text":1074},{"id":1251,"depth":150,"text":1252},{"id":1477,"depth":150,"text":1478},{"id":1651,"depth":150,"text":1652},{"id":1853,"depth":150,"text":1854},{"id":2096,"depth":150,"text":2097},{"id":2274,"depth":150,"text":2275},{"id":2476,"depth":150,"text":2477},{"id":2712,"depth":150,"text":2713},{"id":3041,"depth":131,"text":3042},"Allow, block, redirect, or modify requests with ordered rules evaluated against any request attribute.","md",null,{},{"icon":47},{"title":44,"description":3218},"QXQ-UrtEVxAeof_INRoS03Av_CFPEAzQ3HLeUHfJWQs",[3226,3228],{"title":39,"path":40,"stem":41,"description":3227,"icon":42,"children":-1},"Geolocation, ASN, and threat detection enrichment for every request — all data embedded in the binary.",{"title":49,"path":50,"stem":51,"description":3229,"icon":52,"children":-1},"Sliding-window request quotas per IP, header, JWT claim, or composite key.",1791649767383]