@evomap/evolver 1.89.11 → 1.89.12
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.
- package/.cursor/BUGBOT.md +182 -0
- package/.env.example +68 -0
- package/.git-commit-guard-token +1 -0
- package/.github/CODEOWNERS +63 -0
- package/.github/ISSUE_TEMPLATE/good_first_issue.md +23 -0
- package/.github/pull_request_template.md +45 -0
- package/.github/workflows/test.yml +75 -0
- package/CHANGELOG.md +1367 -0
- package/README.md +90 -537
- package/README.public.md +578 -0
- package/SECURITY.md +108 -0
- package/assets/gep/events.jsonl +3 -0
- package/examples/atp-consumer-quickstart.md +100 -0
- package/examples/hello-world.md +38 -0
- package/package.json +6 -18
- package/proxy-package.json +39 -0
- package/public.manifest.json +145 -0
- package/src/evolve/guards.js +721 -1
- package/src/evolve/pipeline/collect.js +1283 -1
- package/src/evolve/pipeline/dispatch.js +421 -1
- package/src/evolve/pipeline/enrich.js +440 -1
- package/src/evolve/pipeline/hub.js +319 -1
- package/src/evolve/pipeline/select.js +274 -1
- package/src/evolve/pipeline/signals.js +206 -1
- package/src/evolve/utils.js +264 -1
- package/src/evolve.js +350 -1
- package/src/gep/a2aProtocol.js +4463 -1
- package/src/gep/antiAbuseTelemetry.js +233 -1
- package/src/gep/autoDistillConv.js +205 -1
- package/src/gep/autoDistillLlm.js +315 -1
- package/src/gep/candidateEval.js +92 -1
- package/src/gep/candidates.js +198 -1
- package/src/gep/contentHash.js +30 -1
- package/src/gep/conversationDistiller.js +270 -0
- package/src/gep/conversationSniffer.js +266 -1
- package/src/gep/crypto.js +89 -1
- package/src/gep/curriculum.js +163 -1
- package/src/gep/deviceId.js +218 -1
- package/src/gep/envFingerprint.js +118 -1
- package/src/gep/epigenetics.js +31 -1
- package/src/gep/execBridge.js +712 -1
- package/src/gep/explore.js +289 -1
- package/src/gep/hash.js +15 -1
- package/src/gep/hubFetch.js +608 -1
- package/src/gep/hubReview.js +207 -1
- package/src/gep/hubSearch.js +526 -1
- package/src/gep/hubVerify.js +306 -1
- package/src/gep/learningSignals.js +89 -1
- package/src/gep/memoryGraph.js +1449 -1
- package/src/gep/memoryGraphAdapter.js +203 -1
- package/src/gep/mutation.js +203 -1
- package/src/gep/narrativeMemory.js +108 -1
- package/src/gep/openPRRegistry.js +205 -1
- package/src/gep/personality.js +423 -1
- package/src/gep/policyCheck.js +599 -1
- package/src/gep/prompt.js +836 -1
- package/src/gep/questionGenerator.js +103 -0
- package/src/gep/recallInject.js +409 -1
- package/src/gep/recallVerifier.js +318 -1
- package/src/gep/reflection.js +177 -1
- package/src/gep/savingsCore.js +112 -1
- package/src/gep/selector.js +602 -1
- package/src/gep/skillDistiller.js +1294 -1
- package/src/gep/solidify.js +1699 -1
- package/src/gep/strategy.js +136 -1
- package/src/gep/tokenSavings.js +95 -1
- package/src/gep/workspaceKeychain.js +174 -1
- package/src/proxy/extensions/traceControl.js +109 -1
- package/src/proxy/inject.js +52 -1
- package/src/proxy/lifecycle/manager.js +108 -7
- package/src/proxy/server/routes.js +31 -0
- package/src/proxy/server/settings.js +6 -2
- package/src/proxy/sync/engine.js +31 -15
- package/src/proxy/sync/inbound.js +87 -9
- package/src/proxy/sync/outbound.js +57 -4
- package/src/proxy/trace/extractor.js +1403 -1
- package/src/proxy/trace/usage.js +105 -1
- package/CONTRIBUTING.md +0 -19
- package/assets/cover.png +0 -0
- package/scripts/a2a_export.js +0 -63
- package/scripts/a2a_ingest.js +0 -79
- package/scripts/a2a_promote.js +0 -118
- package/scripts/analyze_by_skill.js +0 -121
- package/scripts/build_binaries.js +0 -479
- package/scripts/check-changelog.js +0 -166
- package/scripts/extract_log.js +0 -85
- package/scripts/generate_history.js +0 -75
- package/scripts/gep_append_event.js +0 -96
- package/scripts/gep_personality_report.js +0 -234
- package/scripts/human_report.js +0 -147
- package/scripts/recall-verify-report.js +0 -234
- package/scripts/recover_loop.js +0 -61
- package/scripts/refresh_stars_badge.js +0 -168
- package/scripts/seed-merchants.js +0 -91
- package/scripts/suggest_version.js +0 -89
- package/scripts/validate-modules.js +0 -38
- package/scripts/validate-suite.js +0 -78
- package/skills/index.json +0 -14
- /package/assets/gep/{genes.seed.json → genes.json} +0 -0
- /package/{skills → bundled-skills}/_meta/SKILL.md +0 -0
package/src/gep/hubFetch.js
CHANGED
|
@@ -1 +1,608 @@
|
|
|
1
|
-
const _0xbc6e87=_0x56e8;(function(_0x282236,_0xf34fa5){const _0x3709aa=_0x56e8,_0x4635d1=_0x282236();while(!![]){try{const _0x3185df=-parseInt(_0x3709aa(0x140,'\x77\x73\x7a\x51'))/(-0x18b6*0x1+-0xf49*-0x2+0x5db*-0x1)+parseInt(_0x3709aa(0x190,'\x52\x4f\x30\x45'))/(-0x3b*0x29+0x21b0+-0x183b*0x1)+-parseInt(_0x3709aa(0x144,'\x61\x5a\x59\x62'))/(-0x6*-0x14c+-0x1*-0x256c+-0x2d31)+-parseInt(_0x3709aa(0x1e4,'\x6a\x29\x54\x74'))/(-0x2485*0x1+0x640+0x1e49)*(-parseInt(_0x3709aa(0x1e7,'\x6f\x66\x77\x75'))/(0xabd+0x218f+-0x2c47))+parseInt(_0x3709aa(0x184,'\x29\x33\x40\x5d'))/(0x129*0x11+0x427*-0x1+0x14*-0xc7)*(parseInt(_0x3709aa(0x1eb,'\x72\x54\x34\x29'))/(-0x23b0+-0x1*-0x223d+0x7e*0x3))+parseInt(_0x3709aa(0x161,'\x4d\x28\x7a\x2a'))/(0xe8*0x3+0x409*0x2+-0xac2)*(-parseInt(_0x3709aa(0x132,'\x58\x76\x24\x74'))/(-0x1*0xec6+-0x4c*-0x32+0x9*-0x1))+parseInt(_0x3709aa(0x1b4,'\x4f\x73\x78\x75'))/(-0x10e+0x1*-0x221b+-0x1*-0x2333)*(parseInt(_0x3709aa(0x1e3,'\x5b\x65\x4b\x44'))/(-0x3d0+0x5f4+-0x219));if(_0x3185df===_0xf34fa5)break;else _0x4635d1['push'](_0x4635d1['shift']());}catch(_0x517546){_0x4635d1['push'](_0x4635d1['shift']());}}}(_0x1d02,0xb900b+0xdf*0xa81+-0x278*0x358));const _0x26b33b=require(_0xbc6e87(0x1c6,'\x29\x62\x4b\x47')),{Agent:_0x6c6aeb,fetch:_0x469484,buildConnector:_0x5586cd}=require(_0xbc6e87(0x1e8,'\x6f\x66\x77\x75'));function _0x19fe78(){const _0x7e0ab1=_0xbc6e87,_0x5e303e={};_0x5e303e[_0x7e0ab1(0x17b,'\x2a\x4e\x4f\x64')]=_0x7e0ab1(0x159,'\x64\x6c\x4e\x65')+'\x74',_0x5e303e[_0x7e0ab1(0x198,'\x49\x53\x62\x5e')]=function(_0x59abe7,_0x3a38a3){return _0x59abe7===_0x3a38a3;},_0x5e303e[_0x7e0ab1(0x117,'\x65\x4b\x44\x5a')]=function(_0x3b0384,_0x7c802){return _0x3b0384===_0x7c802;},_0x5e303e[_0x7e0ab1(0x11a,'\x61\x37\x79\x49')]=function(_0x2f82d5,_0x471999){return _0x2f82d5===_0x471999;},_0x5e303e['\x42\x51\x73\x71\x73']=_0x7e0ab1(0x246,'\x52\x52\x4c\x4f')+'\x73\x74',_0x5e303e[_0x7e0ab1(0x146,'\x29\x33\x40\x5d')]=function(_0x5c2cd9,_0x395101){return _0x5c2cd9===_0x395101;},_0x5e303e[_0x7e0ab1(0x18d,'\x37\x40\x47\x33')]=_0x7e0ab1(0x273,'\x29\x33\x40\x5d'),_0x5e303e[_0x7e0ab1(0x1cd,'\x70\x70\x47\x29')]=function(_0x714c75,_0x31c402){return _0x714c75===_0x31c402;},_0x5e303e[_0x7e0ab1(0x12f,'\x72\x51\x29\x72')]=_0x7e0ab1(0x19f,'\x29\x62\x4b\x47'),_0x5e303e[_0x7e0ab1(0x21f,'\x57\x4f\x65\x78')]=function(_0x6f4d00,_0x4d2002){return _0x6f4d00===_0x4d2002;},_0x5e303e['\x50\x5a\x71\x74\x76']=_0x7e0ab1(0x20b,'\x4b\x7a\x4b\x45')+'\x6b',_0x5e303e[_0x7e0ab1(0x156,'\x72\x4d\x4c\x71')]=_0x7e0ab1(0x188,'\x55\x5a\x65\x59')+'\x63\x6b',_0x5e303e[_0x7e0ab1(0x24c,'\x5b\x65\x4b\x44')]=function(_0x44ab63,_0x47daae){return _0x44ab63+_0x47daae;};const _0x431486=_0x5e303e,_0xb7e7e7=String(process.env.EVOMAP_HUB_IP_FAMILY||_0x431486['\x65\x6d\x4c\x76\x70'])[_0x7e0ab1(0x21c,'\x4b\x6e\x6e\x74')]()[_0x7e0ab1(0x180,'\x65\x4b\x44\x5a')+_0x7e0ab1(0x129,'\x55\x44\x45\x78')]();if(_0x431486[_0x7e0ab1(0x208,'\x64\x6c\x4e\x65')](_0xb7e7e7,_0x7e0ab1(0x250,'\x43\x53\x55\x59'))||_0x431486[_0x7e0ab1(0x15e,'\x43\x53\x55\x59')](_0xb7e7e7,'\x76\x34')||_0x431486[_0x7e0ab1(0x12a,'\x66\x42\x2a\x32')](_0xb7e7e7,'\x34')||_0x431486[_0x7e0ab1(0x17f,'\x43\x53\x55\x59')](_0xb7e7e7,_0x431486[_0x7e0ab1(0x261,'\x5e\x2a\x67\x4e')])||_0x431486['\x64\x6c\x55\x47\x6f'](_0xb7e7e7,_0x431486[_0x7e0ab1(0x22e,'\x6a\x29\x54\x74')]))return _0x431486[_0x7e0ab1(0x158,'\x4f\x73\x78\x75')];if(_0x431486[_0x7e0ab1(0x1d9,'\x4d\x28\x7a\x2a')](_0xb7e7e7,_0x431486[_0x7e0ab1(0x1fe,'\x57\x4f\x65\x78')])||_0x431486[_0x7e0ab1(0x218,'\x4e\x35\x31\x24')](_0xb7e7e7,_0x7e0ab1(0x157,'\x66\x25\x54\x61')+'\x79'))return'\x69\x70\x76\x34\x6f\x6e\x6c\x79';if(_0x431486['\x64\x6c\x55\x47\x6f'](_0xb7e7e7,_0x431486[_0x7e0ab1(0x11c,'\x62\x5a\x51\x7a')])||_0x431486[_0x7e0ab1(0x1b5,'\x64\x38\x71\x44')](_0xb7e7e7,_0x431486[_0x7e0ab1(0x16c,'\x4e\x51\x6d\x75')])||_0xb7e7e7===_0x431486[_0x7e0ab1(0x104,'\x6a\x29\x54\x74')])return _0x431486[_0x7e0ab1(0x247,'\x64\x79\x5a\x5b')];throw new Error(_0x431486[_0x7e0ab1(0x145,'\x58\x76\x24\x74')](_0x7e0ab1(0x1aa,'\x4d\x28\x7a\x2a')+'\x68\x5d\x20\x45\x56\x4f\x4d\x41'+_0x7e0ab1(0x143,'\x4d\x28\x7a\x2a')+'\x5f\x46\x41\x4d\x49\x4c\x59\x20'+'\x6d\x75\x73\x74\x20\x62\x65\x20'+_0x7e0ab1(0x276,'\x6f\x66\x77\x75')+_0x7e0ab1(0xed,'\x37\x40\x47\x33')+_0x7e0ab1(0x1f2,'\x29\x62\x4b\x47')+_0x7e0ab1(0x103,'\x39\x68\x54\x65')+_0x7e0ab1(0x196,'\x79\x5a\x36\x34'),JSON[_0x7e0ab1(0x224,'\x61\x5a\x59\x62')+'\x79'](process.env.EVOMAP_HUB_IP_FAMILY)));}const _0xe0a0b5=_0x19fe78(),_0x460f6e=0x3fbf+0x4d8d*0x1+-0x663c,_0x1896e7=0x1d62+-0x17d6*0x1+0x438,_0x228415={};_0x228415[_0xbc6e87(0x15f,'\x43\x51\x77\x71')+_0xbc6e87(0x18b,'\x29\x33\x40\x5d')+'\x65\x64']=!![],_0x228415[_0xbc6e87(0x18a,'\x52\x4f\x30\x45')]=_0x460f6e;const _0x139c4c=_0x228415,_0xee10e2={..._0x139c4c};_0xee10e2[_0xbc6e87(0x1b6,'\x64\x38\x71\x44')]=0x4,_0xee10e2[_0xbc6e87(0x256,'\x4b\x7a\x4b\x45')+_0xbc6e87(0x177,'\x5b\x65\x4b\x44')]=![];const _0x13de60=_0xee10e2,_0x2086fc={..._0x13de60};_0x2086fc['\x74\x69\x6d\x65\x6f\x75\x74']=_0x1896e7;const _0xcacf64=_0x2086fc,_0x125995={..._0x139c4c};_0x125995['\x61\x75\x74\x6f\x53\x65\x6c\x65'+_0xbc6e87(0x1c4,'\x43\x51\x77\x71')]=!![],_0x125995[_0xbc6e87(0x150,'\x6f\x66\x77\x75')+_0xbc6e87(0x10b,'\x57\x4f\x65\x78')+_0xbc6e87(0x194,'\x4e\x35\x31\x24')+'\x69\x6d\x65\x6f\x75\x74']=0xfa;const _0x4221a3=_0x125995,_0x50c1d7=_0xe0a0b5===_0xbc6e87(0x1ee,'\x55\x5a\x65\x59')?_0x4221a3:_0xe0a0b5===_0xbc6e87(0x1c9,'\x79\x79\x51\x66')?_0x13de60:_0xcacf64,_0x57ce9b=new Set(['\x45\x41\x44\x44\x52\x4e\x4f\x54'+_0xbc6e87(0x23f,'\x4e\x35\x31\x24'),_0xbc6e87(0x210,'\x49\x33\x21\x57')+'\x4e',_0xbc6e87(0x22c,'\x77\x73\x7a\x51')+_0xbc6e87(0x1d5,'\x61\x37\x79\x49'),_0xbc6e87(0x162,'\x47\x44\x2a\x4e')+'\x54',_0xbc6e87(0x131,'\x55\x5a\x65\x59')+_0xbc6e87(0x133,'\x52\x52\x4c\x4f'),_0xbc6e87(0x1a8,'\x58\x76\x24\x74')+_0xbc6e87(0x126,'\x4b\x7a\x4b\x45'),_0xbc6e87(0x212,'\x64\x6c\x4e\x65')+'\x44','\x55\x4e\x44\x5f\x45\x52\x52\x5f'+_0xbc6e87(0x240,'\x5b\x65\x4b\x44')+_0xbc6e87(0x178,'\x55\x5a\x65\x59')]);function _0x15a481(_0x4936b0){const _0x233de9=_0xbc6e87,_0x4501cf={};_0x4501cf['\x70\x72\x55\x6a\x4a']=function(_0x7d11f8,_0x4ea5cf){return _0x7d11f8!==_0x4ea5cf;},_0x4501cf[_0x233de9(0x25d,'\x29\x79\x31\x6a')]=_0x233de9(0x235,'\x77\x6b\x59\x34')+'\x74';const _0x281952=_0x4501cf;if(_0x281952['\x70\x72\x55\x6a\x4a'](_0xe0a0b5,_0x281952[_0x233de9(0x10e,'\x72\x51\x29\x72')]))return![];const _0x2637f5=_0x4936b0&&(_0x4936b0[_0x233de9(0x13c,'\x57\x4f\x65\x78')]||_0x4936b0['\x63\x61\x75\x73\x65']&&_0x4936b0[_0x233de9(0x12b,'\x79\x79\x51\x66')][_0x233de9(0x233,'\x49\x33\x21\x57')]);return _0x57ce9b['\x68\x61\x73'](_0x2637f5);}const _0x935744=_0x5586cd(_0x50c1d7),_0xc2cff9=_0xe0a0b5===_0xbc6e87(0x1ce,'\x49\x53\x62\x5e')+'\x74'?_0x5586cd(_0x4221a3):null;function _0x1d02(){const _0x5d27d0=['\x57\x50\x35\x66\x6b\x74\x33\x64\x4f\x47\x50\x41\x57\x52\x34','\x57\x4f\x31\x31\x57\x50\x44\x32\x57\x51\x47','\x72\x4c\x58\x72\x69\x57\x44\x47\x57\x51\x33\x63\x4e\x57','\x57\x50\x64\x63\x53\x6d\x6b\x72\x61\x30\x74\x63\x4b\x74\x64\x63\x54\x47','\x6b\x64\x42\x64\x4f\x32\x78\x64\x55\x48\x56\x64\x49\x38\x6f\x38','\x57\x4f\x47\x74\x69\x6d\x6b\x61\x72\x61','\x57\x36\x2f\x63\x49\x38\x6f\x73\x66\x48\x30','\x57\x50\x56\x64\x52\x49\x70\x63\x4d\x68\x61\x56\x57\x34\x33\x64\x55\x57','\x78\x4c\x46\x64\x56\x49\x58\x2b\x45\x38\x6f\x71\x79\x61','\x57\x52\x52\x63\x4b\x5a\x6a\x6f\x73\x57','\x57\x52\x35\x69\x57\x51\x44\x52\x57\x50\x5a\x64\x4b\x71\x42\x63\x51\x71','\x57\x35\x64\x63\x50\x6d\x6f\x78','\x43\x38\x6b\x58\x73\x64\x68\x63\x56\x5a\x46\x63\x4c\x67\x38','\x57\x35\x39\x78\x57\x37\x52\x64\x4c\x53\x6f\x42\x77\x76\x66\x46','\x6a\x4d\x4f\x4a\x57\x52\x4a\x64\x52\x61','\x6e\x61\x33\x64\x50\x4c\x78\x64\x53\x71','\x65\x38\x6f\x49\x57\x51\x76\x49\x44\x61','\x6f\x59\x70\x64\x4b\x77\x5a\x64\x55\x72\x70\x64\x49\x53\x6f\x47','\x61\x53\x6f\x6e\x57\x35\x35\x32\x6f\x43\x6b\x39\x43\x61','\x75\x30\x64\x64\x50\x74\x57\x2b\x79\x6d\x6f\x78\x45\x61','\x76\x66\x64\x64\x50\x74\x43\x35','\x57\x4f\x6a\x65\x57\x4f\x4b\x56\x57\x4f\x6d','\x57\x52\x62\x47\x61\x47','\x7a\x65\x52\x64\x4f\x4b\x35\x67','\x7a\x6d\x6f\x70\x44\x72\x6d\x4c','\x70\x66\x34\x4e\x57\x52\x52\x64\x56\x71','\x71\x4c\x6a\x50\x6a\x62\x35\x4b\x57\x52\x6c\x63\x55\x71','\x61\x43\x6b\x63\x44\x53\x6f\x4f\x6b\x71','\x61\x32\x4b\x2f\x57\x35\x78\x64\x4b\x65\x37\x64\x4b\x48\x69','\x57\x37\x4c\x32\x57\x35\x68\x64\x52\x6d\x6f\x52\x44\x68\x44\x76','\x65\x6d\x6b\x79\x78\x53\x6b\x6d\x76\x32\x72\x2f\x76\x6d\x6b\x4e\x62\x32\x54\x66','\x57\x36\x76\x56\x57\x37\x39\x70\x57\x35\x4b','\x6e\x6d\x6f\x6b\x57\x36\x52\x63\x53\x5a\x78\x63\x4a\x49\x58\x64','\x6d\x53\x6f\x50\x57\x34\x4c\x45\x68\x57','\x6d\x53\x6f\x58\x57\x37\x6a\x46\x77\x38\x6b\x42\x75\x6d\x6b\x57','\x46\x53\x6b\x75\x67\x62\x42\x63\x55\x63\x68\x64\x48\x57','\x57\x34\x52\x64\x56\x38\x6b\x56\x79\x30\x58\x53\x57\x37\x38','\x71\x38\x6f\x75\x68\x6d\x6f\x44\x63\x73\x7a\x66\x77\x47','\x57\x51\x4e\x63\x4b\x62\x78\x63\x4a\x48\x43','\x6e\x49\x5a\x63\x52\x57\x4e\x63\x4e\x61','\x57\x4f\x53\x78\x6f\x53\x6b\x35\x46\x43\x6b\x45\x57\x52\x4e\x63\x55\x47','\x57\x35\x72\x6b\x57\x36\x6c\x64\x52\x43\x6f\x6a','\x57\x4f\x33\x63\x4f\x38\x6f\x30\x6e\x62\x75\x50\x57\x34\x43\x51\x57\x4f\x71\x4b\x57\x4f\x6c\x64\x4f\x57','\x45\x53\x6f\x76\x41\x75\x65\x70\x57\x35\x65','\x57\x4f\x39\x44\x57\x51\x54\x4f\x57\x4f\x4b','\x57\x36\x58\x47\x57\x36\x64\x64\x4b\x43\x6f\x38','\x61\x6d\x6f\x43\x57\x34\x33\x63\x54\x74\x64\x63\x4d\x5a\x76\x59','\x57\x4f\x6e\x4d\x72\x47\x74\x63\x4e\x71','\x57\x34\x56\x63\x56\x62\x62\x31\x67\x57','\x46\x64\x56\x63\x51\x57\x79\x34\x57\x50\x65\x6a\x72\x61','\x57\x50\x42\x64\x50\x77\x6d\x74\x57\x52\x71','\x57\x35\x65\x58\x74\x64\x33\x63\x4d\x6d\x6b\x65\x57\x37\x70\x64\x4e\x53\x6f\x33\x57\x35\x33\x63\x4e\x53\x6b\x6b\x57\x52\x65','\x72\x43\x6b\x46\x57\x36\x6d\x72\x68\x58\x56\x63\x4f\x4e\x38','\x6a\x6d\x6f\x30\x57\x36\x46\x64\x53\x43\x6f\x42\x57\x51\x4a\x64\x48\x6d\x6b\x54','\x76\x38\x6f\x78\x57\x51\x72\x54\x42\x43\x6b\x33\x63\x47','\x43\x75\x2f\x64\x4c\x61\x30\x77','\x6d\x53\x6b\x69\x57\x50\x68\x63\x56\x64\x6c\x63\x49\x63\x62\x6b','\x57\x50\x48\x67\x45\x64\x53','\x57\x4f\x4c\x41\x46\x64\x68\x63\x54\x30\x79\x39\x57\x36\x6d','\x57\x35\x64\x64\x49\x6d\x6f\x52\x57\x37\x6c\x63\x55\x53\x6b\x48\x73\x53\x6b\x54','\x66\x6d\x6b\x59\x57\x4f\x4b\x50\x6d\x53\x6f\x54\x57\x52\x71\x53','\x57\x4f\x70\x63\x53\x61\x69\x4f\x57\x35\x56\x63\x4b\x73\x31\x7a','\x57\x4f\x78\x63\x50\x75\x46\x64\x50\x57\x4b\x36\x57\x37\x53\x79','\x46\x30\x46\x63\x53\x31\x38\x79\x57\x50\x6c\x63\x52\x53\x6b\x77','\x6b\x43\x6f\x78\x57\x4f\x6e\x63\x72\x71','\x57\x52\x44\x57\x66\x58\x68\x64\x4b\x4a\x50\x32\x57\x51\x53','\x57\x52\x78\x64\x50\x6d\x6f\x62\x57\x35\x46\x64\x4a\x53\x6f\x42\x6a\x6d\x6b\x73','\x42\x78\x78\x63\x4e\x61\x75\x65\x6a\x4a\x39\x6d','\x44\x64\x42\x63\x51\x4b\x71\x37\x57\x51\x69\x59\x41\x47','\x57\x50\x31\x31\x57\x4f\x31\x6e\x57\x52\x4a\x64\x54\x57','\x63\x32\x71\x2b\x57\x50\x46\x64\x4b\x33\x33\x64\x51\x74\x57','\x57\x50\x44\x49\x66\x65\x2f\x64\x4b\x71','\x65\x78\x74\x64\x53\x32\x42\x64\x56\x47','\x6a\x4a\x5a\x63\x50\x72\x78\x63\x56\x53\x6b\x55\x57\x37\x46\x64\x4e\x71','\x57\x50\x53\x72\x57\x51\x61\x69\x57\x52\x4a\x64\x54\x38\x6b\x56\x57\x51\x35\x4c\x6c\x5a\x54\x56\x6b\x71','\x57\x34\x48\x72\x57\x37\x56\x64\x4c\x53\x6f\x37\x73\x66\x44\x2f','\x75\x6d\x6b\x71\x57\x37\x65\x77\x61\x58\x4e\x63\x51\x4c\x69','\x57\x35\x58\x6a\x57\x35\x44\x73\x57\x37\x5a\x63\x53\x43\x6f\x51\x57\x51\x53','\x57\x4f\x30\x61\x57\x51\x70\x63\x47\x6d\x6b\x6f\x64\x58\x76\x63\x79\x57\x42\x63\x4b\x59\x35\x4c','\x45\x6d\x6b\x38\x64\x48\x37\x63\x51\x57','\x46\x43\x6b\x6e\x62\x72\x64\x63\x50\x49\x57','\x42\x38\x6b\x52\x64\x58\x78\x63\x4b\x47','\x76\x33\x46\x64\x55\x58\x4f\x77','\x57\x50\x70\x63\x48\x76\x5a\x64\x4f\x57\x69\x59\x57\x36\x43\x6b','\x75\x66\x52\x64\x50\x64\x4f\x31','\x42\x6d\x6f\x52\x45\x63\x65\x55\x76\x4c\x5a\x64\x4a\x61','\x57\x50\x4a\x63\x54\x58\x71\x4e\x57\x34\x70\x63\x49\x4a\x76\x66','\x7a\x78\x64\x64\x52\x31\x75','\x57\x51\x4c\x6c\x63\x75\x70\x64\x49\x71','\x45\x76\x68\x64\x4d\x4c\x4b','\x42\x6d\x6b\x38\x6f\x73\x5a\x63\x4b\x47','\x57\x35\x57\x61\x57\x36\x62\x57\x41\x6d\x6b\x46\x79\x74\x43','\x70\x72\x52\x64\x54\x4e\x78\x64\x47\x62\x70\x64\x49\x38\x6f\x38','\x57\x37\x70\x63\x55\x53\x6f\x4f\x66\x61\x39\x6d\x57\x4f\x6d\x70','\x57\x50\x46\x64\x55\x71\x37\x64\x4d\x78\x75\x5a\x57\x34\x70\x63\x4f\x47','\x57\x34\x4c\x6c\x57\x37\x68\x63\x4d\x6d\x6f\x77\x74\x4c\x66\x47','\x57\x50\x66\x68\x45\x63\x74\x63\x51\x61','\x57\x52\x4c\x47\x67\x62\x42\x64\x47\x59\x66\x51\x57\x50\x65','\x57\x50\x69\x72\x67\x53\x6b\x67\x79\x71','\x72\x31\x52\x63\x4f\x61\x43\x78\x73\x4b\x31\x79','\x57\x35\x39\x78\x57\x37\x52\x64\x49\x38\x6f\x6b\x73\x66\x62\x5a','\x77\x77\x46\x64\x54\x59\x71\x78','\x57\x50\x58\x36\x67\x62\x56\x64\x4b\x49\x54\x58\x57\x51\x53','\x7a\x43\x6f\x59\x42\x49\x34\x70','\x57\x50\x37\x64\x4b\x4e\x6a\x65\x57\x50\x72\x5a\x62\x53\x6f\x52','\x57\x52\x70\x63\x4c\x61\x48\x63\x76\x57','\x69\x31\x46\x64\x4c\x78\x2f\x64\x4b\x32\x71\x44\x63\x47','\x57\x4f\x35\x44\x57\x51\x71\x2b\x57\x50\x47','\x6d\x74\x52\x64\x53\x4d\x6c\x64\x4f\x71\x34','\x42\x49\x52\x64\x56\x4b\x56\x63\x4b\x47\x6c\x63\x55\x78\x69','\x57\x34\x7a\x71\x57\x36\x76\x55\x57\x37\x47','\x6e\x38\x6f\x69\x57\x52\x7a\x61','\x71\x33\x2f\x63\x4b\x75\x79\x38','\x57\x50\x52\x63\x4c\x58\x31\x59\x57\x35\x79','\x65\x4c\x4e\x64\x48\x67\x78\x64\x49\x57','\x77\x58\x64\x63\x50\x4b\x71\x71','\x57\x4f\x6a\x44\x57\x51\x79\x58\x57\x52\x64\x64\x54\x53\x6b\x79\x69\x47','\x45\x4e\x66\x51\x68\x64\x7a\x69\x57\x4f\x37\x63\x51\x71','\x6c\x74\x42\x63\x4f\x62\x71','\x57\x50\x5a\x64\x48\x32\x65\x61\x57\x52\x6e\x32\x68\x43\x6f\x55','\x6c\x38\x6b\x5a\x45\x32\x68\x64\x4e\x74\x2f\x63\x49\x53\x6f\x38','\x57\x37\x4f\x31\x73\x71','\x57\x50\x72\x78\x63\x30\x46\x64\x47\x47','\x74\x66\x5a\x63\x52\x47','\x57\x52\x35\x74\x57\x52\x35\x4a\x57\x50\x68\x64\x49\x48\x68\x63\x47\x57','\x41\x77\x42\x64\x55\x67\x56\x64\x50\x72\x4e\x64\x4e\x38\x6f\x51','\x69\x61\x56\x63\x4e\x57\x38\x33\x70\x43\x6b\x2b\x57\x37\x4b\x31\x63\x73\x78\x63\x4f\x53\x6f\x2b','\x43\x4e\x2f\x64\x4d\x72\x43\x38\x6f\x4a\x44\x6a','\x7a\x31\x70\x64\x4e\x4d\x50\x53','\x46\x53\x6b\x77\x78\x33\x4a\x64\x4a\x47\x6c\x63\x4a\x47','\x70\x53\x6b\x30\x42\x68\x4a\x64\x4e\x59\x69','\x44\x31\x46\x64\x49\x65\x76\x75\x79\x6d\x6f\x4a\x57\x36\x4b','\x61\x5a\x2f\x64\x4f\x4d\x2f\x64\x4b\x48\x2f\x64\x4b\x53\x6f\x36','\x74\x6d\x6f\x4f\x57\x35\x4b\x4c\x6c\x43\x6f\x36\x57\x52\x6d\x56\x6c\x47','\x73\x38\x6f\x6e\x65\x71','\x43\x68\x46\x64\x4e\x71\x44\x58\x57\x4f\x46\x63\x4f\x66\x43','\x6e\x38\x6f\x58\x57\x36\x44\x43','\x64\x63\x50\x69\x68\x4a\x46\x63\x4b\x53\x6f\x55','\x57\x34\x2f\x63\x53\x6d\x6f\x78\x63\x47\x78\x63\x4e\x74\x5a\x63\x55\x47','\x73\x33\x5a\x63\x51\x4e\x30\x78','\x57\x50\x76\x6b\x6c\x4e\x4a\x64\x55\x30\x61\x48\x57\x51\x4f','\x57\x37\x30\x79\x77\x43\x6f\x44\x67\x61','\x57\x35\x7a\x6e\x57\x37\x72\x6e\x57\x34\x34','\x6b\x6d\x6b\x4c\x79\x43\x6f\x4c\x6d\x43\x6f\x30\x44\x4d\x6d','\x78\x4e\x33\x64\x48\x77\x50\x77','\x57\x35\x38\x57\x57\x35\x57\x58\x57\x37\x34\x42\x6c\x75\x38','\x57\x50\x74\x63\x52\x61\x6e\x58\x57\x36\x46\x63\x4a\x64\x72\x6d','\x57\x50\x39\x73\x79\x64\x4a\x63\x55\x75\x34\x57\x57\x36\x65','\x62\x63\x62\x64\x61\x62\x70\x63\x4e\x43\x6f\x5a\x72\x57','\x57\x50\x31\x45\x76\x4a\x4e\x63\x53\x47','\x6e\x43\x6f\x56\x57\x35\x37\x63\x56\x61\x75','\x57\x50\x2f\x63\x56\x66\x64\x64\x4f\x72\x69\x50','\x57\x4f\x37\x63\x50\x66\x37\x64\x54\x49\x61','\x43\x53\x6f\x68\x6b\x38\x6f\x79\x6c\x57','\x42\x53\x6f\x6a\x57\x4f\x56\x63\x53\x78\x6c\x63\x48\x49\x62\x70','\x6b\x78\x46\x63\x53\x5a\x68\x64\x47\x59\x74\x63\x4f\x4e\x65\x31\x41\x4a\x69','\x57\x50\x4a\x64\x4a\x43\x6f\x39','\x61\x53\x6f\x47\x57\x34\x74\x64\x48\x6d\x6f\x78','\x57\x34\x4b\x6d\x57\x35\x50\x6a\x73\x71','\x78\x31\x4a\x63\x4d\x65\x65\x2b','\x6d\x43\x6f\x6b\x57\x34\x44\x67\x61\x57','\x72\x6d\x6f\x66\x45\x57\x4f\x53','\x57\x34\x5a\x63\x4b\x6d\x6b\x48\x42\x62\x6d','\x42\x6d\x6b\x34\x68\x5a\x78\x63\x4f\x61','\x57\x50\x7a\x67\x45\x61','\x57\x4f\x44\x32\x68\x77\x46\x64\x4d\x38\x6f\x68\x57\x51\x78\x64\x4e\x47','\x57\x37\x61\x56\x57\x34\x57','\x57\x50\x5a\x64\x54\x53\x6f\x2f\x57\x35\x5a\x64\x56\x57','\x57\x35\x4e\x63\x55\x6d\x6b\x30','\x57\x52\x68\x64\x4a\x48\x33\x64\x51\x4c\x31\x4e\x57\x50\x37\x64\x55\x57','\x77\x61\x37\x64\x47\x31\x2f\x63\x54\x49\x64\x63\x49\x68\x4f','\x57\x51\x50\x56\x63\x67\x52\x64\x4a\x61','\x57\x36\x4a\x63\x4d\x43\x6b\x6a\x77\x58\x70\x64\x49\x58\x37\x63\x47\x57','\x57\x4f\x78\x63\x4e\x73\x33\x63\x52\x48\x4b','\x41\x32\x64\x63\x51\x76\x61\x51','\x57\x51\x7a\x6c\x6d\x31\x4a\x64\x56\x6d\x6f\x4d\x57\x4f\x52\x64\x52\x57','\x62\x33\x42\x64\x54\x57\x48\x77\x57\x36\x35\x54\x69\x61','\x57\x37\x65\x72\x57\x34\x6e\x4f\x45\x61','\x6f\x6d\x6f\x71\x57\x35\x56\x63\x54\x58\x69','\x79\x43\x6f\x4b\x6a\x38\x6f\x39\x69\x57','\x57\x51\x78\x63\x50\x48\x6d\x4f\x57\x37\x42\x63\x53\x58\x7a\x4b','\x57\x4f\x35\x4c\x42\x58\x64\x63\x47\x71','\x67\x5a\x44\x70\x68\x71','\x57\x35\x76\x50\x57\x36\x5a\x64\x4f\x6d\x6f\x70','\x65\x53\x6f\x50\x57\x50\x58\x57\x43\x6d\x6b\x44\x61\x4d\x38','\x57\x50\x78\x63\x47\x76\x70\x64\x51\x71\x79','\x57\x52\x62\x37\x67\x47\x5a\x63\x4e\x4d\x79','\x68\x76\x68\x64\x48\x68\x2f\x64\x47\x57','\x57\x50\x5a\x64\x52\x38\x6f\x58\x6e\x32\x78\x63\x53\x78\x56\x63\x4e\x31\x70\x64\x54\x38\x6b\x4d\x73\x64\x65','\x76\x4b\x33\x64\x51\x5a\x66\x41\x57\x52\x6c\x63\x4d\x32\x34','\x57\x36\x4f\x33\x57\x34\x44\x6c\x71\x38\x6f\x66\x6f\x78\x65','\x41\x6d\x6b\x4f\x64\x71\x2f\x63\x55\x61','\x45\x4b\x33\x64\x4d\x61','\x57\x52\x44\x30\x62\x71','\x57\x52\x69\x36\x66\x48\x75\x4e\x57\x35\x5a\x64\x56\x6d\x6f\x5a','\x57\x37\x7a\x34\x57\x36\x4c\x71\x57\x34\x4f','\x45\x64\x70\x64\x53\x4e\x56\x63\x54\x66\x78\x63\x48\x53\x6f\x30','\x62\x59\x37\x63\x4b\x4a\x33\x63\x49\x57','\x6f\x77\x6c\x64\x55\x31\x33\x64\x54\x66\x69\x35\x6f\x61','\x57\x34\x5a\x63\x54\x6d\x6f\x78\x6b\x71\x37\x63\x4d\x73\x68\x63\x4e\x47','\x76\x32\x4e\x64\x4e\x30\x31\x5a','\x57\x52\x68\x64\x52\x38\x6f\x67','\x69\x53\x6b\x33\x42\x78\x37\x64\x49\x74\x38','\x64\x57\x56\x63\x53\x74\x78\x63\x53\x57','\x57\x35\x72\x6e\x57\x37\x42\x64\x56\x53\x6f\x42\x74\x4b\x7a\x34','\x46\x49\x64\x64\x52\x4d\x75','\x79\x43\x6b\x6c\x6b\x48\x70\x63\x48\x61','\x78\x6d\x6b\x6f\x57\x36\x66\x6e\x66\x58\x70\x63\x56\x77\x4b','\x44\x6d\x6f\x34\x45\x48\x57\x33','\x76\x76\x58\x72\x6b\x61\x65','\x57\x4f\x6c\x63\x52\x62\x75','\x57\x52\x62\x64\x57\x4f\x65\x31\x57\x52\x30','\x75\x32\x4c\x6d\x6a\x47\x58\x55\x57\x52\x78\x63\x4a\x47','\x6b\x6d\x6b\x58\x43\x61','\x57\x37\x4f\x53\x57\x35\x66\x68','\x6c\x38\x6b\x4c\x44\x57','\x63\x73\x6e\x50\x66\x73\x53','\x61\x6d\x6f\x2b\x57\x37\x4a\x63\x4d\x72\x65','\x67\x58\x4a\x64\x4d\x75\x70\x64\x4b\x74\x4e\x64\x53\x53\x6f\x67','\x57\x4f\x69\x41\x6e\x53\x6b\x4d','\x71\x4b\x4a\x63\x55\x75\x54\x78\x74\x75\x39\x64','\x57\x36\x4b\x6d\x57\x36\x43\x33\x57\x34\x4f','\x77\x4c\x72\x74\x6c\x47','\x57\x52\x65\x54\x62\x74\x61\x72','\x57\x52\x61\x56\x62\x76\x66\x6c\x57\x35\x42\x64\x56\x6d\x6f\x33','\x57\x34\x43\x30\x76\x38\x6f\x7a\x65\x71','\x57\x50\x2f\x64\x4a\x38\x6f\x4c\x57\x51\x74\x64\x53\x53\x6f\x37\x63\x6d\x6f\x47','\x67\x72\x5a\x63\x55\x4e\x61','\x57\x36\x5a\x63\x48\x38\x6b\x7a\x72\x57\x64\x64\x48\x48\x74\x63\x4a\x61','\x72\x4a\x70\x63\x55\x4b\x4b\x69\x57\x52\x6d\x6c\x45\x47','\x6b\x61\x68\x64\x4e\x4b\x6c\x64\x53\x57','\x72\x66\x7a\x78\x68\x71\x75','\x57\x35\x2f\x63\x53\x53\x6b\x53\x41\x4a\x42\x64\x53\x62\x37\x63\x4f\x57','\x6f\x6d\x6b\x2f\x46\x66\x52\x64\x4d\x73\x37\x63\x4d\x43\x6f\x76','\x6f\x78\x57\x39\x57\x34\x65','\x57\x51\x71\x30\x67\x38\x6b\x61\x72\x38\x6b\x30\x57\x4f\x70\x63\x56\x71','\x57\x34\x37\x64\x54\x38\x6b\x32\x42\x4b\x31\x34\x57\x36\x79\x44','\x57\x34\x57\x32\x57\x34\x69\x36\x57\x37\x43\x72\x6e\x57','\x57\x37\x33\x64\x4b\x38\x6b\x6e\x74\x4d\x79','\x57\x36\x50\x51\x72\x76\x44\x71\x57\x4f\x64\x64\x4d\x43\x6f\x78\x57\x36\x33\x64\x55\x6d\x6f\x39\x57\x35\x57','\x57\x4f\x6a\x32\x63\x67\x74\x64\x55\x38\x6f\x77\x57\x51\x4a\x64\x4d\x61','\x46\x38\x6b\x67\x74\x33\x4f\x4b\x57\x4f\x75\x46','\x57\x51\x58\x76\x57\x51\x50\x2f\x57\x51\x4e\x64\x49\x48\x6c\x63\x4a\x57','\x75\x68\x42\x64\x4f\x32\x48\x64\x72\x53\x6f\x61\x57\x34\x69','\x57\x51\x58\x57\x66\x57\x46\x64\x4c\x63\x61','\x75\x53\x6b\x2b\x57\x35\x34\x4e\x41\x6d\x6f\x38\x57\x4f\x38\x36','\x67\x6d\x6f\x41\x57\x37\x70\x64\x52\x6d\x6f\x77','\x57\x52\x71\x64\x64\x38\x6b\x54\x76\x47','\x72\x5a\x56\x63\x56\x4b\x69\x79\x57\x52\x75\x31\x78\x71','\x6b\x6d\x6b\x31\x79\x53\x6f\x69\x6a\x6d\x6f\x61\x7a\x66\x4f','\x77\x5a\x68\x64\x56\x30\x71\x65\x57\x52\x43\x4e\x45\x47','\x6a\x43\x6b\x39\x74\x38\x6f\x41\x6d\x71','\x68\x65\x5a\x63\x55\x65\x44\x44\x57\x35\x37\x64\x55\x53\x6b\x56','\x57\x36\x79\x55\x57\x37\x4f\x79\x57\x34\x69','\x57\x35\x4f\x67\x74\x43\x6f\x45\x65\x61','\x6b\x65\x74\x64\x48\x32\x43','\x57\x50\x4e\x63\x56\x31\x4e\x64\x54\x30\x35\x5a','\x57\x52\x61\x59\x66\x47\x4f\x74\x57\x34\x71','\x6b\x63\x33\x63\x49\x71\x71\x78\x6e\x72\x72\x70\x57\x50\x38','\x78\x64\x56\x63\x56\x4c\x71\x45\x57\x51\x38','\x76\x53\x6f\x6f\x6f\x38\x6f\x62\x66\x64\x31\x63\x72\x57','\x57\x4f\x42\x63\x50\x75\x79','\x66\x53\x6f\x43\x57\x50\x72\x4f\x72\x57','\x78\x43\x6b\x46\x57\x36\x71','\x57\x4f\x6c\x63\x56\x4d\x42\x64\x55\x48\x75\x30\x57\x37\x57\x7a','\x57\x35\x5a\x64\x55\x43\x6b\x4d\x46\x33\x44\x57\x57\x36\x79\x44','\x70\x43\x6f\x48\x57\x37\x7a\x64\x6e\x38\x6b\x65\x74\x43\x6b\x4e','\x45\x4e\x56\x64\x49\x72\x71\x79','\x45\x68\x33\x64\x50\x62\x57\x57','\x73\x38\x6f\x72\x68\x53\x6b\x62\x63\x74\x50\x61\x77\x71','\x57\x51\x7a\x6f\x57\x4f\x6d\x54\x57\x52\x69','\x57\x52\x79\x49\x57\x4f\x44\x64\x61\x53\x6f\x70\x6d\x78\x34','\x41\x43\x6b\x5a\x45\x67\x46\x63\x49\x67\x4e\x64\x48\x43\x6b\x30','\x78\x30\x4e\x63\x51\x76\x69\x76','\x6a\x6d\x6f\x6f\x57\x52\x48\x4e\x72\x57','\x69\x6d\x6f\x54\x57\x34\x4a\x63\x49\x47\x53','\x74\x77\x68\x63\x56\x65\x65\x6e','\x57\x50\x4a\x64\x50\x64\x37\x64\x4e\x71','\x6a\x6d\x6b\x56\x46\x61','\x42\x64\x64\x63\x54\x61\x46\x64\x52\x38\x6f\x58\x57\x36\x56\x64\x50\x57','\x6b\x6d\x6b\x74\x6b\x66\x53\x56\x57\x37\x48\x68\x71\x43\x6b\x50','\x57\x51\x37\x63\x4e\x43\x6f\x65','\x57\x51\x33\x64\x4b\x38\x6b\x79\x6e\x75\x6c\x49\x47\x6b\x2f\x63\x50\x43\x6f\x74','\x45\x6d\x6b\x38\x57\x37\x71\x69\x65\x57','\x57\x34\x31\x6e\x57\x37\x44\x45','\x71\x66\x6c\x63\x50\x4b\x75\x6a','\x72\x72\x30\x6e\x6a\x57\x7a\x49\x57\x51\x68\x63\x4c\x47','\x57\x51\x64\x63\x4a\x73\x64\x63\x50\x5a\x4b','\x61\x38\x6f\x55\x57\x4f\x44\x53\x43\x6d\x6b\x6d\x62\x68\x4b','\x6a\x43\x6f\x41\x57\x35\x4a\x63\x55\x74\x70\x63\x55\x59\x35\x6a','\x57\x35\x64\x63\x50\x6d\x6f\x6e\x62\x47','\x6f\x43\x6f\x51\x57\x37\x31\x77\x66\x43\x6b\x43\x41\x38\x6b\x48','\x41\x6d\x6b\x79\x67\x48\x64\x63\x50\x64\x6c\x64\x4e\x76\x57','\x57\x51\x62\x4e\x44\x61\x37\x63\x4f\x47','\x57\x51\x71\x36\x61\x6d\x6b\x44\x72\x57','\x57\x52\x50\x32\x71\x58\x5a\x63\x4e\x47','\x7a\x76\x68\x64\x4e\x66\x4c\x53\x79\x6d\x6f\x47\x57\x36\x75','\x6a\x6d\x6f\x38\x57\x35\x64\x63\x56\x74\x4a\x63\x48\x64\x72\x73','\x57\x4f\x4e\x63\x54\x61\x50\x56\x78\x57','\x57\x50\x42\x64\x48\x53\x6f\x67\x57\x35\x74\x64\x56\x71','\x57\x50\x5a\x64\x4a\x53\x6f\x48\x57\x37\x5a\x63\x54\x43\x6f\x48\x68\x38\x6b\x30','\x57\x34\x68\x63\x4c\x48\x64\x63\x49\x48\x66\x4f\x57\x37\x33\x49\x47\x7a\x65','\x43\x75\x5a\x64\x4c\x68\x66\x79','\x57\x4f\x4c\x68\x46\x57','\x6d\x53\x6f\x6e\x57\x35\x4a\x63\x4f\x4a\x37\x63\x47\x57','\x57\x50\x6c\x64\x55\x63\x42\x64\x4d\x32\x57\x5a\x57\x34\x64\x63\x54\x71','\x6a\x5a\x74\x63\x4f\x72\x37\x63\x52\x53\x6b\x4f\x57\x34\x4e\x64\x55\x47','\x57\x37\x75\x51\x57\x34\x6e\x68','\x78\x49\x64\x64\x50\x67\x37\x63\x4b\x47\x74\x63\x56\x78\x57','\x57\x50\x78\x63\x50\x78\x70\x64\x52\x57\x4f\x30\x57\x37\x34\x68','\x57\x35\x47\x4f\x57\x36\x71\x73\x57\x37\x43','\x57\x51\x4e\x63\x56\x58\x64\x63\x54\x48\x38','\x57\x35\x57\x62\x57\x35\x79\x78\x57\x36\x79','\x66\x30\x74\x64\x4b\x77\x70\x64\x55\x32\x57\x76\x63\x61','\x57\x51\x57\x2b\x65\x6d\x6b\x45\x79\x38\x6b\x37\x57\x50\x37\x63\x4e\x57','\x57\x51\x54\x2f\x6c\x64\x33\x63\x51\x61\x38\x39\x57\x36\x75','\x44\x53\x6b\x72\x57\x37\x4b\x78\x66\x62\x4e\x63\x55\x31\x75','\x57\x4f\x6a\x4b\x57\x51\x71\x48\x57\x51\x46\x64\x53\x6d\x6b\x42\x69\x71','\x57\x50\x66\x55\x6c\x62\x5a\x63\x52\x4b\x31\x5a\x57\x35\x38','\x57\x4f\x70\x64\x51\x38\x6f\x32\x57\x37\x37\x64\x53\x71','\x62\x38\x6f\x74\x57\x4f\x7a\x4d\x73\x53\x6b\x6d\x61\x71','\x77\x4d\x39\x6a\x62\x61\x65','\x76\x53\x6f\x6f\x73\x6d\x6f\x78\x68\x59\x72\x6e\x75\x57','\x69\x47\x68\x63\x4e\x74\x70\x63\x52\x61','\x62\x53\x6f\x33\x57\x51\x7a\x64\x43\x61','\x57\x35\x61\x6f\x45\x6d\x6f\x56\x62\x63\x57\x49\x57\x36\x4b','\x57\x50\x58\x6f\x57\x51\x72\x4b\x57\x51\x57','\x72\x38\x6f\x53\x63\x43\x6f\x6e\x6d\x4a\x31\x62\x72\x71','\x63\x53\x6b\x79\x44\x53\x6f\x4b\x69\x61','\x6b\x6d\x6f\x66\x57\x35\x5a\x63\x56\x59\x4a\x63\x4e\x57','\x71\x63\x71\x75\x65\x78\x33\x63\x4e\x6d\x6f\x37\x77\x61','\x57\x34\x37\x63\x55\x6d\x6b\x49\x41\x47','\x57\x4f\x4a\x63\x4b\x47\x64\x63\x4a\x4a\x38\x4d\x57\x52\x71\x5a','\x57\x52\x68\x63\x4e\x6d\x6f\x64','\x57\x4f\x34\x70\x57\x51\x46\x63\x49\x53\x6b\x6e\x63\x30\x6a\x34\x42\x5a\x52\x63\x56\x72\x34','\x41\x6d\x6f\x4c\x78\x5a\x30\x59\x78\x4c\x2f\x64\x4a\x47','\x57\x51\x7a\x63\x70\x30\x6d','\x57\x4f\x74\x63\x52\x31\x38','\x64\x31\x78\x64\x48\x4e\x52\x64\x4d\x78\x71\x30\x63\x47','\x57\x34\x39\x72\x57\x37\x79','\x75\x33\x6c\x64\x54\x4a\x43\x78','\x74\x75\x56\x63\x4f\x30\x61\x44','\x65\x5a\x33\x64\x4e\x67\x68\x64\x56\x71','\x79\x58\x6c\x63\x4b\x68\x65\x49\x57\x4f\x34\x69\x77\x47','\x76\x30\x68\x63\x4a\x68\x6d\x43','\x57\x37\x30\x54\x57\x34\x79\x32\x57\x34\x6d','\x57\x50\x4e\x63\x4f\x61\x57\x4f\x57\x35\x56\x63\x4b\x64\x53\x6a','\x65\x38\x6f\x6b\x57\x35\x7a\x4e\x69\x38\x6b\x4d\x44\x53\x6b\x75','\x57\x34\x6c\x63\x4d\x38\x6b\x39\x57\x52\x42\x63\x51\x43\x6b\x2f\x64\x43\x6b\x4f\x57\x37\x35\x77\x57\x34\x37\x64\x51\x71','\x57\x50\x47\x43\x6f\x57','\x57\x34\x48\x53\x57\x36\x78\x64\x52\x6d\x6f\x39','\x57\x51\x2f\x64\x50\x74\x33\x64\x4d\x4c\x34\x2f\x57\x35\x56\x63\x55\x61','\x57\x35\x6e\x77\x57\x37\x52\x64\x4e\x43\x6f\x44\x74\x4d\x50\x47','\x57\x51\x54\x55\x57\x51\x44\x52\x57\x50\x4a\x64\x4a\x61\x52\x63\x4e\x47','\x57\x34\x31\x6e\x57\x37\x31\x76\x57\x36\x52\x63\x4f\x6d\x6f\x52\x57\x50\x71','\x57\x50\x70\x64\x47\x38\x6f\x47\x57\x37\x46\x64\x52\x53\x6f\x38\x68\x38\x6b\x4a','\x72\x4c\x33\x63\x53\x4c\x69\x7a','\x72\x53\x6b\x42\x57\x36\x6d\x59\x66\x62\x2f\x63\x56\x31\x53','\x57\x50\x78\x63\x56\x4c\x68\x64\x51\x57','\x78\x75\x64\x64\x50\x71','\x62\x43\x6f\x4d\x57\x35\x64\x64\x4d\x43\x6f\x55','\x57\x51\x5a\x63\x56\x6d\x6f\x70\x71\x61\x30','\x73\x62\x4e\x63\x4a\x73\x6c\x63\x4a\x4b\x6d\x78\x70\x68\x34\x64\x57\x35\x57','\x57\x52\x2f\x63\x4f\x47\x72\x47\x57\x37\x47','\x57\x34\x65\x7a\x46\x6d\x6f\x2f\x66\x57','\x46\x57\x68\x63\x4c\x33\x6d\x2f\x57\x50\x47\x70\x77\x71','\x57\x51\x54\x58\x57\x4f\x75\x75\x68\x43\x6b\x76\x7a\x33\x71\x33\x62\x62\x42\x63\x54\x38\x6f\x76','\x57\x4f\x64\x64\x55\x53\x6f\x68\x57\x34\x56\x64\x56\x71','\x76\x53\x6f\x56\x65\x43\x6f\x78\x63\x57','\x7a\x4c\x33\x64\x4d\x68\x44\x4c\x42\x6d\x6f\x2b\x57\x34\x30','\x57\x51\x64\x63\x53\x74\x72\x54\x75\x47','\x57\x50\x4f\x41\x63\x49\x53\x70','\x6c\x74\x42\x63\x51\x48\x2f\x63\x56\x53\x6b\x2f\x57\x37\x61','\x6c\x33\x42\x63\x56\x64\x4e\x64\x48\x4c\x46\x63\x4d\x4b\x43\x36\x75\x59\x61\x48','\x78\x53\x6b\x78\x57\x34\x79\x37\x65\x61','\x57\x51\x68\x64\x55\x31\x71\x46\x57\x52\x43','\x71\x43\x6b\x55\x57\x36\x75\x71\x68\x62\x56\x63\x56\x77\x6d','\x6d\x53\x6b\x31\x41\x43\x6f\x6a\x69\x53\x6f\x67\x71\x4d\x61','\x6b\x53\x6b\x56\x46\x68\x37\x64\x52\x59\x37\x63\x48\x43\x6f\x58','\x57\x51\x74\x63\x4f\x30\x42\x64\x51\x57\x47','\x41\x6d\x6b\x48\x6d\x71\x68\x63\x4f\x71','\x57\x4f\x5a\x63\x47\x47\x56\x63\x4d\x47','\x57\x52\x7a\x78\x74\x59\x5a\x63\x4c\x71','\x57\x37\x6c\x63\x53\x6d\x6b\x4a\x45\x58\x33\x64\x53\x73\x4e\x63\x49\x57','\x7a\x33\x46\x64\x4c\x59\x6e\x68','\x43\x53\x6f\x77\x42\x62\x58\x66\x57\x35\x62\x72\x41\x57','\x57\x35\x4c\x76\x57\x35\x4a\x64\x4a\x53\x6f\x6f','\x57\x34\x74\x63\x50\x38\x6b\x57\x6f\x5a\x70\x64\x52\x74\x4e\x63\x56\x47','\x6b\x6d\x6b\x31\x7a\x4e\x2f\x64\x4d\x73\x4a\x63\x4e\x43\x6f\x61','\x45\x63\x72\x4a\x57\x35\x56\x63\x56\x4a\x68\x63\x54\x4e\x79','\x57\x50\x61\x4a\x76\x67\x46\x64\x48\x38\x6f\x71\x57\x51\x78\x64\x4b\x71','\x57\x52\x50\x79\x66\x57\x33\x64\x4f\x59\x66\x4f\x57\x50\x4f','\x6d\x75\x53\x53\x57\x50\x42\x64\x4b\x57','\x57\x4f\x42\x64\x51\x63\x6c\x64\x4e\x78\x53\x55\x57\x37\x52\x63\x54\x71','\x6a\x68\x57\x34\x57\x52\x74\x64\x53\x4e\x33\x64\x53\x59\x53','\x68\x67\x56\x64\x52\x76\x75\x36\x57\x4f\x61\x2b\x74\x38\x6f\x36','\x57\x35\x33\x63\x49\x38\x6f\x65\x6b\x71\x54\x4b\x57\x51\x75\x53','\x46\x38\x6b\x7a\x57\x36\x43\x6a\x67\x61','\x57\x4f\x62\x6c\x57\x4f\x58\x78\x57\x50\x71','\x42\x38\x6f\x6d\x63\x76\x4e\x63\x56\x64\x74\x64\x4d\x66\x6d'];_0x1d02=function(){return _0x5d27d0;};return _0x1d02();}function _0x5bf770(_0x280202,_0x105120){const _0x49150a=_0xbc6e87,_0x119cc6={'\x43\x45\x4f\x48\x45':function(_0x25dddf,_0x15ece2,_0x23ae3c){return _0x25dddf(_0x15ece2,_0x23ae3c);},'\x68\x77\x64\x61\x61':function(_0x1c101d,_0x9845dc){return _0x1c101d===_0x9845dc;},'\x54\x59\x41\x44\x57':function(_0x39fb0f,_0x3dd3d2){return _0x39fb0f!==_0x3dd3d2;},'\x41\x52\x75\x44\x68':_0x49150a(0x151,'\x57\x4f\x65\x78'),'\x43\x45\x79\x4e\x69':function(_0x2631c7,_0x5dca59,_0x3511ba){return _0x2631c7(_0x5dca59,_0x3511ba);},'\x50\x58\x74\x69\x42':_0x49150a(0x119,'\x37\x40\x47\x33'),'\x69\x51\x78\x58\x71':_0x49150a(0x154,'\x29\x62\x4b\x47'),'\x41\x67\x46\x74\x41':function(_0x320511,_0x3220bf){return _0x320511&&_0x3220bf;},'\x50\x4f\x6f\x6b\x64':function(_0x52c0d9,_0xff9132){return _0x52c0d9(_0xff9132);},'\x43\x4f\x59\x70\x55':function(_0x573172,_0x20feee,_0x39e1c5){return _0x573172(_0x20feee,_0x39e1c5);}};function _0x16efa5(_0x50ce46,_0x4f6e6b){const _0x23e6d9=_0x49150a;if(_0x50ce46)return _0x119cc6[_0x23e6d9(0x219,'\x29\x33\x40\x5d')](_0x105120,_0x50ce46,_0x4f6e6b);try{if(_0x4f6e6b&&_0x119cc6[_0x23e6d9(0x13a,'\x79\x79\x51\x66')](typeof _0x4f6e6b[_0x23e6d9(0x13b,'\x77\x6b\x59\x34')+_0x23e6d9(0x109,'\x61\x5a\x59\x62')],_0x23e6d9(0x107,'\x43\x51\x77\x71'))){if(_0x119cc6[_0x23e6d9(0x142,'\x64\x79\x5a\x5b')](_0x119cc6[_0x23e6d9(0x231,'\x37\x40\x47\x33')],_0x119cc6[_0x23e6d9(0x181,'\x5e\x2a\x67\x4e')])){const _0x20cbcf={};return _0x20cbcf[_0x23e6d9(0x1ef,'\x4b\x6e\x6e\x74')]=_0xe7c8ed,_0x20cbcf[_0x23e6d9(0x1e5,'\x42\x24\x47\x32')+_0x23e6d9(0x1b9,'\x57\x4f\x65\x78')]=0x2710,_0x20cbcf[_0x23e6d9(0x122,'\x39\x68\x54\x65')+_0x23e6d9(0x11d,'\x29\x33\x40\x5d')+_0x23e6d9(0x171,'\x4e\x51\x6d\x75')]=0xea60,_0x20cbcf[_0x23e6d9(0x1af,'\x37\x40\x47\x33')+_0x23e6d9(0x230,'\x6f\x66\x77\x75')]=0xafc8,_0x20cbcf[_0x23e6d9(0x258,'\x62\x5a\x51\x7a')+'\x6f\x75\x74']=0xafc8,_0x20cbcf[_0x23e6d9(0x1f7,'\x72\x51\x29\x72')+'\x6e\x67']=0x1,new _0x268e43(_0x20cbcf);}else _0x4f6e6b[_0x23e6d9(0x1d3,'\x49\x33\x21\x57')+'\x6c\x69\x76\x65'](!![],0x5db9+-0x2c14+0x8f3);}}catch(_0x103518){}_0x119cc6[_0x23e6d9(0x149,'\x52\x52\x4c\x4f')](_0x105120,null,_0x4f6e6b);}return _0x119cc6[_0x49150a(0x167,'\x62\x5a\x51\x7a')](_0x935744,_0x280202,function(_0x5854c5,_0x583d6f){const _0x1251ee=_0x49150a;if(_0x119cc6[_0x1251ee(0x193,'\x4f\x73\x78\x75')]!==_0x119cc6[_0x1251ee(0x21d,'\x4f\x73\x78\x75')]){if(_0x119cc6[_0x1251ee(0x274,'\x2a\x4e\x4f\x64')](_0x5854c5,_0xc2cff9)&&_0x119cc6[_0x1251ee(0x204,'\x61\x5a\x59\x62')](_0x15a481,_0x5854c5))return _0x119cc6[_0x1251ee(0x254,'\x52\x4f\x30\x45')](_0xc2cff9,_0x280202,_0x16efa5);return _0x119cc6[_0x1251ee(0xfd,'\x29\x62\x4b\x47')](_0x16efa5,_0x5854c5,_0x583d6f);}else return _0x452192;});}_0x5bf770[_0xbc6e87(0x24e,'\x64\x6c\x4e\x65')+_0xbc6e87(0xf6,'\x61\x37\x79\x49')+'\x65\x64']=!![];function _0x57bc6f(){const _0xc33e9b=_0xbc6e87,_0x31011f={};return _0x31011f[_0xc33e9b(0x253,'\x72\x51\x29\x72')]=_0x5bf770,_0x31011f[_0xc33e9b(0x270,'\x55\x5a\x65\x59')+_0xc33e9b(0xff,'\x4e\x35\x31\x24')]=0x2710,_0x31011f[_0xc33e9b(0x228,'\x52\x52\x4c\x4f')+'\x65\x4d\x61\x78\x54\x69\x6d\x65'+_0xc33e9b(0x23d,'\x5e\x2a\x67\x4e')]=0xea60,_0x31011f[_0xc33e9b(0x25e,'\x4d\x28\x7a\x2a')+_0xc33e9b(0x1d2,'\x5b\x65\x4b\x44')]=0x7530,_0x31011f[_0xc33e9b(0x26f,'\x52\x4f\x30\x45')+_0xc33e9b(0x226,'\x6a\x29\x54\x74')]=0x7530,_0x31011f[_0xc33e9b(0x1a0,'\x29\x62\x4b\x47')+'\x6e\x67']=0x1,new _0x6c6aeb(_0x31011f);}function _0x11385a(){const _0xb3a8d5=_0xbc6e87,_0x49bdaf={'\x76\x66\x68\x4d\x79':function(_0x34f7a3,_0x5f0299){return _0x34f7a3+_0x5f0299;},'\x78\x45\x79\x5a\x65':_0xb3a8d5(0x135,'\x43\x51\x77\x71')+'\x68\x5d\x20\x48\x75\x62\x20\x55'+'\x52\x4c\x20\x6d\x75\x73\x74\x20'+_0xb3a8d5(0x1a3,'\x28\x39\x46\x6c')+'\x73\x3a\x2f\x2f\x20\u2014\x20\x67'+_0xb3a8d5(0x127,'\x79\x5a\x36\x34'),'\x68\x58\x64\x66\x58':function(_0x2ff945,_0x398499){return _0x2ff945!==_0x398499;},'\x59\x55\x73\x72\x5a':_0xb3a8d5(0x187,'\x55\x5a\x65\x59'),'\x71\x51\x78\x45\x59':_0xb3a8d5(0x13f,'\x78\x54\x33\x69'),'\x6b\x69\x51\x42\x61':_0xb3a8d5(0x15b,'\x43\x53\x55\x59')+_0xb3a8d5(0x1bd,'\x37\x40\x47\x33'),'\x71\x79\x56\x66\x6b':_0xb3a8d5(0x205,'\x79\x79\x51\x66'),'\x56\x59\x50\x6f\x45':function(_0x5991e5,_0x4b269d,_0x4a077a){return _0x5991e5(_0x4b269d,_0x4a077a);},'\x68\x52\x76\x4a\x55':function(_0x100b45){return _0x100b45();}},_0x4febd3=(function(){const _0x4b7881=_0xb3a8d5,_0x8f0349={'\x4b\x4c\x70\x46\x5a':function(_0x213c51,_0x14642){return _0x213c51+_0x14642;},'\x77\x50\x51\x55\x58':function(_0x5ae3f2,_0x13e54a){const _0x1d4122=_0x56e8;return _0x49bdaf[_0x1d4122(0x174,'\x43\x53\x55\x59')](_0x5ae3f2,_0x13e54a);},'\x6c\x54\x7a\x7a\x65':_0x49bdaf[_0x4b7881(0x17e,'\x70\x70\x47\x29')],'\x7a\x55\x4a\x50\x46':function(_0x3e189c,_0x4ae587){const _0x6cf662=_0x4b7881;return _0x49bdaf[_0x6cf662(0x1f3,'\x64\x79\x5a\x5b')](_0x3e189c,_0x4ae587);},'\x4b\x4d\x6c\x74\x56':_0x49bdaf['\x59\x55\x73\x72\x5a'],'\x49\x6c\x74\x61\x64':_0x49bdaf['\x71\x51\x78\x45\x59'],'\x77\x56\x63\x44\x5a':_0x4b7881(0xfb,'\x29\x62\x4b\x47'),'\x4f\x48\x55\x6e\x66':_0x49bdaf[_0x4b7881(0x12e,'\x57\x67\x5d\x51')]};if(_0x4b7881(0x17d,'\x6a\x29\x54\x74')===_0x49bdaf[_0x4b7881(0x176,'\x61\x37\x79\x49')]){let _0x3327cb=!![];return function(_0x1967df,_0x1a5182){const _0x5a5189=_0x3327cb?function(){const _0x2ed6ba=_0x56e8,_0x4f63fc={'\x4e\x71\x42\x51\x69':function(_0x19b7c5,_0x5b6a4a){const _0x89563e=_0x56e8;return _0x8f0349[_0x89563e(0x1a6,'\x61\x37\x79\x49')](_0x19b7c5,_0x5b6a4a);},'\x73\x44\x65\x76\x72':function(_0x24f757,_0xffe068){const _0x41313d=_0x56e8;return _0x8f0349[_0x41313d(0x1c0,'\x64\x38\x71\x44')](_0x24f757,_0xffe068);},'\x63\x4b\x6a\x72\x75':_0x8f0349[_0x2ed6ba(0x1d7,'\x28\x39\x46\x6c')]};if(_0x8f0349[_0x2ed6ba(0x195,'\x29\x62\x4b\x47')](_0x2ed6ba(0x1fb,'\x29\x62\x4b\x47'),_0x8f0349[_0x2ed6ba(0x185,'\x55\x44\x45\x78')]))throw new _0x522db8(_0x4f63fc[_0x2ed6ba(0x164,'\x62\x5a\x51\x7a')](_0x4f63fc[_0x2ed6ba(0x203,'\x52\x33\x28\x71')](_0x4f63fc[_0x2ed6ba(0x225,'\x64\x38\x71\x44')](_0x4f63fc[_0x2ed6ba(0x27a,'\x79\x79\x51\x66')],_0x38ff49[_0x2ed6ba(0xfa,'\x64\x38\x71\x44')+'\x79'](_0x529ea8)),'\x2e\x20'),_0x2ed6ba(0x197,'\x4d\x28\x7a\x2a')+'\x41\x50\x5f\x48\x55\x42\x5f\x41'+_0x2ed6ba(0x18e,'\x29\x79\x31\x6a')+'\x45\x43\x55\x52\x45\x3d\x31\x20'+_0x2ed6ba(0x118,'\x29\x33\x40\x5d')+_0x2ed6ba(0xf4,'\x65\x4b\x44\x5a')+_0x2ed6ba(0x22a,'\x5b\x65\x4b\x44')+_0x2ed6ba(0x16d,'\x43\x51\x77\x71')+'\x6f\x6e\x6c\x79\x29\x2e'));else{if(_0x1a5182){if(_0x8f0349[_0x2ed6ba(0x211,'\x4b\x7a\x4b\x45')]===_0x8f0349[_0x2ed6ba(0x21b,'\x29\x62\x4b\x47')])_0x1ab3c0[_0x2ed6ba(0x147,'\x6a\x29\x54\x74')+_0x2ed6ba(0x27b,'\x43\x51\x77\x71')](!![],-0x731f+0x675c+-0x7*-0xa0d);else{const _0x2bc6c0=_0x1a5182[_0x2ed6ba(0x221,'\x77\x73\x7a\x51')](_0x1967df,arguments);return _0x1a5182=null,_0x2bc6c0;}}}}:function(){};return _0x3327cb=![],_0x5a5189;};}else return _0x2d6a8d[_0x4b7881(0x26a,'\x29\x33\x40\x5d')]()[_0x4b7881(0x106,'\x4e\x35\x31\x24')](jwPEcX[_0x4b7881(0x16b,'\x29\x79\x31\x6a')])['\x74\x6f\x53\x74\x72\x69\x6e\x67']()[_0x4b7881(0x1ca,'\x4f\x73\x78\x75')+_0x4b7881(0x238,'\x28\x39\x46\x6c')](_0x56d369)[_0x4b7881(0x25a,'\x2a\x38\x53\x64')](jwPEcX['\x4f\x48\x55\x6e\x66']);}()),_0x18a3a5=_0x49bdaf[_0xb3a8d5(0x14d,'\x49\x53\x62\x5e')](_0x4febd3,this,function(){const _0x19b68d=_0xb3a8d5;return _0x18a3a5[_0x19b68d(0x125,'\x70\x70\x47\x29')]()['\x73\x65\x61\x72\x63\x68'](_0x49bdaf[_0x19b68d(0x14c,'\x77\x6b\x59\x34')])[_0x19b68d(0x26e,'\x57\x4f\x65\x78')]()[_0x19b68d(0x139,'\x58\x76\x24\x74')+_0x19b68d(0x20e,'\x64\x6c\x4e\x65')](_0x18a3a5)[_0x19b68d(0x269,'\x4d\x28\x7a\x2a')](_0x19b68d(0x216,'\x4d\x28\x7a\x2a')+_0x19b68d(0x249,'\x66\x42\x2a\x32'));});_0x49bdaf[_0xb3a8d5(0x217,'\x61\x5a\x59\x62')](_0x18a3a5);const _0x4ba09d={};return _0x4ba09d['\x63\x6f\x6e\x6e\x65\x63\x74']=_0x5bf770,_0x4ba09d[_0xb3a8d5(0x1fa,'\x4b\x6e\x6e\x74')+_0xb3a8d5(0x137,'\x62\x5a\x51\x7a')]=0x2710,_0x4ba09d['\x6b\x65\x65\x70\x41\x6c\x69\x76'+_0xb3a8d5(0x113,'\x2a\x4e\x4f\x64')+_0xb3a8d5(0x123,'\x78\x54\x33\x69')]=0xea60,_0x4ba09d[_0xb3a8d5(0x19b,'\x52\x33\x28\x71')+_0xb3a8d5(0x11f,'\x4e\x35\x31\x24')]=0xfde8,_0x4ba09d[_0xb3a8d5(0x1e9,'\x6a\x29\x54\x74')+_0xb3a8d5(0x17c,'\x2a\x38\x53\x64')]=0xfde8,_0x4ba09d['\x70\x69\x70\x65\x6c\x69\x6e\x69'+'\x6e\x67']=0x1,new _0x6c6aeb(_0x4ba09d);}function _0x20f7dc(){const _0xd5dd4c=_0xbc6e87,_0x55b2d8={};return _0x55b2d8[_0xd5dd4c(0x14a,'\x37\x40\x47\x33')]=_0x5bf770,_0x55b2d8[_0xd5dd4c(0x110,'\x29\x79\x31\x6a')+_0xd5dd4c(0x23a,'\x65\x4b\x44\x5a')]=0x2710,_0x55b2d8[_0xd5dd4c(0x1c3,'\x47\x44\x2a\x4e')+_0xd5dd4c(0x1c2,'\x5b\x65\x4b\x44')+_0xd5dd4c(0x27c,'\x6f\x66\x77\x75')]=0xea60,_0x55b2d8[_0xd5dd4c(0x1a7,'\x2a\x38\x53\x64')+_0xd5dd4c(0x267,'\x52\x52\x4c\x4f')]=0xafc8,_0x55b2d8[_0xd5dd4c(0x1f8,'\x28\x39\x46\x6c')+_0xd5dd4c(0x13d,'\x66\x42\x2a\x32')]=0xafc8,_0x55b2d8[_0xd5dd4c(0xfe,'\x6a\x29\x54\x74')+'\x6e\x67']=0x1,new _0x6c6aeb(_0x55b2d8);}function _0x93a43b(){const _0x5a21e3=_0xbc6e87,_0x38f05e={..._0x50c1d7},_0x10174f={..._0x50c1d7},_0x3ee883={..._0x4221a3},_0x43d741={};return _0x43d741[_0x5a21e3(0x1f5,'\x5e\x2a\x67\x4e')+_0x5a21e3(0x20c,'\x61\x5a\x59\x62')]=_0xe0a0b5,_0x43d741[_0x5a21e3(0x15a,'\x6f\x66\x77\x75')+'\x69\x6d\x65\x6f\x75\x74\x4d\x73']=_0x460f6e,_0x43d741['\x69\x70\x76\x34\x46\x69\x72\x73'+'\x74\x50\x72\x69\x6d\x61\x72\x79'+_0x5a21e3(0x1a5,'\x57\x67\x5d\x51')+_0x5a21e3(0x1a2,'\x72\x54\x34\x29')]=_0x1896e7,_0x43d741[_0x5a21e3(0x173,'\x4f\x73\x78\x75')+_0x5a21e3(0x1e1,'\x57\x67\x5d\x51')]=_0x38f05e,_0x43d741['\x70\x72\x69\x6d\x61\x72\x79\x43'+_0x5a21e3(0x136,'\x4f\x73\x78\x75')+'\x74\x73']=_0x10174f,_0x43d741[_0x5a21e3(0x1f9,'\x29\x62\x4b\x47')+_0x5a21e3(0x10a,'\x49\x33\x21\x57')+_0x5a21e3(0xef,'\x78\x54\x33\x69')]=_0xc2cff9?_0x3ee883:null,_0x43d741;}const _0x7746a6={};_0x7746a6[_0xbc6e87(0x14f,'\x5e\x2a\x67\x4e')+_0xbc6e87(0x179,'\x66\x42\x2a\x32')+'\x65\x64']=!![];const _0x30c9=new _0x26b33b[(_0xbc6e87(0x192,'\x62\x5a\x51\x7a'))](_0x7746a6);let _0x4d2890=_0x57bc6f(),_0x35f93c=_0x11385a(),_0xb837c2=_0x20f7dc();function _0x444a1f(){const _0x1eeb1b=_0xbc6e87,_0x146ea6={'\x77\x54\x77\x4c\x6a':function(_0x23395c){return _0x23395c();},'\x57\x6a\x44\x6c\x4e':'\x51\x48\x4d\x4f\x70','\x4f\x46\x70\x65\x50':_0x1eeb1b(0x1c7,'\x2a\x38\x53\x64')},_0xa8b5dd=[_0x4d2890,_0x35f93c,_0xb837c2];_0x4d2890=_0x146ea6[_0x1eeb1b(0x209,'\x64\x38\x71\x44')](_0x57bc6f),_0x35f93c=_0x146ea6[_0x1eeb1b(0x1f1,'\x57\x67\x5d\x51')](_0x11385a),_0xb837c2=_0x146ea6[_0x1eeb1b(0x1e0,'\x4b\x7a\x4b\x45')](_0x20f7dc);for(const _0x556ba1 of _0xa8b5dd){try{if(_0x146ea6[_0x1eeb1b(0x239,'\x2a\x4e\x4f\x64')]===_0x1eeb1b(0x16f,'\x79\x5a\x36\x34')){const _0x55b189=_0x556ba1['\x63\x6c\x6f\x73\x65']();if(_0x55b189&&typeof _0x55b189[_0x1eeb1b(0x237,'\x65\x4b\x44\x5a')]===_0x146ea6[_0x1eeb1b(0x264,'\x64\x79\x5a\x5b')])_0x55b189[_0x1eeb1b(0x277,'\x57\x67\x5d\x51')](()=>{});}else{const _0x513583={..._0x26f611},_0x35b116={..._0x55404d},_0x51dcd2={..._0x18e3ec},_0x54f1a3={};return _0x54f1a3['\x68\x75\x62\x49\x70\x46\x61\x6d'+_0x1eeb1b(0x1ec,'\x29\x33\x40\x5d')]=_0x41344e,_0x54f1a3[_0x1eeb1b(0x251,'\x29\x79\x31\x6a')+_0x1eeb1b(0x24b,'\x4d\x28\x7a\x2a')]=_0x3a758f,_0x54f1a3['\x69\x70\x76\x34\x46\x69\x72\x73'+_0x1eeb1b(0x14e,'\x77\x6b\x59\x34')+_0x1eeb1b(0x1cc,'\x2a\x38\x53\x64')+_0x1eeb1b(0x108,'\x37\x40\x47\x33')]=_0x492879,_0x54f1a3[_0x1eeb1b(0x138,'\x55\x44\x45\x78')+_0x1eeb1b(0x26b,'\x57\x4f\x65\x78')]=_0x513583,_0x54f1a3[_0x1eeb1b(0x170,'\x62\x5a\x51\x7a')+_0x1eeb1b(0xf9,'\x55\x5a\x65\x59')+'\x74\x73']=_0x35b116,_0x54f1a3['\x66\x61\x6c\x6c\x62\x61\x63\x6b'+_0x1eeb1b(0x112,'\x77\x6b\x59\x34')+_0x1eeb1b(0x105,'\x29\x62\x4b\x47')]=_0xb76380?_0x51dcd2:null,_0x54f1a3;}}catch(_0x56b39e){}}}function _0x2ff266(_0x2c7505){const _0x480942=_0xbc6e87,_0xf43b31={};_0xf43b31['\x74\x54\x71\x54\x43']=_0x480942(0x25b,'\x72\x54\x34\x29')+_0x480942(0x1bc,'\x28\x39\x46\x6c'),_0xf43b31[_0x480942(0x152,'\x64\x38\x71\x44')]=function(_0x5ad434,_0x4d4229){return _0x5ad434!==_0x4d4229;},_0xf43b31[_0x480942(0x163,'\x77\x6b\x59\x34')]='\x58\x5a\x7a\x6b\x45',_0xf43b31[_0x480942(0x1be,'\x4b\x7a\x4b\x45')]=function(_0x1bc69e,_0x3f4813){return _0x1bc69e===_0x3f4813;},_0xf43b31['\x73\x47\x78\x7a\x6b']=_0x480942(0x1cb,'\x66\x42\x2a\x32'),_0xf43b31[_0x480942(0x23e,'\x4b\x6e\x6e\x74')]=_0x480942(0x141,'\x28\x39\x46\x6c'),_0xf43b31['\x74\x61\x68\x44\x79']=_0x480942(0x169,'\x4e\x51\x6d\x75')+_0x480942(0x242,'\x79\x79\x51\x66')+_0x480942(0x153,'\x39\x68\x54\x65'),_0xf43b31[_0x480942(0x24d,'\x65\x4b\x44\x5a')]=_0x480942(0x120,'\x4b\x6e\x6e\x74')+_0x480942(0x102,'\x58\x76\x24\x74')+_0x480942(0x100,'\x79\x5a\x36\x34');const _0x565484=_0xf43b31,_0x4d3f1d=process.env.EVOLVER_LONG_POLL_PATH||_0x565484[_0x480942(0x134,'\x4f\x73\x78\x75')];try{if(_0x565484[_0x480942(0x152,'\x64\x38\x71\x44')](_0x565484[_0x480942(0x18c,'\x39\x68\x54\x65')],_0x480942(0x229,'\x55\x44\x45\x78'))){if(!_0x154727)return![];if(_0x24ea20[_0x480942(0x23b,'\x5e\x2a\x67\x4e')](_0x4dbbe5[_0x480942(0x1dc,'\x37\x40\x47\x33')]))return!![];if(_0x3eaac7['\x63\x61\x75\x73\x65']&&_0x3acd8f[_0x480942(0x227,'\x2a\x38\x53\x64')](_0xe2e1fd[_0x480942(0xfc,'\x29\x79\x31\x6a')][_0x480942(0xf2,'\x55\x44\x45\x78')]))return!![];return![];}else{const _0x2a9de2=new URL(_0x2c7505);if(_0x565484[_0x480942(0x11e,'\x5e\x2a\x67\x4e')](_0x2a9de2[_0x480942(0x252,'\x52\x4f\x30\x45')],_0x4d3f1d))return _0x565484[_0x480942(0x115,'\x58\x76\x24\x74')]===_0x565484['\x66\x66\x4f\x65\x79']?_0x3c720c:_0x35f93c;if(_0x565484[_0x480942(0x10d,'\x39\x68\x54\x65')](_0x2a9de2[_0x480942(0x19a,'\x77\x6b\x59\x34')],_0x565484[_0x480942(0x1ad,'\x4b\x7a\x4b\x45')])||_0x565484[_0x480942(0x272,'\x66\x42\x2a\x32')](_0x2a9de2[_0x480942(0x1f0,'\x4e\x51\x6d\x75')],_0x565484[_0x480942(0x1e6,'\x6a\x29\x54\x74')]))return _0xb837c2;}}catch{}return _0x4d2890;}let _0x18b2b3=_0x469484;function _0x529460(_0x147c23){_0x18b2b3=_0x147c23||_0x469484;}const _0x5ca805=new Set(['\x45\x43\x4f\x4e\x4e\x52\x45\x53'+'\x45\x54',_0xbc6e87(0x11b,'\x64\x79\x5a\x5b'),_0xbc6e87(0x183,'\x4f\x73\x78\x75')+_0xbc6e87(0x22f,'\x58\x76\x24\x74'),_0xbc6e87(0x215,'\x4b\x7a\x4b\x45')+_0xbc6e87(0x241,'\x29\x79\x31\x6a'),_0xbc6e87(0x259,'\x6a\x29\x54\x74'),_0xbc6e87(0x223,'\x72\x4d\x4c\x71')+_0xbc6e87(0x1ab,'\x62\x5a\x51\x7a')]);function _0x1638ac(_0x56e500){const _0x3c0809=_0xbc6e87;if(!_0x56e500)return![];if(_0x5ca805[_0x3c0809(0x26d,'\x77\x6b\x59\x34')](_0x56e500[_0x3c0809(0x121,'\x64\x6c\x4e\x65')]))return!![];if(_0x56e500['\x63\x61\x75\x73\x65']&&_0x5ca805[_0x3c0809(0x202,'\x58\x76\x24\x74')](_0x56e500[_0x3c0809(0x271,'\x42\x24\x47\x32')][_0x3c0809(0x23c,'\x61\x5a\x59\x62')]))return!![];return![];}function _0x232931(_0xa5da51){const _0x495f5a=_0xbc6e87,_0x1149a2={};_0x1149a2[_0x495f5a(0x175,'\x5b\x65\x4b\x44')]=function(_0x3bdcac,_0x65a468){return _0x3bdcac===_0x65a468;},_0x1149a2[_0x495f5a(0xf5,'\x39\x68\x54\x65')]='\x66\x75\x6e\x63\x74\x69\x6f\x6e',_0x1149a2[_0x495f5a(0x1fc,'\x4e\x35\x31\x24')]=_0x495f5a(0xf1,'\x77\x6b\x59\x34'),_0x1149a2[_0x495f5a(0x245,'\x52\x52\x4c\x4f')]=function(_0x58fb3d,_0x369ef9){return _0x58fb3d+_0x369ef9;},_0x1149a2['\x54\x4b\x75\x79\x68']=_0x495f5a(0x21a,'\x28\x39\x46\x6c')+_0x495f5a(0x24a,'\x64\x6c\x4e\x65')+_0x495f5a(0x12d,'\x4d\x28\x7a\x2a')+_0x495f5a(0x20f,'\x43\x51\x77\x71')+_0x495f5a(0x1a9,'\x42\x24\x47\x32')+_0x495f5a(0x15c,'\x4b\x7a\x4b\x45')+_0x495f5a(0x1a1,'\x58\x76\x24\x74')+_0x495f5a(0x248,'\x58\x76\x24\x74')+_0x495f5a(0x266,'\x57\x4f\x65\x78'),_0x1149a2[_0x495f5a(0x1cf,'\x79\x5a\x36\x34')]=function(_0x29c461,_0x3349cd){return _0x29c461!==_0x3349cd;},_0x1149a2[_0x495f5a(0x101,'\x58\x76\x24\x74')]='\x68\x74\x74\x70\x73\x3a',_0x1149a2[_0x495f5a(0x278,'\x61\x37\x79\x49')]=function(_0x47d9e6,_0x39c52c){return _0x47d9e6===_0x39c52c;},_0x1149a2[_0x495f5a(0x1d8,'\x77\x73\x7a\x51')]=_0x495f5a(0x1f4,'\x55\x44\x45\x78'),_0x1149a2[_0x495f5a(0x1f6,'\x6a\x29\x54\x74')]=function(_0x3a7c99,_0x5bfb21){return _0x3a7c99+_0x5bfb21;},_0x1149a2[_0x495f5a(0x1ae,'\x77\x73\x7a\x51')]=_0x495f5a(0x1ac,'\x43\x53\x55\x59')+_0x495f5a(0x114,'\x29\x62\x4b\x47')+'\x52\x4c\x20\x6d\x75\x73\x74\x20'+_0x495f5a(0x1c5,'\x4f\x73\x78\x75')+_0x495f5a(0xf0,'\x78\x54\x33\x69')+'\x6f\x74\x20';const _0x58f971=_0x1149a2;let _0x48626f;try{_0x48626f=new URL(_0xa5da51);}catch{if(_0x58f971[_0x495f5a(0x26c,'\x61\x37\x79\x49')]===_0x58f971[_0x495f5a(0x1b7,'\x64\x38\x71\x44')])throw new Error(_0x58f971[_0x495f5a(0x236,'\x70\x70\x47\x29')](_0x58f971[_0x495f5a(0x1d4,'\x55\x44\x45\x78')](_0x58f971[_0x495f5a(0x18f,'\x4f\x73\x78\x75')](_0x495f5a(0x1ea,'\x5b\x65\x4b\x44')+_0x495f5a(0x172,'\x64\x38\x71\x44')+_0x495f5a(0x111,'\x29\x62\x4b\x47')+_0x495f5a(0x165,'\x64\x38\x71\x44')+_0x495f5a(0x257,'\x66\x25\x54\x61'),JSON[_0x495f5a(0x1ed,'\x72\x4d\x4c\x71')+'\x79'](_0xa5da51)),'\x2e\x20'),_0x58f971[_0x495f5a(0x25c,'\x52\x33\x28\x71')]));else{const _0x1a532a={};return _0x1a532a['\x63\x6f\x6e\x6e\x65\x63\x74']=_0x350977,_0x1a532a[_0x495f5a(0x1dd,'\x49\x53\x62\x5e')+'\x65\x54\x69\x6d\x65\x6f\x75\x74']=0x2710,_0x1a532a[_0x495f5a(0x10f,'\x77\x73\x7a\x51')+_0x495f5a(0x15d,'\x2a\x38\x53\x64')+_0x495f5a(0x20a,'\x29\x62\x4b\x47')]=0xea60,_0x1a532a[_0x495f5a(0x25f,'\x5e\x2a\x67\x4e')+_0x495f5a(0x1fd,'\x57\x4f\x65\x78')]=0x7530,_0x1a532a[_0x495f5a(0x1e9,'\x6a\x29\x54\x74')+_0x495f5a(0x1df,'\x64\x79\x5a\x5b')]=0x7530,_0x1a532a[_0x495f5a(0x1e2,'\x62\x5a\x51\x7a')+'\x6e\x67']=0x1,new _0x5b96ff(_0x1a532a);}}if(_0x58f971[_0x495f5a(0x207,'\x70\x70\x47\x29')](_0x48626f[_0x495f5a(0x21e,'\x61\x37\x79\x49')],_0x58f971[_0x495f5a(0x213,'\x39\x68\x54\x65')])){if(_0x58f971[_0x495f5a(0x243,'\x72\x51\x29\x72')](_0x58f971[_0x495f5a(0xf3,'\x79\x79\x51\x66')],'\x78\x6f\x67\x76\x41'))throw new Error(_0x58f971[_0x495f5a(0x1f6,'\x6a\x29\x54\x74')](_0x58f971[_0x495f5a(0x1d6,'\x79\x79\x51\x66')],JSON[_0x495f5a(0x1a4,'\x57\x4f\x65\x78')+'\x79'](_0xa5da51))+'\x2e\x20'+(_0x495f5a(0x182,'\x43\x53\x55\x59')+_0x495f5a(0x166,'\x2a\x38\x53\x64')+_0x495f5a(0x1db,'\x65\x4b\x44\x5a')+_0x495f5a(0x1c1,'\x61\x5a\x59\x62')+_0x495f5a(0x260,'\x4d\x28\x7a\x2a')+_0x495f5a(0x19e,'\x4e\x35\x31\x24')+_0x495f5a(0x262,'\x57\x67\x5d\x51')+_0x495f5a(0x130,'\x28\x39\x46\x6c')+_0x495f5a(0x220,'\x2a\x38\x53\x64')));else _0x300f9c&&VcYiHE[_0x495f5a(0x20d,'\x58\x76\x24\x74')](typeof _0x3305a7[_0x495f5a(0x22d,'\x4e\x51\x6d\x75')+_0x495f5a(0x244,'\x65\x4b\x44\x5a')],VcYiHE[_0x495f5a(0x19d,'\x66\x42\x2a\x32')])&&_0xb76071[_0x495f5a(0x24f,'\x6f\x66\x77\x75')+_0x495f5a(0x1bf,'\x6a\x29\x54\x74')](!![],-0x2*-0x2eff+-0x42ea+0xfc2*0x2);}}function _0x155ade(_0x3e02b6){const _0x4ab69e=_0xbc6e87,_0x11fbd9={'\x77\x71\x48\x46\x65':function(_0x4e26b0,_0x1fa738){return _0x4e26b0(_0x1fa738);}};if(process.env.EVOMAP_HUB_ALLOW_INSECURE==='\x31')return;_0x11fbd9[_0x4ab69e(0x10c,'\x72\x51\x29\x72')](_0x232931,_0x3e02b6);}async function _0x301209(_0x2f4876,_0x170813){const _0x1488e5=_0xbc6e87,_0x29ad0b={'\x49\x77\x56\x4c\x50':function(_0x50942a,_0x440fea){return _0x50942a===_0x440fea;},'\x61\x45\x71\x5a\x56':_0x1488e5(0x200,'\x4e\x35\x31\x24')+_0x1488e5(0x16e,'\x66\x42\x2a\x32')+_0x1488e5(0xf8,'\x4e\x51\x6d\x75'),'\x67\x4e\x54\x75\x75':function(_0x2db205,_0x41f5e5){return _0x2db205===_0x41f5e5;},'\x65\x42\x6a\x4e\x47':function(_0x20ec13,_0x52afe7){return _0x20ec13!==_0x52afe7;},'\x7a\x67\x42\x6a\x4e':function(_0x33feee,_0xab87de){return _0x33feee(_0xab87de);},'\x4b\x6a\x4b\x6c\x69':function(_0x406a67,_0x594bb7){return _0x406a67(_0x594bb7);},'\x69\x74\x61\x67\x6b':function(_0x3326c8,_0x3fd810,_0x5b0b2f){return _0x3326c8(_0x3fd810,_0x5b0b2f);},'\x57\x48\x74\x61\x57':_0x1488e5(0x1c8,'\x29\x79\x31\x6a')};if(_0x29ad0b[_0x1488e5(0x206,'\x55\x5a\x65\x59')](process.env.EVOMAP_HUB_ALLOW_INSECURE,'\x31')){const _0x4dbf0e=_0x29ad0b[_0x1488e5(0x1b8,'\x66\x42\x2a\x32')](_0x18b2b3,_0x469484)?_0x18b2b3:global[_0x1488e5(0x17a,'\x66\x42\x2a\x32')];return _0x4dbf0e(_0x2f4876,_0x170813);}_0x29ad0b[_0x1488e5(0x234,'\x64\x38\x71\x44')](_0x232931,_0x2f4876);const _0x432ec7=_0x29ad0b[_0x1488e5(0x148,'\x79\x5a\x36\x34')](_0x2ff266,_0x2f4876);try{const _0x135582={};return _0x135582[_0x1488e5(0x1de,'\x6f\x66\x77\x75')+'\x65\x72']=_0x432ec7,await _0x29ad0b[_0x1488e5(0x1d1,'\x2a\x4e\x4f\x64')](_0x18b2b3,_0x2f4876,Object[_0x1488e5(0x191,'\x66\x25\x54\x61')]({},_0x170813,_0x135582));}catch(_0x50df57){if(_0x29ad0b[_0x1488e5(0x12c,'\x5b\x65\x4b\x44')](_0x1638ac,_0x50df57)){if(_0x29ad0b[_0x1488e5(0x263,'\x72\x51\x29\x72')](_0x29ad0b[_0x1488e5(0x214,'\x57\x67\x5d\x51')],_0x1488e5(0x1ff,'\x29\x33\x40\x5d'))){const _0x4c0fd7=new _0xe2d021(_0x2dbf71);if(_0x4c0fd7[_0x1488e5(0x168,'\x65\x4b\x44\x5a')]===_0x199f0f)return _0x2020a4;if(AmuwUd[_0x1488e5(0x22b,'\x37\x40\x47\x33')](_0x4c0fd7[_0x1488e5(0x16a,'\x5b\x65\x4b\x44')],AmuwUd[_0x1488e5(0x279,'\x4e\x35\x31\x24')])||AmuwUd[_0x1488e5(0x13e,'\x52\x33\x28\x71')](_0x4c0fd7[_0x1488e5(0x1bb,'\x70\x70\x47\x29')],_0x1488e5(0x275,'\x61\x5a\x59\x62')+'\x6c\x62\x6f\x78\x2f\x6f\x75\x74'+_0x1488e5(0x1ba,'\x66\x42\x2a\x32')))return _0x5cb56b;}else try{_0x444a1f();}catch(_0x292179){}}throw _0x50df57;}}const _0x55014b={};function _0x56e8(_0x540582,_0x77db95){_0x540582=_0x540582-(-0x126*-0x5+0x1908+-0x1dd9);const _0x3041b8=_0x1d02();let _0x5affd4=_0x3041b8[_0x540582];if(_0x56e8['\x73\x67\x4f\x6a\x6a\x6c']===undefined){var _0x2f772d=function(_0x28ee81){const _0x4a4b63='\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2b\x2f\x3d';let _0x7233d3='',_0x340bcb='',_0x2ae666=_0x7233d3+_0x2f772d,_0x490d5c=(''+function(){return 0xab6*0x3+0x1507+-0x3529;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(0x1e3e+-0x53f+-0x18fe);for(let _0x48a28e=0x1*0x831+0x8b8*0x2+-0x3*0x88b,_0x186c0d,_0x202369,_0x115e52=-0x31*-0x37+0x1d*-0x31+-0x1*0x4fa;_0x202369=_0x28ee81['\x63\x68\x61\x72\x41\x74'](_0x115e52++);~_0x202369&&(_0x186c0d=_0x48a28e%(-0x1*-0x1468+-0x1*0xc7a+-0x7ea)?_0x186c0d*(0x28*0x19+-0x270*0x2+-0xd*-0x18)+_0x202369:_0x202369,_0x48a28e++%(0x3e3*-0x1+0x1c3e+-0x1f*0xc9))?_0x7233d3+=_0x490d5c||_0x2ae666['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x115e52+(-0x576+-0xf98+-0x32*-0x6c))-(0x1*-0x1faf+0x1b4+0x1e05)!==-0x66a+-0x1132+0x179c?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](-0x1ec6+0x11be+-0x85*-0x1b&_0x186c0d>>(-(-0x1b2e+0x8d4+0x125c)*_0x48a28e&-0x1*-0x7b9+0x6*0x425+0x4a7*-0x7)):_0x48a28e:0x36*-0x58+0xa45+-0xb*-0xc1){_0x202369=_0x4a4b63['\x69\x6e\x64\x65\x78\x4f\x66'](_0x202369);}for(let _0x511022=0x8*-0x478+-0xcf1*0x3+0x4a93,_0x15ae04=_0x7233d3['\x6c\x65\x6e\x67\x74\x68'];_0x511022<_0x15ae04;_0x511022++){_0x340bcb+='\x25'+('\x30\x30'+_0x7233d3['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x511022)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](0x2011+-0x20d4+0xd3))['\x73\x6c\x69\x63\x65'](-(-0xb*-0x73+-0x4*-0x31d+0x1*-0x1163));}return decodeURIComponent(_0x340bcb);};const _0x32abd7=function(_0x1fabf7,_0x54b7de){let _0x2b45eb=[],_0x5ebe85=0x8d3+-0x14de*-0x1+-0x1db1,_0x1a16c4,_0x5cdf72='';_0x1fabf7=_0x2f772d(_0x1fabf7);let _0x52fd24;for(_0x52fd24=-0x1f31+0x1*0x1113+0xe1e;_0x52fd24<-0x1*-0x1057+-0x1*0xc3e+-0x319;_0x52fd24++){_0x2b45eb[_0x52fd24]=_0x52fd24;}for(_0x52fd24=-0x1b75+-0x197+-0x16*-0x152;_0x52fd24<0x24e3+0x1cb*-0x5+-0x6bb*0x4;_0x52fd24++){_0x5ebe85=(_0x5ebe85+_0x2b45eb[_0x52fd24]+_0x54b7de['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x52fd24%_0x54b7de['\x6c\x65\x6e\x67\x74\x68']))%(0x3*-0xca2+-0x1f3f+0x4625),_0x1a16c4=_0x2b45eb[_0x52fd24],_0x2b45eb[_0x52fd24]=_0x2b45eb[_0x5ebe85],_0x2b45eb[_0x5ebe85]=_0x1a16c4;}_0x52fd24=0x7ee+0x1*0x161f+-0x1e0d,_0x5ebe85=0x4*-0x235+0x189e+-0xfca;for(let _0x2b79c2=-0x15f3+-0x12d4+0x28c7;_0x2b79c2<_0x1fabf7['\x6c\x65\x6e\x67\x74\x68'];_0x2b79c2++){_0x52fd24=(_0x52fd24+(-0x1af4*0x1+0x1*-0x26c5+0x41ba))%(-0x1b25*0x1+-0x17a5*-0x1+0x480),_0x5ebe85=(_0x5ebe85+_0x2b45eb[_0x52fd24])%(-0x844+0x195c+-0x5*0x338),_0x1a16c4=_0x2b45eb[_0x52fd24],_0x2b45eb[_0x52fd24]=_0x2b45eb[_0x5ebe85],_0x2b45eb[_0x5ebe85]=_0x1a16c4,_0x5cdf72+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x1fabf7['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x2b79c2)^_0x2b45eb[(_0x2b45eb[_0x52fd24]+_0x2b45eb[_0x5ebe85])%(-0x3ba+0xb67+0x1*-0x6ad)]);}return _0x5cdf72;};_0x56e8['\x6e\x62\x63\x50\x45\x6a']=_0x32abd7,_0x56e8['\x70\x51\x46\x43\x43\x4e']={},_0x56e8['\x73\x67\x4f\x6a\x6a\x6c']=!![];}const _0x143dc0=_0x3041b8[-0x604+-0x111d*0x1+0x1721],_0x5b4c80=_0x540582+_0x143dc0,_0x5c56fa=_0x56e8['\x70\x51\x46\x43\x43\x4e'][_0x5b4c80];if(!_0x5c56fa){if(_0x56e8['\x64\x5a\x4b\x69\x54\x64']===undefined){const _0x5e2e83=function(_0x2dcc92){this['\x50\x41\x66\x61\x48\x59']=_0x2dcc92,this['\x57\x56\x46\x7a\x4f\x58']=[0xc59+0x2*-0xbb9+0x7*0x196,0x1c9f+0x3ff*0x7+0x1c4c*-0x2,0x91b*0x1+0x1c51*-0x1+0x1*0x1336],this['\x4b\x78\x59\x48\x76\x49']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x78\x62\x6f\x53\x54\x4d']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x4e\x78\x4b\x44\x4c\x57']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x5e2e83['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x70\x41\x4a\x56\x56\x43']=function(){const _0x22a1e3=new RegExp(this['\x78\x62\x6f\x53\x54\x4d']+this['\x4e\x78\x4b\x44\x4c\x57']),_0x4b6971=_0x22a1e3['\x74\x65\x73\x74'](this['\x4b\x78\x59\x48\x76\x49']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x57\x56\x46\x7a\x4f\x58'][0x12fa+0x82*0x1e+-0x2235]:--this['\x57\x56\x46\x7a\x4f\x58'][0x852+0x238a+-0x2bdc];return this['\x4c\x45\x58\x52\x44\x55'](_0x4b6971);},_0x5e2e83['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x4c\x45\x58\x52\x44\x55']=function(_0x585f6e){if(!Boolean(~_0x585f6e))return _0x585f6e;return this['\x6a\x5a\x69\x66\x6a\x78'](this['\x50\x41\x66\x61\x48\x59']);},_0x5e2e83['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x6a\x5a\x69\x66\x6a\x78']=function(_0x3f27f2){for(let _0x6755ad=-0x61*0xf+0x304*-0x1+0x8b3,_0x17bf70=this['\x57\x56\x46\x7a\x4f\x58']['\x6c\x65\x6e\x67\x74\x68'];_0x6755ad<_0x17bf70;_0x6755ad++){this['\x57\x56\x46\x7a\x4f\x58']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x17bf70=this['\x57\x56\x46\x7a\x4f\x58']['\x6c\x65\x6e\x67\x74\x68'];}return _0x3f27f2(this['\x57\x56\x46\x7a\x4f\x58'][-0x204d+0xa55+-0x4*-0x57e]);},(''+function(){return-0x1e7e+0x5f2*-0x2+0x2a62;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(-0xaed+-0x3*0xaa2+0x2ad4)&&new _0x5e2e83(_0x56e8)['\x70\x41\x4a\x56\x56\x43'](),_0x56e8['\x64\x5a\x4b\x69\x54\x64']=!![];}_0x5affd4=_0x56e8['\x6e\x62\x63\x50\x45\x6a'](_0x5affd4,_0x77db95),_0x56e8['\x70\x51\x46\x43\x43\x4e'][_0x5b4c80]=_0x5affd4;}else _0x5affd4=_0x5c56fa;return _0x5affd4;}_0x55014b[_0xbc6e87(0x232,'\x4f\x73\x78\x75')]=_0x301209,_0x55014b[_0xbc6e87(0xf7,'\x4e\x35\x31\x24')+'\x6c']=_0x444a1f,_0x55014b['\x5f\x69\x73\x4e\x65\x74\x77\x6f'+_0xbc6e87(0x1b3,'\x55\x44\x45\x78')+_0xbc6e87(0x1b1,'\x4f\x73\x78\x75')+'\x72']=_0x1638ac,_0x55014b[_0xbc6e87(0x1d0,'\x77\x73\x7a\x51')+_0xbc6e87(0x116,'\x61\x37\x79\x49')]=_0x232931,_0x55014b[_0xbc6e87(0x1b2,'\x77\x6b\x59\x34')+_0xbc6e87(0x186,'\x4e\x35\x31\x24')]=_0x155ade,_0x55014b[_0xbc6e87(0x128,'\x77\x73\x7a\x51')+_0xbc6e87(0x160,'\x43\x53\x55\x59')]=_0x30c9,_0x55014b[_0xbc6e87(0x155,'\x64\x6c\x4e\x65')+_0xbc6e87(0x1da,'\x2a\x4e\x4f\x64')+'\x69\x67\x46\x6f\x72\x54\x65\x73'+'\x74']=_0x93a43b,_0x55014b['\x5f\x73\x65\x74\x46\x65\x74\x63'+'\x68\x49\x6d\x70\x6c\x46\x6f\x72'+_0xbc6e87(0x265,'\x77\x73\x7a\x51')]=_0x529460,module[_0xbc6e87(0x189,'\x64\x38\x71\x44')]=_0x55014b;
|
|
1
|
+
// hubFetch -- single chokepoint for every Hub-facing HTTP call.
|
|
2
|
+
//
|
|
3
|
+
// Two protections, both bypassable only via EVOMAP_HUB_ALLOW_INSECURE=1:
|
|
4
|
+
//
|
|
5
|
+
// 1. URL schema check. Rejects anything that does not parse as https://.
|
|
6
|
+
// This catches every misconfigured / attacker-supplied env var even
|
|
7
|
+
// when the caller bypassed resolveHubUrl() and read process.env
|
|
8
|
+
// directly (httpTransportSend / getHubUrl() / per-call opts.hubUrl /
|
|
9
|
+
// proxy this.hubUrl all reach here).
|
|
10
|
+
//
|
|
11
|
+
// 2. TLS verification. Built-in fetch validates certificates by default,
|
|
12
|
+
// but NODE_TLS_REJECT_UNAUTHORIZED=0 disables that globally. Passing
|
|
13
|
+
// an explicit undici.Agent with connect.rejectUnauthorized:true as
|
|
14
|
+
// the dispatcher makes Hub traffic immune to that env var.
|
|
15
|
+
//
|
|
16
|
+
// Escape hatch: EVOMAP_HUB_ALLOW_INSECURE=1 disables BOTH protections (used
|
|
17
|
+
// for local dev / mock hubs on http:// or with self-signed certs). Any
|
|
18
|
+
// value other than exactly "1" is treated as absent.
|
|
19
|
+
|
|
20
|
+
// Use BOTH Agent and fetch from the same undici package. Node's global
|
|
21
|
+
// fetch is built on an internal undici, and an Agent created from the
|
|
22
|
+
// installed `undici` package is not interface-compatible with it — mixing
|
|
23
|
+
// them yields `UND_ERR_INVALID_ARG: invalid onRequestStart method` at
|
|
24
|
+
// request time. Pulling fetch from the same package keeps them in sync.
|
|
25
|
+
const https = require('https');
|
|
26
|
+
const { TextDecoder } = require('util');
|
|
27
|
+
const { Agent, fetch: undiciFetch, buildConnector } = require('undici');
|
|
28
|
+
|
|
29
|
+
const HUB_ERROR_TEXT_MAX_BYTES = 8 * 1024;
|
|
30
|
+
const HUB_JSON_TEXT_MAX_BYTES = 4 * 1024 * 1024;
|
|
31
|
+
const HUB_UNREACHABLE_BACKOFF_BASE_MS = 60_000;
|
|
32
|
+
const HUB_UNREACHABLE_BACKOFF_MAX_MS = 10 * 60_000;
|
|
33
|
+
|
|
34
|
+
class HubUnreachableError extends Error {
|
|
35
|
+
constructor(message, details = {}) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.name = 'HubUnreachableError';
|
|
38
|
+
this.code = 'HUB_UNREACHABLE';
|
|
39
|
+
this.statusCode = details.statusCode || null;
|
|
40
|
+
this.contentType = details.contentType || '';
|
|
41
|
+
this.bodySnippet = details.bodySnippet || '';
|
|
42
|
+
this.context = details.context || '';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Cap idle keep-alive well below consumer-router NAT eviction (typically
|
|
47
|
+
// 60-300s). undici's default keepAliveTimeout is 600s, which means after an
|
|
48
|
+
// idle period the next request reuses a socket the NAT has already silently
|
|
49
|
+
// dropped and only fails after AbortSignal timeout — a major contributor to
|
|
50
|
+
// post-idle heartbeat death. headers/bodyTimeout are bounded so a wedged
|
|
51
|
+
// socket cannot stall the heartbeat indefinitely.
|
|
52
|
+
// Connect options shared between agents.
|
|
53
|
+
// - rejectUnauthorized: TLS verification, immune to NODE_TLS_REJECT_UNAUTHORIZED=0.
|
|
54
|
+
// - timeout: TCP+TLS handshake deadline.
|
|
55
|
+
// - Hub traffic defaults to IPv4-first: try an IPv4 socket first, then fall
|
|
56
|
+
// back to dual-stack Happy Eyeballs if IPv4 cannot connect. Real-world
|
|
57
|
+
// VPN/TUN setups often route IPv4 through the intended exit while leaving
|
|
58
|
+
// IPv6 on the local ISP path; Cloudflare country rules then see a CN IPv6
|
|
59
|
+
// and block otherwise valid Hub calls. Set EVOMAP_HUB_IP_FAMILY=auto to
|
|
60
|
+
// restore dual-stack Happy Eyeballs as the primary path, or ipv4-only to
|
|
61
|
+
// disable fallback for controlled networks.
|
|
62
|
+
function _resolveHubIpFamily() {
|
|
63
|
+
const raw = String(process.env.EVOMAP_HUB_IP_FAMILY || 'ipv4first').trim().toLowerCase();
|
|
64
|
+
if (raw === 'ipv4' || raw === 'v4' || raw === '4' || raw === 'ipv4first' || raw === 'ipv4-first') return 'ipv4first';
|
|
65
|
+
if (raw === 'ipv4only' || raw === 'ipv4-only') return 'ipv4only';
|
|
66
|
+
if (raw === 'auto' || raw === 'dualstack' || raw === 'dual-stack') return 'auto';
|
|
67
|
+
throw new Error('[hubFetch] EVOMAP_HUB_IP_FAMILY must be "ipv4", "ipv4-only", or "auto" — got ' + JSON.stringify(process.env.EVOMAP_HUB_IP_FAMILY));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const _hubIpFamily = _resolveHubIpFamily();
|
|
71
|
+
const _CONNECT_TIMEOUT_MS = 10_000;
|
|
72
|
+
const _IPV4FIRST_PRIMARY_CONNECT_TIMEOUT_MS = 2_500;
|
|
73
|
+
const _baseConnectOpts = {
|
|
74
|
+
rejectUnauthorized: true,
|
|
75
|
+
timeout: _CONNECT_TIMEOUT_MS,
|
|
76
|
+
};
|
|
77
|
+
const _ipv4OnlyConnectOpts = {
|
|
78
|
+
..._baseConnectOpts,
|
|
79
|
+
family: 4,
|
|
80
|
+
autoSelectFamily: false,
|
|
81
|
+
};
|
|
82
|
+
// In ipv4first mode the IPv4-only connector is a probe, not the whole
|
|
83
|
+
// heartbeat budget. Keep it short so fallback Happy Eyeballs still has
|
|
84
|
+
// time to connect before the 10s application-layer deadline fires.
|
|
85
|
+
const _ipv4FirstPrimaryConnectOpts = {
|
|
86
|
+
..._ipv4OnlyConnectOpts,
|
|
87
|
+
timeout: _IPV4FIRST_PRIMARY_CONNECT_TIMEOUT_MS,
|
|
88
|
+
};
|
|
89
|
+
const _autoConnectOpts = {
|
|
90
|
+
..._baseConnectOpts,
|
|
91
|
+
autoSelectFamily: true,
|
|
92
|
+
autoSelectFamilyAttemptTimeout: 250,
|
|
93
|
+
};
|
|
94
|
+
const _connectOpts = _hubIpFamily === 'auto'
|
|
95
|
+
? _autoConnectOpts
|
|
96
|
+
: (_hubIpFamily === 'ipv4only' ? _ipv4OnlyConnectOpts : _ipv4FirstPrimaryConnectOpts);
|
|
97
|
+
|
|
98
|
+
const _IPV4_FALLBACK_CODES = new Set([
|
|
99
|
+
'EADDRNOTAVAIL',
|
|
100
|
+
'EAI_AGAIN',
|
|
101
|
+
'ECONNREFUSED',
|
|
102
|
+
'ETIMEDOUT',
|
|
103
|
+
'ENETUNREACH',
|
|
104
|
+
'EHOSTUNREACH',
|
|
105
|
+
'ENOTFOUND',
|
|
106
|
+
'UND_ERR_CONNECT_TIMEOUT',
|
|
107
|
+
]);
|
|
108
|
+
|
|
109
|
+
function _shouldFallbackFromIpv4(err) {
|
|
110
|
+
if (_hubIpFamily !== 'ipv4first') return false;
|
|
111
|
+
const code = err && (err.code || (err.cause && err.cause.code));
|
|
112
|
+
return _IPV4_FALLBACK_CODES.has(code);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Round-8 (§21.6): wrap undici's built-in connector so we can enable
|
|
116
|
+
// OS-level TCP keepalive on the underlying socket. macOS default
|
|
117
|
+
// TCP_KEEPIDLE is 7200s -- way too long for our 10s heartbeat
|
|
118
|
+
// AbortSignal to ever benefit from kernel-level dead-socket detection.
|
|
119
|
+
// undici's keepAliveTimeout (10s above) trims sockets that have been
|
|
120
|
+
// idle in our pool, but a socket that is freshly idle (1-9s) and gets
|
|
121
|
+
// silently NAT-evicted during the macOS sleep window is reused on
|
|
122
|
+
// wake, the next request hangs until the AbortSignal trips, and the
|
|
123
|
+
// dispatcher pool fills with "destroying" sockets that pin capacity.
|
|
124
|
+
// With setKeepAlive(true, 15_000) the kernel fires TCP keepalive
|
|
125
|
+
// probes after 15s of socket idle, sees the silent drop within a few
|
|
126
|
+
// probe intervals, and surfaces ECONNRESET to the next read -- so
|
|
127
|
+
// reuse of a dead socket fails fast instead of hanging until app-
|
|
128
|
+
// layer timeout. rejectUnauthorized, connect.timeout, and the selected
|
|
129
|
+
// IP-family policy all still apply because we delegate to buildConnector(opts).
|
|
130
|
+
const _primaryConnect = buildConnector(_connectOpts);
|
|
131
|
+
const _fallbackConnect = _hubIpFamily === 'ipv4first' ? buildConnector(_autoConnectOpts) : null;
|
|
132
|
+
function _connectWithKeepAlive(opts, cb) {
|
|
133
|
+
function done(err, socket) {
|
|
134
|
+
if (err) return cb(err, socket);
|
|
135
|
+
try {
|
|
136
|
+
if (socket && typeof socket.setKeepAlive === 'function') {
|
|
137
|
+
socket.setKeepAlive(true, 15_000);
|
|
138
|
+
}
|
|
139
|
+
} catch (_) { /* never block connect on a setKeepAlive failure */ }
|
|
140
|
+
cb(null, socket);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return _primaryConnect(opts, function (err, socket) {
|
|
144
|
+
if (err && _fallbackConnect && _shouldFallbackFromIpv4(err)) {
|
|
145
|
+
return _fallbackConnect(opts, done);
|
|
146
|
+
}
|
|
147
|
+
return done(err, socket);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
// Marker so the #160 TLS-pinning contract (dispatcher.options.connect
|
|
151
|
+
// .rejectUnauthorized === true) remains introspectable now that
|
|
152
|
+
// `connect` is a function wrapping buildConnector(_connectOpts) instead
|
|
153
|
+
// of a plain options object. The actual TLS pinning is enforced by
|
|
154
|
+
// _connectOpts above; this property only mirrors that intent for tests
|
|
155
|
+
// and readers.
|
|
156
|
+
_connectWithKeepAlive.rejectUnauthorized = true;
|
|
157
|
+
|
|
158
|
+
function _makeStrictAgent() {
|
|
159
|
+
return new Agent({
|
|
160
|
+
connect: _connectWithKeepAlive,
|
|
161
|
+
keepAliveTimeout: 10_000,
|
|
162
|
+
keepAliveMaxTimeout: 60_000,
|
|
163
|
+
headersTimeout: 30_000,
|
|
164
|
+
bodyTimeout: 30_000,
|
|
165
|
+
pipelining: 1,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function _makeLongPollAgent() {
|
|
170
|
+
return new Agent({
|
|
171
|
+
connect: _connectWithKeepAlive,
|
|
172
|
+
keepAliveTimeout: 10_000,
|
|
173
|
+
keepAliveMaxTimeout: 60_000,
|
|
174
|
+
headersTimeout: 65_000,
|
|
175
|
+
bodyTimeout: 65_000,
|
|
176
|
+
pipelining: 1,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function _makeMailboxAgent() {
|
|
181
|
+
return new Agent({
|
|
182
|
+
connect: _connectWithKeepAlive,
|
|
183
|
+
keepAliveTimeout: 10_000,
|
|
184
|
+
keepAliveMaxTimeout: 60_000,
|
|
185
|
+
// Sits just above the highest mailbox AbortSignal (inbound=35s) so the
|
|
186
|
+
// app-layer signal is the authority on cancellation, while still
|
|
187
|
+
// bounding wedged-socket lifetime well below "forever".
|
|
188
|
+
headersTimeout: 45_000,
|
|
189
|
+
bodyTimeout: 45_000,
|
|
190
|
+
pipelining: 1,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function _getHubFetchConfigForTest() {
|
|
195
|
+
return {
|
|
196
|
+
hubIpFamily: _hubIpFamily,
|
|
197
|
+
connectTimeoutMs: _CONNECT_TIMEOUT_MS,
|
|
198
|
+
ipv4FirstPrimaryConnectTimeoutMs: _IPV4FIRST_PRIMARY_CONNECT_TIMEOUT_MS,
|
|
199
|
+
connectOpts: { ..._connectOpts },
|
|
200
|
+
primaryConnectOpts: { ..._connectOpts },
|
|
201
|
+
fallbackConnectOpts: _fallbackConnect ? { ..._autoConnectOpts } : null,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Default agent for short hub calls (heartbeat, hello, transport, publish).
|
|
206
|
+
// Header/body timeouts (30s) are bounded so a wedged socket cannot stall
|
|
207
|
+
// the heartbeat loop (HEARTBEAT_TIMEOUT_MS=10s leaves a 3x margin).
|
|
208
|
+
// keepAliveTimeout is well below consumer-router NAT eviction (typically
|
|
209
|
+
// 60-300s) so the next call after an idle period gets a fresh socket
|
|
210
|
+
// rather than reusing one the NAT has silently dropped.
|
|
211
|
+
// Backward-compatible Node native `https.Agent` export for callers that still
|
|
212
|
+
// build their own `https.request(...)` transport. New Hub clients should route
|
|
213
|
+
// through hubFetch so TLS and IP-family policy stay centralized.
|
|
214
|
+
const _strictHttpsAgent = new https.Agent({ rejectUnauthorized: true });
|
|
215
|
+
|
|
216
|
+
// Long-poll agent for /a2a/events/poll. The application-layer
|
|
217
|
+
// AbortSignal.timeout for that path is 60s (EVENT_POLL_TIMEOUT_MS), but
|
|
218
|
+
// _strictAgent's headersTimeout=30s would otherwise fire first and abort
|
|
219
|
+
// every long poll at 30s -- the hub gets no chance to deliver an event
|
|
220
|
+
// that arrives in the 30-55s window. Headers/body timeouts here sit just
|
|
221
|
+
// above the app-layer 60s ceiling so the AbortSignal is the visible
|
|
222
|
+
// timeout signal.
|
|
223
|
+
// Mailbox agent for /a2a/mailbox/inbound (35s AbortSignal) and
|
|
224
|
+
// /a2a/mailbox/outbound (30s AbortSignal). _strictAgent's 30s
|
|
225
|
+
// headers/bodyTimeout would fire AT OR BEFORE those app signals,
|
|
226
|
+
// silently capping inbound at 30s (regression vs main where _strictAgent
|
|
227
|
+
// had undici defaults ~300s) and racing with outbound's identical 30s
|
|
228
|
+
// signal. The 45s ceiling here keeps the app-layer AbortSignal as the
|
|
229
|
+
// authority while still bounding a wedged socket.
|
|
230
|
+
let _strictAgent = _makeStrictAgent();
|
|
231
|
+
let _longPollAgent = _makeLongPollAgent();
|
|
232
|
+
let _mailboxAgent = _makeMailboxAgent();
|
|
233
|
+
|
|
234
|
+
// Drain and rebuild both undici agents. Called from the index.js SIGCONT
|
|
235
|
+
// handler on macOS resume: undici's keepAliveTimeout is measured from
|
|
236
|
+
// "socket goes idle" on libuv's monotonic clock, which freezes through
|
|
237
|
+
// sleep. The next post-wake request can therefore reuse a socket the
|
|
238
|
+
// NAT silently dropped during the suspend window and only fail after the
|
|
239
|
+
// 30s headersTimeout -- well above HEARTBEAT_TIMEOUT_MS (10s). The
|
|
240
|
+
// AbortSignal trips first but the socket may linger in the pool's
|
|
241
|
+
// "destroying" state, pinning capacity. Closing both agents forces all
|
|
242
|
+
// idle sockets shut and frees the per-host autoSelectFamily cache so a
|
|
243
|
+
// stale "v6 wins" decision from before sleep does not stick when v6 is
|
|
244
|
+
// now black-holed. In-flight requests still finish on their existing
|
|
245
|
+
// socket (close() does not abort them). Cheap to call -- safe to invoke
|
|
246
|
+
// even if nothing changed.
|
|
247
|
+
function drainPool() {
|
|
248
|
+
const old = [_strictAgent, _longPollAgent, _mailboxAgent];
|
|
249
|
+
_strictAgent = _makeStrictAgent();
|
|
250
|
+
_longPollAgent = _makeLongPollAgent();
|
|
251
|
+
_mailboxAgent = _makeMailboxAgent();
|
|
252
|
+
for (const agent of old) {
|
|
253
|
+
try {
|
|
254
|
+
// Agent.close() returns a Promise that resolves when all in-flight
|
|
255
|
+
// requests finish. We do not await it -- the new agents already
|
|
256
|
+
// serve fresh calls, and the old ones drain naturally.
|
|
257
|
+
const p = agent.close();
|
|
258
|
+
if (p && typeof p.catch === 'function') p.catch(() => {});
|
|
259
|
+
} catch (_) {}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function _pickDispatcher(url) {
|
|
264
|
+
// Three dispatcher pools, picked by exact path match:
|
|
265
|
+
// - /a2a/events/poll -> _longPollAgent (65s timeouts)
|
|
266
|
+
// - /a2a/mailbox/{inbound,outbound} -> _mailboxAgent (45s timeouts)
|
|
267
|
+
// - everything else -> _strictAgent (30s timeouts)
|
|
268
|
+
//
|
|
269
|
+
// The split exists because each path has a different app-layer
|
|
270
|
+
// AbortSignal ceiling: event poll = 60s, mailbox inbound = 35s, mailbox
|
|
271
|
+
// outbound = 30s (racy against strict's 30s), heartbeat / hello /
|
|
272
|
+
// transport = <= 10s. The strict agent's 30s headers/bodyTimeout
|
|
273
|
+
// would otherwise fire BEFORE the longer app signals, silently
|
|
274
|
+
// capping those paths and making AbortSignal cosmetic. Mailbox /
|
|
275
|
+
// long-poll dispatchers keep the app-layer signal as the visible
|
|
276
|
+
// timeout while still bounding wedged-socket lifetime.
|
|
277
|
+
//
|
|
278
|
+
// Match on path (not host) to avoid coupling to a specific hub URL.
|
|
279
|
+
//
|
|
280
|
+
// Round-6 (§19.8): previously the matcher accepted both
|
|
281
|
+
// `pathname === '/a2a/events/poll'` AND `pathname.endsWith('/a2a/events/poll')`.
|
|
282
|
+
// The endsWith branch was a needless widening that also caught
|
|
283
|
+
// unrelated paths such as `/admin/a2a/events/poll`, `/v2/a2a/events/poll`,
|
|
284
|
+
// or any future hub path that happens to end with the same suffix --
|
|
285
|
+
// those would silently inherit the 65s long-poll timeout when they
|
|
286
|
+
// should fail fast on the 30s strict timeout. Use exact match only.
|
|
287
|
+
// For hub deployments mounted under a base path (rare; not in the
|
|
288
|
+
// current hub repo), set EVOLVER_LONG_POLL_PATH to override.
|
|
289
|
+
const longPollPath = process.env.EVOLVER_LONG_POLL_PATH || '/a2a/events/poll';
|
|
290
|
+
try {
|
|
291
|
+
const u = new URL(url);
|
|
292
|
+
if (u.pathname === longPollPath) {
|
|
293
|
+
return _longPollAgent;
|
|
294
|
+
}
|
|
295
|
+
if (u.pathname === '/a2a/mailbox/inbound' || u.pathname === '/a2a/mailbox/outbound') {
|
|
296
|
+
return _mailboxAgent;
|
|
297
|
+
}
|
|
298
|
+
} catch {
|
|
299
|
+
// fall through to strict
|
|
300
|
+
}
|
|
301
|
+
return _strictAgent;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Test seam: lets unit tests swap in a mock fetch without forking the call
|
|
305
|
+
// path. Production code must NEVER reassign this from outside the module.
|
|
306
|
+
let _fetchImpl = undiciFetch;
|
|
307
|
+
function _setFetchImplForTest(fn) { _fetchImpl = fn || undiciFetch; }
|
|
308
|
+
|
|
309
|
+
// Error codes that indicate a network-layer disruption rather than an
|
|
310
|
+
// application-layer error. On Linux, a NetworkManager reconnect, VPN
|
|
311
|
+
// re-establishment, or WiFi hand-off invalidates the 5-tuples of all
|
|
312
|
+
// existing TCP connections in the undici pool. The kernel surfaces the
|
|
313
|
+
// break as one of these codes on the next read/write; undici wraps them
|
|
314
|
+
// in Error objects but preserves the original .code property.
|
|
315
|
+
//
|
|
316
|
+
// When we see one of these we call drainPool() so the *next* request
|
|
317
|
+
// gets a freshly connected socket instead of reusing a dead one, then
|
|
318
|
+
// re-throw so the caller's existing error path still fires normally.
|
|
319
|
+
// ECONNRESET -- TCP RST received (NM reconnect, VPN teardown)
|
|
320
|
+
// ENETDOWN -- network interface went offline
|
|
321
|
+
// ENETUNREACH -- no route to host (transient during re-IP)
|
|
322
|
+
// EHOSTUNREACH-- host unreachable (routing table flush)
|
|
323
|
+
// ENOTCONN -- socket not connected (rare but seen on interface bounce)
|
|
324
|
+
// UND_ERR_SOCKET -- undici's own wrapper for abrupt socket closure
|
|
325
|
+
const _NETWORK_DISRUPTION_CODES = new Set([
|
|
326
|
+
'ECONNRESET',
|
|
327
|
+
'ECONNREFUSED',
|
|
328
|
+
'ENETDOWN',
|
|
329
|
+
'ENETUNREACH',
|
|
330
|
+
'EHOSTUNREACH',
|
|
331
|
+
'EAI_AGAIN',
|
|
332
|
+
'ENOTFOUND',
|
|
333
|
+
'ENOTCONN',
|
|
334
|
+
'ETIMEDOUT',
|
|
335
|
+
'ABORT_ERR',
|
|
336
|
+
'UND_ERR_SOCKET',
|
|
337
|
+
'UND_ERR_CONNECT_TIMEOUT',
|
|
338
|
+
'UND_ERR_HEADERS_TIMEOUT',
|
|
339
|
+
'UND_ERR_BODY_TIMEOUT',
|
|
340
|
+
]);
|
|
341
|
+
|
|
342
|
+
function _isNetworkDisruptionError(err) {
|
|
343
|
+
if (!err) return false;
|
|
344
|
+
// undici may carry the original code either on err.code or on err.cause.code
|
|
345
|
+
if (_NETWORK_DISRUPTION_CODES.has(err.code)) return true;
|
|
346
|
+
if (err.cause && _NETWORK_DISRUPTION_CODES.has(err.cause.code)) return true;
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function isHubUnreachableError(err) {
|
|
351
|
+
if (!err) return false;
|
|
352
|
+
if (err instanceof HubUnreachableError || err.code === 'HUB_UNREACHABLE') return true;
|
|
353
|
+
if (_isNetworkDisruptionError(err)) return true;
|
|
354
|
+
if (err.name === 'AbortError' || err.name === 'TimeoutError') return true;
|
|
355
|
+
if (err.cause && (err.cause.name === 'AbortError' || err.cause.name === 'TimeoutError')) return true;
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function hubUnreachableBackoffMs(failureCount) {
|
|
360
|
+
const n = Math.max(1, Number(failureCount) || 1);
|
|
361
|
+
return Math.min(
|
|
362
|
+
HUB_UNREACHABLE_BACKOFF_BASE_MS * Math.pow(2, n - 1),
|
|
363
|
+
HUB_UNREACHABLE_BACKOFF_MAX_MS
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
function hubResponseContentType(res) {
|
|
368
|
+
const headers = res && res.headers;
|
|
369
|
+
if (!headers) return '';
|
|
370
|
+
let value = '';
|
|
371
|
+
try {
|
|
372
|
+
if (typeof headers.get === 'function') {
|
|
373
|
+
value = headers.get('content-type') || headers.get('Content-Type') || '';
|
|
374
|
+
} else if (typeof headers === 'object') {
|
|
375
|
+
value = headers['content-type'] || headers['Content-Type'] || '';
|
|
376
|
+
}
|
|
377
|
+
} catch (_) {
|
|
378
|
+
value = '';
|
|
379
|
+
}
|
|
380
|
+
return String(value || '').toLowerCase();
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
function isHubApiResponse(res) {
|
|
384
|
+
const contentType = hubResponseContentType(res);
|
|
385
|
+
if (!contentType) return true;
|
|
386
|
+
return contentType.includes('json');
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function isHubUnreachableResponse(res) {
|
|
390
|
+
if (!res) return false;
|
|
391
|
+
const status = Number(res.status || 0);
|
|
392
|
+
const contentType = hubResponseContentType(res);
|
|
393
|
+
if (!contentType) return false;
|
|
394
|
+
if (isHubApiResponse(res)) return false;
|
|
395
|
+
if (status >= 200 && status < 300) return true;
|
|
396
|
+
return status === 401 || status === 403 || status === 408 || status === 429 || status >= 500;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
async function drainHubResponse(res) {
|
|
400
|
+
try {
|
|
401
|
+
if (res && res.body && typeof res.body.cancel === 'function') {
|
|
402
|
+
await res.body.cancel().catch(() => {});
|
|
403
|
+
}
|
|
404
|
+
} catch (_) {
|
|
405
|
+
// Best-effort cleanup only; never turn body cleanup into a caller error.
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
function _truncateUtf8(text, maxBytes) {
|
|
410
|
+
const buf = Buffer.from(String(text || ''), 'utf8');
|
|
411
|
+
if (buf.length <= maxBytes) return String(text || '');
|
|
412
|
+
return buf.subarray(0, maxBytes).toString('utf8') + '\n...[truncated]';
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
async function readHubResponseText(res, options = {}) {
|
|
416
|
+
if (!res) return '';
|
|
417
|
+
const maxBytes = Math.max(0, Number(options.maxBytes) || HUB_ERROR_TEXT_MAX_BYTES);
|
|
418
|
+
|
|
419
|
+
if (res.body && typeof res.body.getReader === 'function') {
|
|
420
|
+
const reader = res.body.getReader();
|
|
421
|
+
const decoder = new TextDecoder();
|
|
422
|
+
const chunks = [];
|
|
423
|
+
let total = 0;
|
|
424
|
+
let truncated = false;
|
|
425
|
+
try {
|
|
426
|
+
while (true) {
|
|
427
|
+
const part = await reader.read();
|
|
428
|
+
if (part.done) break;
|
|
429
|
+
const value = part.value instanceof Uint8Array
|
|
430
|
+
? part.value
|
|
431
|
+
: Buffer.from(part.value || '');
|
|
432
|
+
const remaining = maxBytes - total;
|
|
433
|
+
if (remaining > 0) {
|
|
434
|
+
const slice = value.subarray(0, remaining);
|
|
435
|
+
chunks.push(slice);
|
|
436
|
+
total += slice.byteLength;
|
|
437
|
+
}
|
|
438
|
+
// Only truncate when a chunk genuinely OVERFLOWS the remaining
|
|
439
|
+
// capacity. A chunk that fills the buffer exactly (byteLength ===
|
|
440
|
+
// remaining, total === maxBytes) must NOT be flagged truncated: the
|
|
441
|
+
// stream may end cleanly on the next read. Flagging it appended
|
|
442
|
+
// `...[truncated]` to a complete body, which broke JSON.parse for a
|
|
443
|
+
// response sitting exactly on the 4MB cap. When remaining hits 0, any
|
|
444
|
+
// subsequent non-empty chunk (byteLength > 0 > remaining 0) trips this.
|
|
445
|
+
if (value.byteLength > remaining) {
|
|
446
|
+
truncated = true;
|
|
447
|
+
try { await reader.cancel(); } catch (_) {}
|
|
448
|
+
break;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
} catch (err) {
|
|
452
|
+
try { await reader.cancel(); } catch (_) {}
|
|
453
|
+
throw err;
|
|
454
|
+
} finally {
|
|
455
|
+
try { reader.releaseLock(); } catch (_) {}
|
|
456
|
+
}
|
|
457
|
+
const text = decoder.decode(Buffer.concat(chunks, total));
|
|
458
|
+
return truncated ? text + '\n...[truncated]' : text;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
if (typeof res.text === 'function') {
|
|
462
|
+
try {
|
|
463
|
+
return _truncateUtf8(await res.text(), maxBytes);
|
|
464
|
+
} catch (err) {
|
|
465
|
+
await drainHubResponse(res);
|
|
466
|
+
throw err;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
await drainHubResponse(res);
|
|
471
|
+
return '';
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
async function readHubResponseJson(res, options = {}) {
|
|
475
|
+
const text = await readHubResponseText(res, {
|
|
476
|
+
maxBytes: options.maxBytes || HUB_JSON_TEXT_MAX_BYTES,
|
|
477
|
+
});
|
|
478
|
+
return JSON.parse(text);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
async function throwIfHubUnreachableResponse(res, context = 'hub') {
|
|
482
|
+
if (!isHubUnreachableResponse(res)) return;
|
|
483
|
+
const contentType = hubResponseContentType(res);
|
|
484
|
+
let bodyText = '';
|
|
485
|
+
try {
|
|
486
|
+
bodyText = await readHubResponseText(res, { maxBytes: HUB_ERROR_TEXT_MAX_BYTES });
|
|
487
|
+
} catch (err) {
|
|
488
|
+
bodyText = `[body read failed: ${err && err.message || err}]`;
|
|
489
|
+
}
|
|
490
|
+
const bodySnippet = _truncateUtf8(String(bodyText || '').replace(/\s+/g, ' ').trim(), 512);
|
|
491
|
+
const statusCode = Number(res.status || 0) || null;
|
|
492
|
+
const label = contentType || 'unknown content-type';
|
|
493
|
+
throw new HubUnreachableError(
|
|
494
|
+
`${context} returned a non-API Hub response (${statusCode || 'unknown status'}, ${label})`,
|
|
495
|
+
{ statusCode, contentType, bodySnippet, context }
|
|
496
|
+
);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function _validateHubUrl(url) {
|
|
500
|
+
let parsed;
|
|
501
|
+
try {
|
|
502
|
+
parsed = new URL(url);
|
|
503
|
+
} catch {
|
|
504
|
+
throw new Error(
|
|
505
|
+
'[hubFetch] Hub URL is not a valid URL: ' + JSON.stringify(url) + '. ' +
|
|
506
|
+
'Set EVOMAP_HUB_ALLOW_INSECURE=1 to bypass (local dev / mock hub only).'
|
|
507
|
+
);
|
|
508
|
+
}
|
|
509
|
+
if (parsed.protocol !== 'https:') {
|
|
510
|
+
throw new Error(
|
|
511
|
+
'[hubFetch] Hub URL must use https:// — got ' + JSON.stringify(url) + '. ' +
|
|
512
|
+
'Set EVOMAP_HUB_ALLOW_INSECURE=1 to bypass (local dev / mock hub only).'
|
|
513
|
+
);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// Public scheme-only guard for callers that already manage their own HTTP
|
|
518
|
+
// transport (Node's `http`/`https` modules, the platform `fetch`, etc.) and
|
|
519
|
+
// just want to honour the same "https-only unless EVOMAP_HUB_ALLOW_INSECURE=1"
|
|
520
|
+
// posture hubFetch enforces. Throws synchronously on bad input — match
|
|
521
|
+
// _validateHubUrl's throw semantics so call sites can wrap in try/catch.
|
|
522
|
+
//
|
|
523
|
+
// Use this instead of bare URL/fetch when you cannot route through hubFetch
|
|
524
|
+
// (e.g. the existing src/atp/atpExecute.js and src/atp/hubClient.js paths
|
|
525
|
+
// that use http.request / native fetch directly).
|
|
526
|
+
function enforceHubScheme(url) {
|
|
527
|
+
if (process.env.EVOMAP_HUB_ALLOW_INSECURE === '1') return;
|
|
528
|
+
_validateHubUrl(url);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// async so synchronous validation throws become Promise rejections — every
|
|
532
|
+
// caller already awaits / .then()s the result, and this makes the function
|
|
533
|
+
// behave uniformly for `assert.rejects(...)` in tests.
|
|
534
|
+
async function hubFetch(url, options) {
|
|
535
|
+
if (process.env.EVOMAP_HUB_ALLOW_INSECURE === '1') {
|
|
536
|
+
// Insecure mode is documented as "local dev / mock hub on http:// or
|
|
537
|
+
// self-signed cert". In that mode use the platform fetch — Node's
|
|
538
|
+
// built-in global.fetch is identical engine to undici, but keeping it
|
|
539
|
+
// as the platform lookup lets tests that stub `global.fetch = mockImpl`
|
|
540
|
+
// intercept the call without forking through _setFetchImplForTest. If
|
|
541
|
+
// a test has explicitly installed the seam, honor that — the explicit
|
|
542
|
+
// override wins over the implicit global lookup.
|
|
543
|
+
const insecureFetch = (_fetchImpl !== undiciFetch) ? _fetchImpl : global.fetch;
|
|
544
|
+
return insecureFetch(url, options);
|
|
545
|
+
}
|
|
546
|
+
_validateHubUrl(url);
|
|
547
|
+
// Object.assign last-wins is intentional: a caller-supplied dispatcher
|
|
548
|
+
// would defeat the TLS guard, so we always force ours. No current caller
|
|
549
|
+
// passes one; revisit if that changes.
|
|
550
|
+
const dispatcher = _pickDispatcher(url);
|
|
551
|
+
try {
|
|
552
|
+
return await _fetchImpl(url, Object.assign({}, options, { dispatcher }));
|
|
553
|
+
} catch (err) {
|
|
554
|
+
// On Linux a NetworkManager reconnect, VPN re-establishment, or WiFi
|
|
555
|
+
// hand-off silently invalidates all existing TCP sockets in the undici
|
|
556
|
+
// pool. The kernel surfaces the break as a network-disruption error
|
|
557
|
+
// code on the next read/write. Without drainPool() the next request
|
|
558
|
+
// reuses another dead socket from the same pool and suffers the same
|
|
559
|
+
// error again. Draining here lets the *next* call open a fresh
|
|
560
|
+
// connection immediately without waiting for the heartbeat's normal
|
|
561
|
+
// interval or the drift-detector's 2*interval poke window.
|
|
562
|
+
//
|
|
563
|
+
// We call drainPool() synchronously before re-throwing so the caller's
|
|
564
|
+
// existing error path (heartbeat .catch, poll .catch, etc.) fires as
|
|
565
|
+
// normal -- this is purely a pool-hygiene side-effect, not a retry.
|
|
566
|
+
if (isHubUnreachableError(err)) {
|
|
567
|
+
try {
|
|
568
|
+
drainPool();
|
|
569
|
+
} catch (_) { /* never block the throw on a pool-drain failure */ }
|
|
570
|
+
}
|
|
571
|
+
throw err;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
module.exports = {
|
|
576
|
+
hubFetch,
|
|
577
|
+
drainPool,
|
|
578
|
+
HubUnreachableError,
|
|
579
|
+
drainHubResponse,
|
|
580
|
+
hubResponseContentType,
|
|
581
|
+
hubUnreachableBackoffMs,
|
|
582
|
+
isHubApiResponse,
|
|
583
|
+
isHubUnreachableError,
|
|
584
|
+
isHubUnreachableResponse,
|
|
585
|
+
readHubResponseJson,
|
|
586
|
+
readHubResponseText,
|
|
587
|
+
throwIfHubUnreachableResponse,
|
|
588
|
+
_isNetworkDisruptionError,
|
|
589
|
+
_validateHubUrl,
|
|
590
|
+
enforceHubScheme,
|
|
591
|
+
// For callers that must build their own HTTP transport. The Node
|
|
592
|
+
// native case (`https.request(...)`) needs an Agent pinned to
|
|
593
|
+
// rejectUnauthorized:true so a global `NODE_TLS_REJECT_UNAUTHORIZED=0`
|
|
594
|
+
// cannot weaken the Hub channel; pass `strictHttpsAgent` as
|
|
595
|
+
// `options.agent`. Skip when `EVOMAP_HUB_ALLOW_INSECURE=1`, matching
|
|
596
|
+
// hubFetch's own escape-hatch behaviour.
|
|
597
|
+
//
|
|
598
|
+
// For fetch-based callers do NOT pair a hand-rolled Agent with
|
|
599
|
+
// `global.fetch`: `global.fetch` is backed by Node's *internal*
|
|
600
|
+
// undici, and an Agent from the installed `undici` package crashes
|
|
601
|
+
// it with `UND_ERR_INVALID_ARG: invalid onRequestStart method`
|
|
602
|
+
// (see the warning at the top of this file). Route through
|
|
603
|
+
// `hubFetch()` itself instead — it already applies the dispatcher
|
|
604
|
+
// from the right undici copy.
|
|
605
|
+
strictHttpsAgent: _strictHttpsAgent,
|
|
606
|
+
_getHubFetchConfigForTest,
|
|
607
|
+
_setFetchImplForTest,
|
|
608
|
+
};
|