@jterrazz/intelligence 4.2.0 → 6.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","names":[],"sources":["../src/formatting/clean-ai-text.ts","../src/formatting/preserved-terms.generated.ts","../src/formatting/to-sentence-case.ts"],"sourcesContent":["const INVISIBLE_CHARS_RE =\n /[\\u00AD\\u180E\\u200B-\\u200C\\u200E-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u2069\\uFEFF]/g;\n\n// oxlint-disable-next-line no-control-regex -- Intentionally matching control characters for sanitization\nconst ASCII_CTRL_RE = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F]/g;\n\nconst SPACE_LIKE_RE = /[\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/g;\nconst MULTIPLE_SPACES_RE = / {2,}/g;\nconst CR_RE = /\\r\\n?/g;\nconst CITATION_RE = / *\\(oaicite:\\d+\\)\\{index=\\d+\\}/g;\nconst EM_DASH_SEPARATOR_RE = /\\s*[—–―‒]\\s*/g;\n\nconst TYPOGRAPHY_REPLACEMENTS: Array<{ pattern: RegExp; replacement: string }> = [\n { pattern: /[\\u2018\\u2019\\u201A]/g, replacement: \"'\" },\n { pattern: /[\\u201C\\u201D\\u201E]/g, replacement: '\"' },\n { pattern: /\\u2026/g, replacement: '...' },\n { pattern: /[\\u2022\\u25AA-\\u25AB\\u25B8-\\u25B9\\u25CF]/g, replacement: '-' },\n];\n\nexport interface CleanAiTextOptions {\n /** Collapse multiple spaces into one (default: true) */\n collapseSpaces?: boolean;\n /** Convert em/en dashes with spaces to commas (default: true) */\n normalizeEmDashesToCommas?: boolean;\n}\n\n/**\n * Cleans AI-generated text by removing AI artifacts and normalizing typography.\n *\n * @param text - The text to clean\n * @param options - Cleaning options\n * @returns The cleaned text\n */\nexport function cleanAiText(text: string, options: CleanAiTextOptions = {}): string {\n const { normalizeEmDashesToCommas = true, collapseSpaces = true } = options;\n\n if (!text) {\n return '';\n }\n\n let result = text;\n\n result = result.replace(CR_RE, '\\n');\n result = result.replace(CITATION_RE, '');\n result = result.normalize('NFKC');\n result = result.replace(INVISIBLE_CHARS_RE, '');\n result = result.replace(ASCII_CTRL_RE, '');\n\n if (normalizeEmDashesToCommas) {\n result = result.replace(EM_DASH_SEPARATOR_RE, ', ');\n }\n\n result = result.replace(SPACE_LIKE_RE, ' ');\n\n for (const { pattern, replacement } of TYPOGRAPHY_REPLACEMENTS) {\n result = result.replace(pattern, replacement);\n }\n\n if (collapseSpaces) {\n result = result.replace(MULTIPLE_SPACES_RE, ' ').trim();\n }\n\n return result;\n}\n","/**\n * GENERATED FILE — do not edit, run `npm run generate:terms`.\n *\n * Source: @cspell/dict-companies + @cspell/dict-software-terms, filtered\n * through the `dictionary-en` ambiguity check (see\n * scripts/generate-preserved-terms.ts for the full pipeline).\n *\n * Candidates before ambiguity filter: 3053\n * Excluded as ambiguous (lowercase form is a common English word): 516\n * Kept: 2512\n *\n * Examples of ambiguity exclusions:\n * ADMIN -> \"admin\" (computing-acronyms.txt)\n * DB -> \"db\" (computing-acronyms.txt)\n * DRAM -> \"dram\" (computing-acronyms.txt)\n * RAM -> \"ram\" (computing-acronyms.txt)\n * REF -> \"ref\" (computing-acronyms.txt)\n * UHF -> \"uhf\" (computing-acronyms.txt)\n * WAN -> \"wan\" (computing-acronyms.txt)\n * ZIP -> \"zip\" (computing-acronyms.txt)\n * A -> \"a\" (companies.txt)\n * AD -> \"ad\" (companies.txt)\n * AT -> \"at\" (companies.txt)\n * Adobe -> \"adobe\" (companies.txt)\n */\n\nexport const GENERATED_PRESERVED_TERMS: readonly string[] = [\n '2GIS',\n '3M',\n 'AAA',\n 'AAAI',\n 'Aachen',\n 'Aalto',\n 'AAPL',\n 'Aarhus',\n 'ABB',\n 'Abbott',\n 'ABBV',\n 'AbbVie',\n 'ABBYY',\n 'Abdulaziz',\n 'Abdullah',\n 'Aberdeen',\n 'ABIOMED',\n 'Abios',\n 'AbiosGaming',\n 'ABMD',\n 'ABNF',\n 'Accenture',\n 'ACFS',\n 'Ackermann',\n 'ACM',\n 'ACS',\n 'Activision',\n 'ADBE',\n 'Adblock',\n 'Adecco',\n 'Adelaide',\n 'AdGuard',\n 'ADI',\n 'Adidas',\n 'ADOT',\n 'ADSK',\n 'Adsterra',\n 'Advanced',\n 'AECOM',\n 'Aegon',\n 'AEON',\n 'AES',\n 'AES128',\n 'Aetna',\n 'Aeva',\n 'Affero',\n 'AFLAC',\n 'Agari',\n 'AGCO',\n 'agentLess',\n 'Agilent',\n 'Agricole',\n 'Ahold',\n 'AICPA',\n 'Airbnb',\n 'Aires',\n 'Airgas',\n 'Airlines',\n 'Airways',\n 'Aisin',\n 'AK',\n 'AKAM',\n 'Akamai',\n 'Alaska',\n 'Albemarle',\n 'Alberta',\n 'Alcoa',\n 'Aldi',\n 'Alexandria',\n 'Alfresa',\n 'ALGN',\n 'Alipay',\n 'AlixPartners',\n 'ALLE',\n 'Alleghany',\n 'Allegion',\n 'Allen',\n 'Allergan',\n 'Alliant',\n 'Allianz',\n 'Allstate',\n 'Alstom',\n 'Altri',\n 'Altria',\n 'AMAT',\n 'Ambientia',\n 'Amcor',\n 'AMCR',\n 'Ameren',\n 'America',\n 'American',\n 'Ameriprise',\n 'AmerisourceBergen',\n 'AMETEK',\n 'Amgen',\n 'AMGN',\n 'Amherst',\n 'Amphenol',\n 'AMR',\n 'Amsterdam',\n 'Amtrack',\n 'AMZN',\n 'Anadarko',\n 'Analytics',\n 'Andersons',\n 'Andes',\n 'Andrews',\n 'ANET',\n 'Anglo',\n 'Anheuser-Busch',\n 'Anixter',\n 'ANSS',\n 'Ansteel',\n 'ANSYS',\n 'ANTM',\n 'Antwerp',\n 'Aon',\n 'Apache',\n 'Apartments',\n 'Appetize',\n 'Applied',\n 'Appointedd',\n 'Aprilia',\n 'Aptiv',\n 'APTV',\n 'Aramark',\n 'ArcelorMittal',\n 'Archer-Daniels-Midland',\n 'Argentaria',\n 'Arista',\n 'Arize',\n 'Arizona',\n 'Armour',\n 'ARNES',\n 'Arthur',\n 'Arts',\n 'arXiv',\n 'Asana',\n 'Asbury',\n 'Ashland',\n 'ASLR',\n 'Assicurazioni',\n 'Associates',\n 'Assurances',\n 'Assurant',\n 'Aston',\n 'AstraZeneca',\n 'ATAPI',\n 'Atlassian',\n 'Atmos',\n 'ATVI',\n 'Auchan',\n 'Auckland',\n 'Audi',\n 'Austin',\n 'Australia',\n 'Australian',\n 'Auto-Owners',\n 'autoClose',\n 'Autodesk',\n 'Autoliv',\n 'autoLoader',\n 'Automattic',\n 'autoMock',\n 'autoMocking',\n 'autoMocks',\n 'AutoNation',\n 'autoScroll',\n 'autoSpy',\n 'AutoZone',\n 'AvalonBay',\n 'Avery',\n 'AVGO',\n 'Avis',\n 'Avito',\n 'Aviv',\n 'Aviva',\n 'Avnet',\n 'Avon',\n 'AXA',\n 'azureCR',\n 'azureRM',\n 'azureTools',\n 'azureWebsites',\n 'Baden-Wurttemberg',\n 'BAE',\n 'Bahls',\n 'Bahn',\n 'Bakeries',\n 'Baltimore',\n 'Banco',\n 'Bancorp',\n 'Bancshares',\n 'Bandung',\n 'Bangalore',\n 'Bankengruppe',\n 'Bankin',\n 'Banks',\n 'Baosteel',\n 'Barbara',\n 'Barcelona',\n 'Barclays',\n 'Barnes',\n 'baseAddress',\n 'Basecamp',\n 'Basel',\n 'baseNode',\n 'baseObj',\n 'basePath',\n 'basePtr',\n 'BASF',\n 'Bauman',\n 'Baxter',\n 'Bayer',\n 'Bazaarvoice',\n 'BB',\n 'Becton',\n 'Beihang',\n 'Beijing',\n 'Beirut',\n 'Belarusian',\n 'Belfast',\n 'Bemis',\n 'Ben',\n 'Benefits',\n 'Bentley',\n 'Bergen',\n 'Berkeley',\n 'Berkley',\n 'Berksfile',\n 'Berkshire',\n 'Berlin',\n 'Bern',\n 'Bertelsmann',\n 'Bharat',\n 'BHP',\n 'BIIB',\n 'Bilbao',\n 'Billiton',\n 'Bing',\n 'Bio-Rad',\n 'Biogen',\n 'Biomet',\n 'Birmingham',\n 'bitCount',\n 'Bitly',\n 'Bitnami',\n 'Bitrate',\n 'bitSize',\n 'Bjango',\n 'BKNG',\n 'BlackRock',\n 'Blackstone',\n 'blahBlah',\n 'Bloomberg',\n 'Bloomreach',\n 'Bluesky',\n 'Blueway',\n 'BMW',\n 'BNP',\n 'Boeing',\n 'BOM',\n 'Bombay',\n 'Bonn',\n 'Boots',\n 'Booz',\n 'BorgWarner',\n 'Bosch',\n 'Boston',\n 'bottomLeft',\n 'bottomRight',\n 'Bouygues',\n 'BP',\n 'BPCE',\n 'Bradesco',\n 'Brands',\n 'Brandwatch',\n 'Brasil',\n 'Brazilian',\n 'Brewblox',\n 'Bridgestone',\n 'Bridgewater',\n 'Bristol',\n 'Bristol-Myers',\n 'British',\n 'BRK',\n 'Broadcom',\n 'Broadridge',\n 'Brown-Forman',\n 'browserConfig',\n 'Bruijn',\n 'Brunei',\n 'Brunswick',\n 'Brussels',\n 'bSize',\n 'BSON',\n 'BT',\n 'BTN',\n 'BTNS',\n 'Buenos',\n 'bufIndex',\n 'bufSize',\n 'Bugatti',\n 'buildFolder',\n 'Bunge',\n 'Bunnings',\n 'BYOD',\n 'bzFile',\n 'bzipFile',\n 'Cablevision',\n 'Cabot',\n 'Cadillac',\n 'Caesars',\n 'Calendly',\n 'Calgary',\n 'California',\n 'Calpine',\n 'Caltech',\n 'Caltex',\n 'Cambridge',\n 'Camerfirma',\n 'Cameron',\n 'Campbell',\n 'Camunda',\n 'Canada',\n 'Canterbury',\n 'Capgemini',\n 'Capnproto',\n 'Cardiff',\n 'Caremark',\n 'Caribbean',\n 'CarMax',\n 'Carnegie',\n 'Carolina',\n 'CARR',\n 'Carrefour',\n \"Casey's\",\n 'Caskroom',\n 'Castparts',\n 'Catalent',\n 'categoryName',\n 'Cathay',\n 'Causely',\n 'CBOE',\n 'CBRE',\n 'CBS',\n 'CDATA',\n 'CDATASection',\n 'CDN',\n 'CDNS',\n 'CDW',\n 'Cegid',\n 'CEIP',\n 'Celanese',\n 'Celgene',\n 'Centene',\n 'CenterPoint',\n 'Centers',\n 'Centrica',\n 'CenturyLink',\n 'Cepton',\n 'CERN',\n 'Cerner',\n 'certId',\n 'certStore',\n 'Certum',\n 'CEST',\n 'CEVA',\n 'CFE',\n 'CFONB',\n 'CGA',\n 'CH2M',\n 'Chalmers',\n 'Chambersign',\n 'changeDir',\n 'changeList',\n 'changeLists',\n 'Charles',\n 'Chartered',\n 'ChefDK',\n 'ChemChina',\n 'Chemicals',\n 'Cheng',\n 'CHEP',\n 'Chesapeake',\n 'Chevrolet',\n 'Chicago',\n 'childNode',\n 'Chile',\n 'Chinese',\n 'Chipotle',\n 'Chocolately',\n 'Cholesky',\n 'Chronosphere',\n 'CHRW',\n 'Chrysler',\n 'CHS',\n 'CHTR',\n 'Chubb',\n 'Chubu',\n 'Chulalongkorn',\n 'CIGNA',\n 'Cincinnati',\n 'Cinemark',\n 'CINF',\n 'Cintas',\n 'Cisco',\n 'Citibank',\n 'CITIC',\n 'Citigroup',\n 'Citizens',\n 'Citrix',\n 'Citylink',\n 'classPath',\n 'Cliffs',\n 'Clojure',\n 'Clorox',\n 'Cloudflare',\n 'Cloudinary',\n 'CMCSA',\n 'CME',\n 'CMOS',\n 'CMS',\n 'CN',\n 'CNAME',\n 'CNCF',\n 'CNP',\n 'Coca-Cola',\n 'Codecentric',\n 'codeId',\n 'codeMirror',\n 'Codento',\n 'codePage',\n 'COFCO',\n 'CoffeeScript',\n 'Colgate-Palmolive',\n 'Collibra',\n 'Colombia',\n 'COLOPL',\n 'colorRef',\n 'Columbia',\n 'Comcast',\n 'Comerica',\n 'Commerzbank',\n 'Communications',\n 'Communities',\n 'Comodo',\n 'Compal',\n 'Companies',\n 'Complutense',\n 'componentManager',\n 'COMPUTERNAME',\n 'Con-way',\n 'ConAgra',\n 'Concho',\n 'ConocoPhillips',\n 'CONSOL',\n 'containerName',\n 'Controls',\n 'Coors',\n 'Copart',\n 'Copenhagen',\n 'Coralogix',\n 'Core-Mark',\n 'CorePack',\n 'Cornell',\n 'Corning',\n 'Corteva',\n 'Cosmo',\n 'Costco',\n 'Coursera',\n 'CPC',\n 'CPRT',\n 'CQRS',\n 'CRD',\n 'Creations',\n 'Credly',\n 'CRH',\n 'Criteo',\n 'crossSite',\n 'Crowdin',\n 'CSAIL',\n 'CSAT',\n 'CSCO',\n 'CSRF',\n 'CST',\n 'csvLine',\n 'CSX',\n 'CTAS',\n 'CTL',\n 'CTLT',\n 'CTSH',\n 'CTVA',\n 'CTXS',\n 'Cummins',\n 'curLoc',\n 'Curtin',\n 'customDomain',\n 'cValue',\n 'cVar',\n 'cVars',\n 'CVE',\n 'CVS',\n 'CWE',\n 'CyberTrust',\n 'Cybozu',\n 'Dachser',\n 'Dai-ichi',\n 'Daimler',\n 'Daiwa',\n 'DAL',\n 'Dana',\n 'Danaher',\n 'Daniels',\n 'Danone',\n 'Darden',\n 'Darmstadt',\n 'Dartmouth',\n 'Darussalam',\n 'DAST',\n 'Databricks',\n 'dataCenter',\n 'dataCenters',\n 'Datadog',\n 'dataFile',\n 'Datanami',\n 'Datang',\n 'dateInterval',\n 'dateObject',\n 'dateTime',\n 'dateTimezone',\n 'datFile',\n 'Datorama',\n 'Davis',\n 'DaVita',\n 'DAWG',\n 'Dayjs',\n 'Dazs',\n 'DBaaS',\n 'DBAL',\n 'dbLog',\n 'DBs',\n 'DCs',\n 'DDMMYY',\n 'DDOG',\n 'DDoS',\n 'DDR',\n 'DDTHH',\n 'Deakin',\n 'debugBreak',\n 'Decker',\n 'DeepScale',\n 'Deere',\n 'Delhaize',\n 'Delhi',\n 'Deloitte',\n 'Denki',\n 'Denmark',\n 'Dennison',\n 'Denso',\n 'Dentsply',\n 'Depot',\n 'Deutsche',\n 'Deutschland',\n 'DEV',\n 'devContainers',\n 'deviceId',\n 'deviceInfo',\n 'deviceIp',\n 'deviceName',\n 'Devices',\n 'Devon',\n 'DEVs',\n 'DexCom',\n 'Dexia',\n 'Dezzai',\n 'DFKI',\n \"Dick's\",\n 'Dickinson',\n 'Diego',\n 'Digia',\n 'DigiCert',\n \"Dillard's\",\n 'Dior',\n 'DirecTV',\n 'dirId',\n 'dirLen',\n 'dirPath',\n 'DISCA',\n 'DISCK',\n 'Disney',\n 'DLTR',\n 'DocBlock',\n 'docId',\n 'docSearch',\n 'Docusaurus',\n 'docUtil',\n 'docUtils',\n 'DOM',\n \"Domino's\",\n 'Domtar',\n 'Dongfeng',\n 'Donnelley',\n 'DOS',\n 'dotNET',\n 'Douyin',\n 'Dover',\n 'Dow',\n 'downloadFile',\n 'downloadFolder',\n 'downloadId',\n 'dPad',\n 'Dr',\n 'Dresden',\n 'driveInfo',\n 'driveName',\n 'DRM',\n 'dSize',\n 'DSNU',\n 'dstFile',\n 'dstStream',\n 'DTE',\n 'Dublin',\n 'Ducati',\n 'DuPont',\n 'Durham',\n 'dValue',\n 'Dwight',\n 'DXC',\n 'DXCM',\n 'Dynatrace',\n 'Dyno',\n 'EADS',\n 'eAPI',\n 'Eastman',\n 'Eaton',\n 'eBPF',\n 'ECDHE',\n 'ECDSA',\n 'ECMA',\n 'Ecolab',\n 'Ecole',\n 'Ecopetrol',\n 'Edeka',\n 'Edinburgh',\n 'Edison',\n 'Edwards',\n 'EET',\n 'EGA',\n 'Egnyte',\n 'Eindhoven',\n 'Electricite',\n 'Eleuther',\n 'Elfsight',\n 'Eli',\n 'EMC',\n 'EMCOR',\n 'Emerson',\n 'Emojipedia',\n 'Emory',\n 'endScroll',\n 'endUnless',\n 'Enel',\n 'Energie',\n 'ENI',\n 'Entergy',\n 'Enterprises',\n 'entryName',\n 'Environnement',\n 'EOG',\n 'EOL',\n 'EOLs',\n 'EPFL',\n 'EPYC',\n 'EQIX',\n 'Equifax',\n 'Equinix',\n 'Equities',\n 'Erasmus',\n 'Ericsson',\n 'Erie',\n 'errorCode',\n 'errorLog',\n 'errorLogs',\n 'ESA',\n 'eSignature',\n 'ESMTPS',\n 'ESNEXT',\n 'Esri',\n 'Essex',\n 'ETag',\n 'ETags',\n 'ETH',\n 'Ethereum',\n 'Etsy',\n 'Ettercap',\n 'Eurasian',\n 'Euris',\n 'eventLog',\n 'Everest',\n 'Evergy',\n 'Eversource',\n 'EVRG',\n 'Exelon',\n 'Exeter',\n 'Exherbo',\n 'EXOR',\n 'EXPD',\n 'EXPE',\n 'Expedia',\n 'Expeditors',\n 'Expensify',\n 'Experian',\n 'Exps',\n 'externalProject',\n 'Exts',\n 'Exxon',\n 'EY',\n 'F5',\n 'FaaS',\n 'Fabra',\n 'Facebook',\n 'Fannie',\n 'Fargo',\n 'Fastenal',\n 'FAW',\n 'FBHS',\n 'FCStone',\n 'featureId',\n 'featureStore',\n 'FedEx',\n 'Fenosa',\n 'Ferrari',\n 'FFIV',\n 'Figma',\n 'fileData',\n 'fileDir',\n 'fileExt',\n 'fileFolder',\n 'fileId',\n 'fileIdx',\n 'fileIndex',\n 'fileInfo',\n 'fileLen',\n 'fileLog',\n 'filePath',\n 'fileUtil',\n 'fileUtils',\n 'Finmeccanica',\n 'Fireblocks',\n 'FirstEnergy',\n 'Fiserv',\n 'FISV',\n 'FITB',\n 'FIXURL',\n 'Flattr',\n 'Flavors',\n 'FleetCor',\n 'Flextronics',\n 'Flickr',\n 'Flipkart',\n 'FLIR',\n 'Florida',\n 'Flowserve',\n 'Fluor',\n 'FMC',\n 'folderInfo',\n 'folderName',\n 'Foncire',\n 'Fonticons',\n 'Foods',\n 'Formosa',\n 'Fortinet',\n 'Fortive',\n 'FOXA',\n 'FPM',\n 'FQDNS',\n 'Fragrances',\n 'frameBuffer',\n 'France',\n 'France-KLM',\n 'Franklin',\n 'Franz',\n 'Freddie',\n 'Freeport-McMoRan',\n 'freeSpace',\n 'Freiburg',\n 'Freightlinx',\n 'Frenet',\n 'Fresenius',\n 'Freshworks',\n 'Fried',\n 'FTNT',\n 'Fudan',\n 'Fujifilm',\n 'Fujitsu',\n 'fullScreen',\n 'Futurice',\n 'fValue',\n 'Gadjah',\n 'Gallagher',\n 'Galway',\n 'gamePad',\n 'GameStop',\n 'Gannett',\n 'Garmin',\n 'Gartner',\n 'GasTerra',\n 'Gazprom',\n 'GCE',\n 'GCESD',\n 'GCM',\n 'GCP',\n 'GCS',\n 'GDF',\n 'GDPR',\n 'Gebruder',\n 'Geely',\n 'Gemfile',\n 'GEMM',\n 'Generale',\n 'Generali',\n 'Geneva',\n 'Genworth',\n 'George',\n 'Georgetown',\n 'Georgia',\n 'GeoTrust',\n 'getFont',\n 'getSel',\n 'Ghent',\n 'GICS',\n 'Gilead',\n 'Giphy',\n 'GitHub',\n 'GitLab',\n 'GLAPI',\n 'Glasgow',\n 'GlaxoSmithKline',\n 'Glencore',\n 'GlobalSign',\n 'GmbH',\n 'GNSS',\n 'gnuLocaleDir',\n 'Gofore',\n 'Goldman',\n 'Goodyear',\n 'GOOG',\n 'GOOGL',\n 'Gothenburg',\n 'GP',\n 'GPIO',\n 'GPKG',\n 'Gradio',\n 'Grafana',\n 'Grainger',\n 'Grammarly',\n 'Graphcool',\n 'Graybar',\n 'Graz',\n 'Greenland',\n 'GRMN',\n 'Groningen',\n 'groupBox',\n 'Groupe',\n 'gRPC',\n 'Grumman',\n 'GS',\n 'GSM',\n 'GUI',\n 'GUID',\n 'GUIs',\n 'Guodian',\n 'Gwangju',\n 'gzFile',\n 'gzipFile',\n 'Hacktoberfest',\n 'Hai',\n 'Hallak',\n 'Halliburton',\n 'Hamilton',\n 'Hanesbrands',\n 'Haniel',\n 'Hanyang',\n 'Hapag-Lloyd',\n 'Harbin',\n 'Harley-Davidson',\n 'Harris',\n 'Hartford',\n 'Harvard',\n 'Hasbro',\n 'HashiCorp',\n 'Hathaway',\n 'HBAN',\n 'hBrush',\n 'HCA',\n 'hCursor',\n 'HD',\n 'HDD',\n 'HDMI',\n 'Healthpeak',\n 'HeBei',\n 'Hebrew',\n 'Hee',\n 'Heidelberg',\n 'Heineken',\n 'Heinz',\n 'helloWorld',\n 'Helsinki',\n 'Henan',\n 'Henry',\n 'Heptio',\n 'Heraeus',\n 'Heriot-Watt',\n 'Hershey',\n 'Hesai',\n 'Hess',\n 'Hetzner',\n 'Hewlett',\n 'Hewlett-Packard',\n 'hFile',\n 'HHMM',\n 'hIcon',\n 'Hilton',\n 'Hindustan',\n 'Hipercard',\n 'Hitachi',\n 'hKey',\n 'hModule',\n 'Hokkaido',\n 'Holcim',\n 'Holdings',\n 'HollyFrontier',\n 'Hologic',\n 'HOLX',\n 'HOMAG',\n 'HOMEDRIVE',\n 'HOMEPATH',\n 'Honda',\n 'Honeywell',\n 'Hong',\n 'Hopkins',\n 'Hormel',\n 'Horton',\n 'Hotels',\n 'Howmet',\n 'howTo',\n 'HPBW',\n 'hrTime',\n 'HSBC',\n 'hScroll',\n 'HSIC',\n 'HSLA',\n 'HSVA',\n 'HTML',\n 'HTTP',\n 'HTTPS',\n 'HTTPSD',\n 'httpSocket',\n 'httpUrl',\n 'Hua',\n 'Huadian',\n 'Huaneng',\n 'Huawei',\n 'Huazhong',\n 'HubSpot',\n 'Hughes',\n 'Hulu',\n 'Humana',\n 'Humboldt',\n 'Hungarian',\n 'Huntington',\n 'Hutchison',\n 'hWin',\n 'hWnd',\n 'Hyundai',\n 'IANA',\n 'Iberdrola',\n 'Icahn',\n 'ICCC',\n 'iCloud',\n 'ICLR',\n 'iData',\n 'Idealo',\n 'Idean',\n 'Idec',\n 'Idemitsu',\n 'IDEX',\n 'Idexx',\n 'IDXX',\n 'IEEE',\n 'IETF',\n 'IHS',\n 'IKEA',\n 'Illinois',\n 'Illumina',\n 'ILMN',\n 'imageSize',\n 'Imgix',\n 'Imgur',\n 'Imperva',\n 'importLib',\n 'INAP',\n 'InBev',\n 'inBuffer',\n 'Income',\n 'INCY',\n 'Incyte',\n 'indexFile',\n 'India',\n 'Indian',\n 'Indonesia',\n 'Industries',\n 'Ineos',\n 'Infisical',\n 'Infomaniak',\n 'Infosys',\n 'ING',\n 'Ingalls',\n 'Ingersoll',\n 'Ingram',\n 'Ingredion',\n 'Initializers',\n 'Innovations',\n 'Innoviz',\n 'Ins',\n 'Instagram',\n 'instanceDir',\n 'Instruments',\n \"Int'l\",\n 'INTC',\n 'Integrated',\n 'Integrys',\n 'Interpublic',\n 'intervalObj',\n 'Intesa',\n 'INTL',\n 'INTU',\n 'Invesco',\n 'IOUtil',\n 'IP',\n 'IPG',\n 'IPGP',\n 'ipNet',\n 'iPos',\n 'IQVIA',\n 'Ireland',\n 'IRSA',\n 'Irvine',\n 'isArray',\n 'isCallable',\n 'isDisabled',\n 'ISEA',\n 'isEmpty',\n 'isObject',\n 'Isovalent',\n 'ISRG',\n 'isStr',\n 'isString',\n 'IssueHunt',\n 'issueId',\n 'isUnDef',\n 'Italia',\n 'Italiane',\n 'Itanium',\n 'Itausa-Investimentos',\n 'itemId',\n 'Itochu',\n 'Iubenda',\n 'iVal',\n 'Jabil',\n 'Jacobs',\n 'Jagiellonian',\n 'James',\n 'Jarden',\n 'Jardine',\n 'JavaScript',\n 'JavaScriptReact',\n 'JBHT',\n 'JBoss',\n 'JBS',\n 'JDBC',\n 'Jekylling',\n 'Jekyllrb',\n 'Jemmic',\n \"Jerry's\",\n 'JetBlue',\n 'Jetifier',\n 'JFE',\n 'JFrog',\n 'Jiangsu',\n 'Jiaotong',\n 'Jizhong',\n 'JKHY',\n 'JM',\n 'JNPR',\n 'Johns',\n 'Johnson',\n 'Jones',\n 'Joyent',\n 'JPDC',\n 'JPMorgan',\n 'jPos',\n 'JSON',\n 'JSONLD',\n 'JSTOR',\n 'Jude',\n 'Jupyter',\n 'jVal',\n 'JWK',\n 'JWKS',\n 'JWT',\n 'JX',\n 'Kabbage',\n 'Kabushiki',\n 'Kailuan',\n 'Kaisha',\n 'Kalgin',\n 'Kanpur',\n 'Kansai',\n 'Kansas',\n 'Karlsruhe',\n 'Kawasaki',\n 'KBC',\n 'KBR',\n 'KDDI',\n 'KEDA',\n 'Keio',\n 'Kellogg',\n 'Kelly',\n 'Kentucky',\n 'Kerberos',\n 'KeyCloak',\n 'KeyCorp',\n 'keyDown',\n 'keyMenu',\n 'keyOf',\n 'KEYS',\n 'Keysight',\n 'keyVault',\n 'KFC',\n 'KFUPM',\n 'KFW',\n 'Khalifa',\n 'Kia',\n 'Kiewit',\n 'Kimberly-Clark',\n 'Kimco',\n 'Kinder',\n \"King's\",\n 'KKR',\n 'KLA',\n 'KLAC',\n 'Knuth',\n 'Ko-fi',\n 'Kobe',\n \"Kohl's\",\n 'Komatsu',\n 'Konami',\n 'Kong',\n 'Koo',\n 'Korea',\n 'Kosan',\n 'Kotlin',\n 'KotlinScript',\n 'KPMG',\n 'kPos',\n 'Kraft',\n 'Kragpur',\n 'Kramdown',\n 'Kroger',\n 'KTM',\n 'KU',\n 'Kuehne',\n 'KUKA',\n 'Kung',\n 'KupiVIP',\n 'Kuula',\n 'kVal',\n 'kvCopy',\n 'kvPair',\n 'Kyoto',\n 'Kyung',\n 'Kyushu',\n 'L-3',\n \"L'Oreal\",\n 'L3Harris',\n 'Laboratories',\n 'Labs',\n 'Lafarge',\n 'Lamborghini',\n 'Lamoda',\n 'Lancaster',\n 'Lancia',\n 'Landesbank',\n 'Langfuse',\n 'Langtrace',\n 'Las',\n 'Lastfm',\n 'Lauder',\n 'Lauren',\n 'Lausanne',\n 'lButton',\n 'LDOS',\n 'Lear',\n 'Leaseweb',\n 'LEDDAR',\n 'Leeds',\n 'Leggett',\n 'Lego',\n 'Leica',\n 'Leicester',\n 'Leiden',\n 'Leidos',\n 'Leishen',\n 'Lennar',\n 'Lenovo',\n 'Letterboxd',\n 'Leucadia',\n 'Leuven',\n 'Levenshtein',\n 'Levis',\n 'LexisNexis',\n 'Lexus',\n 'LHS',\n 'Liatrio',\n 'libATA',\n 'libDir',\n 'libDirs',\n 'Liberapay',\n 'Librato',\n 'Lidl',\n 'Lifesciences',\n 'Lightstep',\n 'Lilly',\n 'Lincoln',\n 'Linde',\n 'lineDown',\n 'Lines',\n 'LinkCode',\n 'LinkedIn',\n 'linkName',\n 'linkRef',\n 'Liverpool',\n 'Livox',\n 'LKQ',\n 'LLC',\n 'Lloyds',\n 'LOCALEDIR',\n 'localeInfo',\n 'localStorage',\n 'Lockheed',\n 'Loews',\n 'Logitech',\n 'Logz',\n 'Lomonosov',\n 'London',\n 'LONGLONG',\n 'Lonza',\n 'LoongArch',\n 'Loongson',\n 'Lorillard',\n 'Los',\n 'LOSCAM',\n 'Lots',\n 'Loughborough',\n 'Louis',\n 'Lovatt',\n \"Lowe's\",\n 'LP',\n 'lParam',\n 'lpBuffer',\n 'lpctStr',\n 'lpDWord',\n 'LPSTR',\n 'lptStr',\n 'lpVoid',\n 'lpWord',\n 'LRCX',\n 'lResult',\n 'lSize',\n 'LSM',\n 'LTS',\n 'LTSV',\n 'Lufthansa',\n 'Lukoil',\n 'Lumibird',\n 'Luminar',\n 'Lumitics',\n 'Lund',\n 'Lunr',\n 'Lutherans',\n 'lVar',\n 'lVars',\n 'LXC',\n 'Lyft',\n 'Lyon',\n 'LyondellBasell',\n 'Maastricht',\n 'Machines',\n 'macOS',\n 'Macquarie',\n \"Macy's\",\n 'Mada',\n 'Madrid',\n 'Mae',\n 'Maersk',\n 'Magna',\n 'Mahalanobis',\n 'Mahidol',\n 'Mailchimp',\n 'Malaya',\n 'Malaysia',\n 'Manchester',\n 'ManpowerGroup',\n 'Manulife',\n 'Mapfre',\n 'Marietta',\n 'MarketAxess',\n 'Markets',\n 'Markit',\n 'Marquard',\n 'Marriott',\n 'Marubeni',\n 'Maruhan',\n 'Mary',\n 'Maryland',\n 'Masco',\n 'Maserati',\n 'Massachusetts',\n 'Massey',\n 'MasterCard',\n 'Materials',\n 'Matheson',\n 'Matomo',\n 'Mattel',\n 'Mattermost',\n 'maxCPUs',\n 'Mazda',\n 'mButton',\n 'McCormick',\n \"McDonald's\",\n 'McGill',\n 'McGraw',\n 'MCHP',\n 'McKesson',\n 'McLaren',\n 'McLennan',\n 'McMaster',\n 'MDLZ',\n 'MeadWestvaco',\n 'Medco',\n 'MediaWiki',\n 'Medipal',\n 'Medtronic',\n 'Meiji',\n 'Melanox',\n 'Melbourne',\n 'Mellon',\n 'MemDB',\n 'Mendeley',\n 'Mercari',\n 'Mercedes',\n 'Mercedes-Benz',\n 'MERCHANTABILITY',\n 'Merchants',\n 'Merck',\n 'messageId',\n 'messageIds',\n 'messageList',\n 'Metals',\n 'MetLife',\n 'Mettler',\n 'Mexican',\n 'Mexico',\n 'MGM',\n 'Miami',\n 'Michelin',\n 'Michigan',\n 'Microsoft',\n 'Mid-America',\n 'Midjourney',\n 'Migros',\n 'Milano',\n 'Mills',\n 'Minecraft',\n 'Ming',\n 'minMaxInfo',\n 'Minmetals',\n 'Minnesota',\n 'Mirantis',\n 'MITM',\n 'Mitsubishi',\n 'Mitsui',\n 'Mixpanel',\n 'Mizuho',\n 'MKTX',\n 'MLP',\n 'MMDDYY',\n 'MMDDYYYY',\n 'MNST',\n 'Mobil',\n 'Mobis',\n 'mockFile',\n 'mockFn',\n 'mockFunction',\n 'Mockito',\n 'mockPath',\n 'Mohawk',\n 'Mol',\n 'Molina',\n 'Moller-Maersk',\n 'Molson',\n 'Monash',\n 'Mondelez',\n 'Mondiale',\n 'Mondoo',\n 'Mongo',\n 'Monsanto',\n 'Monterey',\n 'Montreal',\n \"Moody's\",\n \"Moore's\",\n 'Moovit',\n 'Morgan',\n 'Morris',\n 'Morrison',\n 'Moscow',\n 'Motorola',\n 'Motors',\n 'Mouseflow',\n 'mouseWheel',\n 'Movil',\n 'Mozilla',\n 'MRC',\n 'MS',\n 'MSCI',\n 'MSFT',\n 'msgList',\n 'MSSQLSERVER',\n 'multiLog',\n 'multiPath',\n 'Munich',\n 'Murphy',\n 'Musixmatch',\n 'MXIM',\n 'Myer',\n 'Mylan',\n 'Nagel',\n 'Nagoya',\n 'Nanjing',\n 'Nanyang',\n 'Napatech',\n 'Narrowable',\n 'Narrowables',\n 'Nasdaq',\n 'Nava',\n 'Navarra',\n 'Naver',\n 'Navistar',\n 'NCLH',\n 'NCR',\n 'NDA',\n 'NDAQ',\n 'NDJSON',\n 'NEC',\n 'Nederlanden',\n 'Nemours',\n 'NetApp',\n 'Netflix',\n 'Netlify',\n 'Networks',\n 'Neuralink',\n 'Newcastle',\n 'NEWDATE',\n 'NEWDECIMAL',\n 'newDir',\n 'Newell',\n 'newFile',\n 'newId',\n 'Newmont',\n 'Nextel',\n 'NextEra',\n 'nextIdx',\n 'nFile',\n 'NFLX',\n 'Nginx',\n 'Nginxinc',\n 'Nielsen',\n 'NII',\n 'Nijmegen',\n 'Nike',\n 'Nikto',\n 'Nintendo',\n 'Nippon',\n 'NiSource',\n 'Nissan',\n 'NIST',\n 'Nitor',\n 'nKey',\n 'NKSJ',\n 'NLOK',\n 'NLSN',\n 'noCookie',\n 'nodeMap',\n 'NodeNext',\n 'nodeObj',\n 'nodeP',\n 'nodePtr',\n 'Nokia',\n 'Nomura',\n 'nonStatic',\n 'Nordcloud',\n 'Nordea',\n 'Nordstrom',\n 'NordVPN',\n 'NOREF',\n 'NoReply',\n 'Norfolk',\n 'Normale',\n 'Northrop',\n 'NortonLifeLock',\n 'Norwegian',\n 'noSlash',\n 'NOSQL',\n 'notArray',\n 'NOTFOUND',\n 'notObject',\n 'Notre',\n 'Nottingham',\n 'Novartis',\n 'Novell',\n 'Novosibirsk',\n 'NRG',\n 'NTAP',\n 'NTRS',\n 'Nubity',\n 'Nucor',\n 'Nullable',\n 'Nullables',\n 'Nullsoft',\n 'NVDA',\n 'Nvidia',\n 'NVR',\n 'NWSA',\n 'NYSE',\n \"O'Lakes\",\n \"O'Reilly\",\n 'Oaktree',\n 'OAuthLib',\n 'objectId',\n 'ObservIQ',\n 'ODBC',\n 'ODFL',\n 'Ohio',\n 'OIDC',\n 'Oilwell',\n 'okCancel',\n 'Okta',\n 'OLAP',\n 'oldFile',\n 'OleDLL',\n 'Olly',\n 'OLM',\n 'OLTP',\n 'Omaha',\n 'Omnicare',\n 'Omnicom',\n 'Omnition',\n 'OMV',\n 'oneOf',\n 'ONEOK',\n 'Onex',\n 'Ontario',\n 'OOBE',\n 'OOCL',\n 'OOTB',\n 'Opel',\n 'OpenAI',\n 'Openbase',\n 'OpenDNS',\n 'OpenID',\n 'OpenTelemetry',\n 'Opscode',\n 'ORCL',\n 'orderId',\n 'ORLEN',\n 'ORLY',\n 'ORM',\n 'OSA',\n 'Osaka',\n 'OSDI',\n 'Oshkosh',\n 'OSINT',\n 'Oslo',\n 'OSS',\n 'OSTIF',\n 'Otago',\n 'Otechie',\n 'OTIS',\n 'OTL',\n 'OTLP',\n 'Ottawa',\n 'OU',\n 'outBuffer',\n 'outDir',\n 'Outreachy',\n 'OWASP',\n 'Owens',\n 'Owens-Illinois',\n 'Oy',\n 'Ozforex',\n 'Ozon',\n 'PACCAR',\n 'Packard',\n 'Padova',\n 'pageData',\n 'PagerDuty',\n 'pageView',\n 'pageViews',\n 'Palantir',\n 'Paludis',\n 'Panasonic',\n 'Panner',\n 'Papaki',\n 'PARCO',\n 'parentNode',\n 'Paribas',\n 'Paris',\n 'Parker-Hannifin',\n 'Partners',\n 'Parts',\n 'Patreon',\n 'Paulo',\n 'Paxos',\n 'PAYC',\n 'Paychex',\n 'Paycom',\n 'Paylocity',\n 'Payments',\n 'PayPal',\n 'PAYX',\n 'PBCT',\n 'PBF',\n 'pBuf',\n 'pBuffer',\n 'PCAP',\n 'PCAPNG',\n 'PCAR',\n 'pcFileDir',\n 'pConnection',\n 'PCTL',\n 'PDVSA',\n 'Peabody',\n 'Pemex',\n 'Penh',\n 'Penn',\n 'Penney',\n 'Pennsylvania',\n 'Penske',\n 'Pentair',\n 'Penteston',\n \"People's\",\n 'Pepsi',\n 'PepsiCo',\n 'Percona',\n 'PerkinElmer',\n 'Perrigo',\n 'Petersburg',\n 'Petrobras',\n 'Petronas',\n 'PetSmart',\n 'Peugeot',\n 'pFile',\n 'Pfizer',\n 'Pharmaceuticals',\n 'Pharmahandel',\n 'Philip',\n 'Philips',\n 'Phillips',\n 'Phnom',\n 'Photonics',\n 'PHPs',\n 'Pingdom',\n 'Pinterest',\n 'Pioneering',\n 'Pittsburgh',\n 'Pixar',\n 'PKCS',\n 'PKGDATADIR',\n 'PKN',\n 'Plains',\n 'Plans',\n 'Platt',\n 'PLC',\n 'Plex',\n 'PLSQL',\n 'PNC',\n 'Po',\n 'Pohang',\n 'POJO',\n 'POJOs',\n 'Politecnico',\n 'Pompeu',\n 'Pont',\n 'Porsche',\n 'Portainer',\n 'Porto',\n 'POSCO',\n 'POSIX',\n 'postCondition',\n 'Poste',\n 'Postgres',\n 'PPG',\n 'PPL',\n 'Prague',\n 'Praxair',\n 'Precommit',\n 'Preformat',\n 'prevIdx',\n 'PRGO',\n 'Priceline',\n 'Princeton',\n 'printName',\n 'Prisma',\n 'PRNU',\n 'processId',\n 'Processing',\n 'procId',\n 'Procter',\n 'Products',\n 'projectId',\n 'Prologis',\n 'PromQL',\n 'Properties',\n 'Protobuf',\n 'Protobufs',\n 'Proxmox',\n 'PSEG',\n 'PSP',\n 'PSTR',\n 'PTT',\n 'Pty',\n 'Publix',\n 'PulteGroup',\n 'Purdue',\n 'Putra',\n 'pVar',\n 'PVH',\n 'PwC',\n 'PYPL',\n 'Qatar',\n 'QCOM',\n 'Qorvo',\n 'QRVO',\n 'QUALCOMM',\n 'Quanergy',\n \"Queen's\",\n 'Queensland',\n 'QuesmaOrg',\n 'Quintiles',\n 'QuoVadis',\n 'Rabobank',\n 'Rackspace',\n 'Ralph',\n 'Randstad',\n 'Raymond',\n 'Raytheon',\n 'rayTrace',\n 'rayTracing',\n 'Razorpay',\n 'RBS',\n 'rButton',\n 'RDP',\n 'Reachability',\n 'readDir',\n 'readError',\n 'readErrorLog',\n 'readErrorLogs',\n 'readErrors',\n 'readFile',\n 'Reaktor',\n 'Realogy',\n 'Rebrandly',\n 'Recv',\n 'Redbud',\n 'Reddit',\n \"Reddit's\",\n 'RedHat',\n 'refCount',\n 'refCounting',\n 'referenceCounting',\n 'Refining',\n 'REFLEX',\n 'refNum',\n 'REFs',\n 'refVal',\n 'refValue',\n 'Regeneron',\n 'Regions',\n 'REGN',\n 'regRead',\n 'relDate',\n 'relDateTime',\n 'Relex',\n 'relTime',\n 'Renault',\n 'Rentals',\n 'repoRoot',\n 'Repsol',\n 'Research',\n 'Reserve',\n 'ResMed',\n 'ResNet',\n 'Resorts',\n 'Resources',\n 'Responsys',\n 'Restaurants',\n 'retryCancel',\n 'Revolut',\n 'Reynolds',\n 'RGBIR',\n 'RHS',\n 'Ricoh',\n 'RIEGL',\n 'RIMAS',\n 'Rio',\n 'RMIT',\n 'Robert',\n 'Robinson',\n 'Roblox',\n 'Roche',\n 'Rochester',\n 'Rock-Tenn',\n 'Rockwell',\n 'Rohlig',\n 'rollDown',\n 'Rollins',\n 'Rolls',\n 'Rome',\n 'Rosneft',\n 'Ross',\n 'ROST',\n 'Rotterdam',\n 'Rowe',\n 'rowId',\n 'Royce',\n 'RPATH',\n 'RPC',\n 'RPCs',\n 'RSA',\n 'rSize',\n 'Rubbermaid',\n 'Russia',\n 'Rutgers',\n 'Ruuvi',\n 'RWE',\n 'RWTH',\n 'Ryder',\n 'S-Oil',\n 'Saab',\n 'SaaS',\n 'Sabic',\n 'Sachs',\n 'Safeway',\n 'SAIC',\n 'Sainsbury',\n 'Saint-Gobain',\n 'Sales',\n 'Salesforce',\n 'sameSite',\n 'Samsung',\n 'San',\n 'SanDisk',\n 'Sands',\n 'Sanmina',\n 'Sanofi',\n 'Sanpaolo',\n 'Santa',\n 'Santander',\n 'Sao',\n 'SAST',\n 'SATA',\n 'Saud',\n 'SBA',\n 'SBAC',\n 'Sberbank',\n 'SBOM',\n 'SBUX',\n 'SCADA',\n 'Schein',\n 'schemeId',\n 'Schenker',\n 'Schlumberger',\n 'Schneider',\n 'SCHW',\n 'Schwab',\n 'Sciences',\n 'Scotia',\n 'Scotland',\n 'screenShare',\n 'Scripts',\n 'scrollInfo',\n 'SDRAM',\n 'SE',\n 'Seagate',\n 'Sealed',\n 'Sears',\n 'securityLevel',\n 'Seiki',\n 'Sekiyu',\n 'Semilux',\n 'Semmle',\n 'Sempra',\n 'Sencha',\n 'Sensedia',\n 'Seoul',\n 'Serret',\n 'ServiceNow',\n 'Services',\n 'setAffinity',\n 'setEnv',\n 'setFont',\n 'setRedraw',\n 'setSel',\n 'setText',\n 'SHA256',\n 'Shagang',\n 'Shandong',\n 'Shanxi',\n 'Sheffield',\n 'Shenhua',\n 'Sherwin-Williams',\n 'Shopify',\n 'Shougang',\n 'Showa',\n 'SHV',\n 'sideEffect',\n 'Siemens',\n 'SIGHUP',\n 'SIGINT',\n 'SIGKDD',\n 'SIGKILL',\n 'signOff',\n 'SIGQUIT',\n 'SIGTERM',\n 'SigV4',\n 'SigV4A',\n 'Silae',\n 'Silicom',\n 'SIMD',\n 'Simon',\n 'Singapore',\n 'SinnerSchrader',\n 'Sinochem',\n 'Sinomach',\n 'Sinopec',\n 'Sirona',\n 'Sismology',\n 'Sistema',\n 'SIVB',\n 'SK',\n 'Skaffold',\n 'Skoda',\n 'Skyworks',\n 'SL',\n 'SLA',\n 'sLen',\n 'Slevomat',\n 'SLI',\n 'Slimpay',\n 'SLM',\n 'SLO',\n 'slotId',\n 'Smania',\n 'Smarkets',\n 'SmartyStreets',\n 'Smithfield',\n 'Smucker',\n 'Snap-on',\n 'Snapchat',\n 'Snapple',\n 'SNCF',\n 'SNPS',\n 'Snyk',\n 'Societe',\n 'socketId',\n 'Sodexo',\n 'Softbank',\n 'SoftLayer',\n 'Solaris',\n 'SolarWinds',\n 'Solita',\n 'Solr',\n 'Solutions',\n 'someHost',\n 'Sonera',\n 'Sons',\n 'Sony',\n 'Sorbonne',\n 'sourceIdx',\n 'sourceMap',\n 'sourceMaps',\n 'Southampton',\n 'SpaceX',\n 'Sparc',\n 'SPDX',\n 'SPGI',\n 'Spirent',\n 'Spotify',\n 'SQL',\n 'SQRL',\n 'SquashFS',\n 'Squibb',\n 'SRAM',\n 'srcDir',\n 'srcFile',\n 'srcFolder',\n 'srcStream',\n 'SSD',\n 'SSE',\n 'SSID',\n 'SSP',\n 'SSRF',\n 'Staat',\n 'Stanford',\n 'Stanley',\n 'Staples',\n 'Starbucks',\n 'Starfield',\n 'Starwood',\n 'States',\n 'staticFile',\n 'Staticman',\n \"Staticman's\",\n 'Stationers',\n 'Statoil',\n 'stdCall',\n 'stdWin',\n 'Steelers',\n 'Stellantis',\n 'STERIS',\n 'Stimulsoft',\n 'Stockholm',\n 'Stores',\n 'strLen',\n 'Stryker',\n 'Subaru',\n 'subDirective',\n 'subDirectives',\n 'Suez',\n 'Suisse',\n 'Sumitomo',\n 'Suncor',\n 'Sungkyunkwan',\n 'Sunoco',\n 'SunTrust',\n 'Supercomputing',\n 'Superfeedr',\n 'Supermarkets',\n 'Supervalu',\n 'Surgutneftegas',\n 'SUSE',\n 'sUser',\n 'Susser',\n 'Sussex',\n 'Suzuken',\n 'Suzuki',\n 'SVB',\n 'Svc',\n 'SVGA',\n 'SwedenCentral',\n 'Swiftype',\n 'Swinburne',\n 'Swiss',\n 'Swisscom',\n 'SWKS',\n 'Swyftx',\n 'Sydney',\n 'Symantec',\n 'Synnex',\n 'Synopsys',\n 'Sysco',\n 'sysError',\n 'sysKeyDown',\n 'sysRoot',\n 'sysRoots',\n 'Systems',\n 'T-Mobile',\n 'Taiwan',\n 'Take-Two',\n 'tarFile',\n 'Targa',\n 'Tartu',\n 'Tata',\n \"Taylor's\",\n 'tBody',\n 'tChar',\n 'tCol',\n 'TCP',\n 'tDiff',\n 'TE',\n 'TechnipFMC',\n 'Technologies',\n 'TechRadar',\n 'Telecom',\n 'Teledyne',\n 'Teleflex',\n 'Telefonica',\n 'Telekom',\n 'Telia',\n 'Telstra',\n 'Tencent',\n 'Tenneco',\n 'Teradyne',\n 'Terex',\n 'Tesco',\n 'Tesla',\n 'Tesoro',\n 'testEnv',\n 'testFile',\n 'testFiles',\n 'testId',\n 'testLog',\n 'testLogs',\n 'testMessage',\n 'testMsg',\n 'testParam',\n 'testParams',\n 'testSuite',\n 'testSuites',\n 'testVal',\n 'testValue',\n 'testVar',\n 'Tewoo',\n 'Texas',\n 'texCoord',\n 'texCoords',\n 'textFile',\n 'textFiles',\n 'Textron',\n 'tFoot',\n 'Thanos',\n 'tHead',\n 'Theming',\n 'Thermo',\n 'Thrivent',\n 'ThyssenKrupp',\n 'TIAA-CREF',\n 'Ticino',\n 'Tidelift',\n 'Tieto',\n 'Tiffany',\n 'TikTok',\n 'timeFrame',\n 'timeFrames',\n 'timeInterval',\n 'timeStep',\n 'timeSteps',\n 'Tinto',\n 'TJX',\n 'tmpDir',\n 'tmpFile',\n 'tmpStr',\n 'TMUS',\n 'TNK-BP',\n 'Todoist',\n 'Tokio',\n 'Tokyo',\n 'Toledo',\n 'Tomsk',\n 'Tongji',\n 'topLeft',\n 'topRight',\n 'Torchmark',\n 'Toronto',\n 'Toronto-Dominion',\n 'Toshiba',\n 'Towers',\n 'Toyota',\n 'Toys',\n 'TPDS',\n 'tPtr',\n 'Traceloop',\n 'Trakt',\n 'Trane',\n 'TransDigm',\n 'Translogix',\n 'TravelCenters',\n 'Travelers',\n 'Trimble',\n 'Tripadvisor',\n 'Truist',\n 'TRW',\n 'TSBuild',\n 'TSBuildInfo',\n 'TSCO',\n 'TSDB',\n 'Tsing',\n 'Tsinghua',\n 'tSize',\n 'TSLA',\n 'TSQL',\n 'TTWO',\n 'TUI',\n 'Tumblr',\n 'Turku',\n 'tValue',\n 'Twente',\n 'Twenty-First',\n 'Twilio',\n 'TWTR',\n 'Tyler',\n 'TypeCheck',\n 'Typedef',\n 'TypeScriptReact',\n 'Tyson',\n 'tzId',\n 'tzObj',\n 'UAB',\n 'UAE',\n 'Uber',\n 'UBS',\n 'UC',\n 'UCIM',\n 'UCLA',\n 'uCoord',\n 'uCoords',\n 'UCSI',\n 'UCUM',\n 'UDR',\n 'UEFA',\n 'UFJ',\n 'UGent',\n 'UGI',\n 'UI',\n 'ULTA',\n 'Ultrapar',\n 'unDef',\n 'UniCredit',\n 'Unilever',\n 'uniqueId',\n 'uniqueIdentifier',\n 'UNIST',\n 'United',\n 'UnitedHealth',\n 'Universiteit',\n 'unixRoot',\n 'unSetter',\n 'Unsplash',\n 'UNSW',\n 'Unum',\n 'Upcloud',\n 'updateTimestamp',\n 'uPos',\n 'Uppsala',\n 'Urbana-Champaign',\n 'URS',\n 'US',\n 'USA',\n 'USENIX',\n 'userId',\n 'Utilities',\n 'UTP',\n 'Utrecht',\n 'UUID',\n 'UUIDs',\n 'uVal',\n 'Vagrantfile',\n 'Valarian',\n 'Valeo',\n 'Valero',\n 'Vanderbilt',\n 'Varco',\n 'Variadic',\n 'Varian',\n 'Vasona',\n 'Vattenfall',\n 'vCursor',\n 'vDSO',\n 'Vegas',\n 'Veikkaus',\n 'Velodyne',\n 'Ventas',\n 'Veolia',\n 'Verdaccio',\n 'Verisec',\n 'Verisign',\n 'Verisk',\n 'Verizon',\n 'VF',\n 'vFile',\n 'VGA',\n 'VGL',\n 'VHS',\n 'VIAC',\n 'Viacom',\n 'ViacomCBS',\n 'Viber',\n 'Victoria',\n 'VictoriaMetrics',\n 'Vienna',\n 'Vimeo',\n 'Vinci',\n 'Vincit',\n 'Virginia',\n 'VirtualBox',\n 'VirusTotal',\n 'Visteon',\n 'Visy',\n 'Vivendi',\n 'Vizcaya',\n 'VLAN',\n 'VLANs',\n 'VLDB',\n 'VMDK',\n 'VMOMI',\n 'VMware',\n 'VMXNET',\n 'VNC',\n 'Vodafone',\n 'Volkswagen',\n 'Volvo',\n 'Vornado',\n 'VPN',\n 'VPS',\n 'VRAM',\n 'VRSK',\n 'VRSN',\n 'VRTX',\n 'VSAN',\n 'vScroll',\n 'vSphere',\n 'vSwitch',\n 'VTEX',\n 'Vulcan',\n 'Vulkan',\n 'Vultr',\n 'Vyatta',\n 'W3C',\n 'Wabtec',\n 'Wacom',\n 'Wageningen',\n 'WAgent',\n 'waitUntil',\n 'Wal-Mart',\n 'Walgreen',\n 'Walgreens',\n 'Walmart',\n 'Walt',\n 'WAP',\n 'Warner',\n 'Warsaw',\n 'Warwick',\n 'Waseda',\n 'Washington',\n 'Watchr',\n 'Waterloo',\n 'Watson',\n 'Waze',\n 'Weaviate',\n 'Webex',\n 'webIndex',\n 'webIndexFile',\n 'WebJS',\n 'WEC',\n 'Wedos',\n 'Weiqiao',\n 'Weiss',\n 'WellCare',\n 'WellPoint',\n 'Wells',\n 'Welltower',\n 'WESCO',\n 'Wesfarmers',\n 'Westinghouse',\n 'Westlake',\n 'Weston',\n 'Westpac',\n 'WestRock',\n 'Weyerhaeuser',\n 'Whampoa',\n 'WhatsApp',\n 'widgetManager',\n 'Wikidata',\n 'Wikimedia',\n 'Wikipedia',\n 'Wiktionary',\n 'Wildberries',\n 'Williams',\n 'Willis',\n 'Wilmar',\n 'WinDLL',\n 'WindowsLogin',\n 'Windstream',\n 'WinNT',\n 'WinOS',\n 'WinRM',\n 'WinRS',\n 'WIPO',\n 'Wisconsin-Madison',\n 'WiseTech',\n 'Wishart',\n 'Wistron',\n 'Wix',\n 'WLTW',\n 'Wm',\n 'WMIC',\n 'Wollongong',\n 'Woolworths',\n 'Woori',\n 'WordPress',\n 'workArea',\n 'workDir',\n 'workFolder',\n 'worldGen',\n 'WPAR',\n 'wParam',\n 'WPARs',\n 'writeDir',\n 'writeFile',\n 'WSMan',\n 'WSUS',\n 'Wuhan',\n 'WWAN',\n 'WWW',\n 'Wyndham',\n 'WYNN',\n 'WYSIWYG',\n 'Xbox',\n 'Xcel',\n 'Xcode',\n 'xCoord',\n 'xCoords',\n 'Xenial',\n 'XFS',\n \"Xi'an\",\n 'Xiaohongshu',\n 'Xiaomi',\n 'Xilinx',\n 'XING',\n 'Xinxing',\n 'xKey',\n 'XLNX',\n 'xMax',\n 'xMin',\n 'XML',\n 'XMLRPC',\n 'xPos',\n 'Xproto',\n 'XRAY',\n 'XSD',\n 'XSRF',\n 'Xstrata',\n 'xVal',\n 'Xware',\n 'YAGNI',\n 'Yale',\n 'Yamada',\n 'Yamaha',\n 'Yandex',\n 'Yassir',\n 'Yasuda',\n 'Yat-Sen',\n 'yCoord',\n 'yCoords',\n 'yesNo',\n 'Yext',\n 'yKey',\n 'Yleisradio',\n 'yMax',\n 'yMin',\n 'Yonsei',\n 'York',\n 'YouTube',\n 'YPF',\n 'yPos',\n 'Yusen',\n 'yVal',\n 'Zalando',\n 'Zapier',\n 'Zappos',\n 'ZBRA',\n 'zCoord',\n 'zCoords',\n 'Zealand',\n 'ZEIT',\n 'Zend',\n 'Zentrale',\n 'Zerodha',\n 'ZFS',\n 'Zhejiang',\n 'Zhihu',\n 'Ziggo',\n 'Zillow',\n 'Zimmer',\n 'ZION',\n 'Zions',\n 'zipFile',\n 'zKey',\n 'zLog',\n 'zMax',\n 'zMin',\n 'Zoetis',\n 'Zoho',\n 'ZPool',\n 'ZPools',\n 'zPos',\n 'Zscaler',\n 'Zuora',\n 'Zurich',\n 'zVal',\n];\n","/**\n * Normalize Title Case overuse (a common AI/marketing tic) back to sentence\n * case while preserving acronyms, mixed-case proper nouns, and the first word\n * of each sentence.\n *\n * The function is conservative: it only rewrites strings whose ratio of\n * capitalized words is high enough that the input is unambiguously in Title\n * Case. Normal prose with one or two proper nouns is left untouched.\n *\n * Philosophy (important, and the inverse of the naive approach): we only\n * lowercase a capitalized/ALL-CAPS token when we can positively confirm its\n * lowercase form is a real word — via the generated preserved-terms list, or\n * via an actual EN/FR spelling dictionary lookup (through `nspell`, which\n * expands Hunspell affixes, so inflected forms like \"Published\" or\n * \"Reported\" resolve correctly even though only their stems are dictionary\n * headwords). Anything we don't recognize is assumed to be a proper noun and\n * its original casing is preserved. This is deliberately asymmetric:\n * over-capitalizing a rare common word is a mild cosmetic miss, but\n * decapitalizing an unrecognized proper noun (a person, a place, a brand) is\n * an outright factual error. The old approach did the opposite — lowercase\n * by default, preserve only what's on an explicit allowlist — which\n * systematically mangled any proper noun the allowlist didn't happen to\n * cover.\n *\n * Known limitation: proper nouns whose lowercase homograph is a real\n * dictionary word get wrongly lowercased mid-sentence — e.g. \"Macron\"\n * (\"macron\" is an English word), \"Musk\" (\"musk\" is a fragrance note), \"API\"\n * (\"api\" is a dictionary-fr headword). Same class of ambiguity as \"Apple\"\n * the fruit vs. \"Apple\" the company; see the test suite for more cases.\n * Callers who need a specific term protected can pass it via\n * `preservedTerms`.\n *\n * Examples:\n * \"Your Next AI Skill Is Worldbuilding\" -> \"Your next AI skill is Worldbuilding\"\n * \"How To Use The API For HTTP Calls\" -> \"How to use the API for HTTP calls\"\n * \"The OpenAI Revolution\" -> \"The OpenAI revolution\"\n * \"Macron Meets Zelensky In Kyiv\" -> \"Macron meets Zelensky in Kyiv\" (see caveat above: \"macron\" collides with a real word, so it *does* get lowercased — see tests)\n * \"Cursor: the compression of mechanical work\" -> unchanged\n * \"AI is making us smarter\" -> unchanged\n */\n\nimport { readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport nspell from 'nspell';\n\nimport { GENERATED_PRESERVED_TERMS } from './preserved-terms.generated.js';\n\n/**\n * Terms `npm run generate:terms` (see scripts/generate-preserved-terms.ts)\n * cannot derive from the cspell dictionaries, kept here by hand. Stays\n * short and deliberate on purpose:\n *\n * - 'I' — the pronoun is always capitalized in English. It's excluded from\n * the generated list because lowercase \"i\" is a genuine dictionary\n * headword (the math/code variable) in both EN and FR, so a plain\n * spelling-dictionary lookup would incorrectly lowercase it; this one\n * hardcoded linguistic rule overrides that.\n * - 'AI' — a real gap: dictionary-en does list uppercase \"AI\" as a valid\n * headword these days, but lowercase \"ai\" is *also* a genuine French verb\n * form (\"j'ai\" — I have). With French enabled by default, a plain\n * dictionary lookup on the lowercased token would find \"ai\" valid via\n * French and wrongly lowercase the acronym. The explicit preserved-term\n * entry (checked before any dictionary access) sidesteps the collision\n * entirely.\n * - 'OAuth' — not a dictionary headword in either language, so on its own\n * it would already survive mid-title via the \"unrecognized -> preserve\"\n * default. The entry earns its keep for input that doesn't already use\n * the canonical casing (e.g. \"Oauth\"), restoring it to \"OAuth\".\n *\n * Deliberately NOT re-added, even though they were in the old hardcoded\n * list and cspell doesn't source them either:\n * - 'Apple', 'Meta', 'Linear', 'Operator', 'Codex', 'Google', 'Slack',\n * 'Notion', 'Cursor', 'Amazon', 'Grok', 'TypeScript', 'Python', 'React'\n * — each collides with a genuine lowercase English dictionary word\n * (apple, meta, linear, operator, codex, google, slack, notion, cursor,\n * amazon, grok, typescript, python, react). Preserving them\n * unconditionally would wrongly force-capitalize the common word too;\n * the dictionary-lookup fallback applies the same ambiguity rule\n * automatically for terms that aren't hand- or cspell-listed.\n * - 'Node.js', 'Next.js' — can't be represented as a single preserved\n * term anyway: the tokenizer below splits on '.', so these would only\n * ever match a lone \"Node\"/\"Next\" token. Both \"node\" and \"next\" are\n * common dictionary words, so adding them would incorrectly preserve\n * ordinary title-case capitalization of unrelated sentences.\n * - 'iOS', 'macOS' — no longer needed. Both have an internal lower→upper\n * transition (\"iOS\", \"macOS\"), so the mixed-case heuristic (checked\n * before any dictionary access) already preserves them without an\n * explicit entry.\n */\nconst MANUAL_PRESERVED_TERMS = ['I', 'AI', 'OAuth'];\n\nconst WORD_PATTERN = /(?<word>[\\p{L}0-9']+)/u;\nconst HAS_LOWER_THEN_UPPER = /\\p{Ll}\\p{Lu}/u;\nconst HAS_UPPER = /\\p{Lu}/u;\nconst HAS_LOWER = /\\p{Ll}/u;\nconst HAS_LETTER = /\\p{L}/u;\nconst SENTENCE_END_PATTERN = /[.!?]/;\n\n/**\n * Languages supported for the spelling-dictionary fallback. Publicly\n * exported as `SentenceCaseLanguage` at the bottom of this file (grouping\n * all `export`s there, as required by the lint config).\n */\ntype Language = 'en' | 'fr';\n\nconst DICTIONARY_PACKAGE: Record<Language, string> = {\n en: 'dictionary-en',\n fr: 'dictionary-fr',\n};\n\n/**\n * Lazily-built singleton map (lowercase -> canonical casing) for the\n * combined default preserved terms. Built once on first use and reused for\n * every call that doesn't ask to replace the defaults entirely.\n */\nlet defaultPreservedMap: Map<string, string> | null = null;\n\nfunction getDefaultPreservedMap(): Map<string, string> {\n if (!defaultPreservedMap) {\n const map = new Map<string, string>();\n for (const term of GENERATED_PRESERVED_TERMS) {\n map.set(term.toLowerCase(), term);\n }\n for (const term of MANUAL_PRESERVED_TERMS) {\n map.set(term.toLowerCase(), term);\n }\n defaultPreservedMap = map;\n }\n return defaultPreservedMap;\n}\n\n/**\n * Lazily-constructed, per-language `nspell` singletons. Parsing a Hunspell\n * affix + dictionary file costs roughly 100-300ms, so an instance is only\n * ever built the first time a token *actually* requires a dictionary lookup\n * (never at module import, never at the first `toSentenceCase` call if that\n * call's tokens are all resolved by the cheaper fast paths first). Each\n * language is independent: a call that only uses `languages: ['en']` never\n * pays the French parsing cost, and vice versa.\n */\nconst spellCheckers = new Map<Language, ReturnType<typeof nspell>>();\n\n/**\n * `dictionary-en`/`dictionary-fr` ship an async default export (they read\n * their `.aff`/`.dic` files with `fs.promises.readFile` at import time), but\n * `toSentenceCase` must stay synchronous. We bypass their package entry\n * point entirely and read the underlying Hunspell data files ourselves with\n * a synchronous `readFileSync`, resolving the package directory via\n * `createRequire` (works from both the ESM and CJS build outputs).\n */\nconst nodeRequire = createRequire(import.meta.url);\n\nfunction loadSpellChecker(language: Language): ReturnType<typeof nspell> {\n const packageEntry = nodeRequire.resolve(DICTIONARY_PACKAGE[language]);\n const packageDir = path.dirname(packageEntry);\n const aff = readFileSync(path.join(packageDir, 'index.aff'));\n const dic = readFileSync(path.join(packageDir, 'index.dic'));\n return nspell({ aff, dic });\n}\n\nfunction getSpellChecker(language: Language): ReturnType<typeof nspell> {\n let checker = spellCheckers.get(language);\n if (!checker) {\n checker = loadSpellChecker(language);\n spellCheckers.set(language, checker);\n }\n return checker;\n}\n\n/**\n * Memoizes dictionary verdicts (`\"<lang>\\0<word>\"` -> `correct(word)`) since\n * headline-style text repeats the same handful of words constantly. Bounded\n * to avoid unbounded growth across a long-running process; eviction is a\n * simple FIFO (oldest-inserted entry dropped first) rather than true LRU —\n * good enough for this access pattern and far cheaper to maintain.\n */\nconst MAX_VERDICT_CACHE_ENTRIES = 10_000;\nconst spellVerdictCache = new Map<string, boolean>();\n\nfunction isKnownSpelling(word: string, language: Language): boolean {\n const key = `${language}\u0000${word}`;\n const cached = spellVerdictCache.get(key);\n if (cached !== undefined) {\n return cached;\n }\n\n const verdict = getSpellChecker(language).correct(word);\n\n if (spellVerdictCache.size >= MAX_VERDICT_CACHE_ENTRIES) {\n const oldestKey = spellVerdictCache.keys().next().value;\n if (oldestKey !== undefined) {\n spellVerdictCache.delete(oldestKey);\n }\n }\n spellVerdictCache.set(key, verdict);\n\n return verdict;\n}\n\n/** Whether `word` is recognized (case-sensitively) by any of `languages`, checked in order. */\nfunction isKnownInAnyLanguage(word: string, languages: readonly Language[]): boolean {\n for (const language of languages) {\n if (isKnownSpelling(word, language)) {\n return true;\n }\n }\n return false;\n}\n\nexport interface ToSentenceCaseOptions {\n /**\n * Extra terms whose exact casing should be preserved (e.g. brand names).\n * Appended to the default tech-oriented list unless `replacePreserved` is set.\n */\n preservedTerms?: string[];\n\n /** If true, `preservedTerms` replaces the default list rather than extending it. */\n replacePreserved?: boolean;\n\n /**\n * Minimum ratio of capitalized words required to classify the input as Title\n * Case. Below this, the input is returned unchanged. Default 0.6.\n */\n titleCaseThreshold?: number;\n\n /**\n * Minimum word count required to attempt detection. Short strings (titles\n * with 1–2 words, brand lockups) are always returned unchanged. Default 3.\n */\n minWords?: number;\n\n /**\n * Which spelling dictionaries to consult (in order) when a mid-sentence\n * capitalized/ALL-CAPS token isn't resolved by the preserved-terms list\n * or the mixed-case heuristic. Defaults to `['en', 'fr']`. Loading a\n * dictionary is lazy and costs roughly 100-300ms the first time a\n * language is actually needed (never at import, never for calls whose\n * tokens are all resolved by cheaper checks); each configured language\n * is loaded independently and reused (module-level singleton) for every\n * subsequent call, so pass a narrower list only to skip a language you\n * know you'll never need, not as a per-call performance knob.\n */\n languages?: Language[];\n}\n\n/**\n * Normalizes Title Case overuse back to sentence case.\n *\n * @param text - The text to normalize\n * @param options - Normalization options\n * @returns The normalized text, or the original text if it doesn't look like Title Case\n */\nexport function toSentenceCase(text: string, options: ToSentenceCaseOptions = {}): string {\n if (!text) {\n return text;\n }\n\n /*\n * Two-tier lookup so the ~2.5k-entry default map is never rebuilt (or\n * copied) per call: a small local map holds only this call's extra\n * `preservedTerms`, and falls back to the lazily-built module-level\n * singleton unless `replacePreserved` opts out of the defaults entirely.\n */\n const localPreservedMap = new Map<string, string>();\n for (const term of options.preservedTerms ?? []) {\n localPreservedMap.set(term.toLowerCase(), term);\n }\n const defaultMap = options.replacePreserved ? null : getDefaultPreservedMap();\n const lookupPreserved = (lower: string): string | undefined =>\n localPreservedMap.get(lower) ?? defaultMap?.get(lower);\n\n const threshold = options.titleCaseThreshold ?? 0.6;\n const minWords = options.minWords ?? 3;\n const languages = options.languages ?? ['en', 'fr'];\n\n /*\n * Split, keeping separators as tokens. With a capture group every other\n * entry is a word; runs in between are non-word separators (spaces, punct).\n */\n const tokens = text.split(WORD_PATTERN);\n const wordTokens = tokens.filter((t) => WORD_PATTERN.test(t) && HAS_LETTER.test(t));\n\n if (wordTokens.length < minWords) {\n return text;\n }\n\n const capitalizedCount = wordTokens.filter((t) => HAS_UPPER.test(t[0] ?? '')).length;\n const ratio = capitalizedCount / wordTokens.length;\n if (ratio < threshold) {\n return text;\n }\n\n let isFirstWord = true;\n let nextStartsSentence = false;\n\n return tokens\n .map((tok) => {\n if (!WORD_PATTERN.test(tok) || !HAS_LETTER.test(tok)) {\n if (SENTENCE_END_PATTERN.test(tok)) {\n nextStartsSentence = true;\n }\n return tok;\n }\n\n const startsNewSentence = isFirstWord || nextStartsSentence;\n isFirstWord = false;\n nextStartsSentence = false;\n\n /*\n * 1. Preserved terms (case-insensitive lookup, returns canonical\n * casing). Checked unconditionally, ahead of the sentence-start\n * rule, so a known term at the start of a sentence still gets its\n * canonical casing (e.g. \"iPhone Review\" keeps \"iPhone\", not\n * \"Iphone\").\n */\n const preserved = lookupPreserved(tok.toLowerCase());\n if (preserved) {\n return preserved;\n }\n\n /*\n * 2. Mixed case (camelCase, \"iPhone\", \"ChatGPT\") — preserve\n * verbatim. We require an internal lower→upper transition; pure\n * \"Word\" or \"WORD\" patterns fall through to the rules below.\n */\n if (HAS_LOWER_THEN_UPPER.test(tok)) {\n return tok;\n }\n\n /*\n * 3. Start of a sentence — capitalize first letter, lowercase\n * rest. Unconditional: the first word of a sentence is always\n * capitalized regardless of what any dictionary says about it.\n */\n if (startsNewSentence) {\n return tok[0].toUpperCase() + tok.slice(1).toLowerCase();\n }\n\n /*\n * 4. Fast path: token is already all-lowercase (the overwhelming\n * majority of tokens in real prose) — nothing to decide, and no\n * dictionary access needed.\n */\n if (!HAS_UPPER.test(tok)) {\n return tok;\n }\n\n /*\n * 5. Dictionary fallback — the core of the \"only lowercase what\n * we know is common\" philosophy. Only reached for a capitalized\n * or ALL-CAPS token that isn't a preserved term, isn't\n * mixed-case, and isn't the start of a sentence.\n */\n const isAllCaps = !HAS_LOWER.test(tok) && tok.length >= 2;\n\n if (isAllCaps) {\n /*\n * ALL-CAPS (>= 2 letters): lowercase if the lowercase form is\n * a known word (\"BREAKING\" -> \"breaking\"); otherwise try\n * restoring ordinary title casing if *that* is known\n * (\"LONDON\" -> \"London\"); otherwise assume it's an acronym we\n * don't recognize and leave it untouched (\"GRPC\" stays\n * \"GRPC\"). Over-capitalizing a rare word is a cosmetic miss;\n * decapitalizing an unrecognized proper noun is a factual\n * error — so unknown ALL-CAPS is preserved, not lowercased,\n * unlike the old blanket \"shouting\" heuristic.\n */\n const lower = tok.toLowerCase();\n if (isKnownInAnyLanguage(lower, languages)) {\n return lower;\n }\n const titleCased = tok[0] + tok.slice(1).toLowerCase();\n if (isKnownInAnyLanguage(titleCased, languages)) {\n return titleCased;\n }\n return tok;\n }\n\n /*\n * Capitalized (initial upper, no internal lower→upper\n * transition): lowercase only if the lowercase form is a known\n * common word (\"The\" -> \"the\", \"Reported\" -> \"reported\" via\n * affix expansion); otherwise assume it's a proper noun we don't\n * recognize and preserve the original casing verbatim (\"Macron\"\n * mid-sentence stays \"Macron\", \"Zelensky\" stays \"Zelensky\").\n */\n const lower = tok.toLowerCase();\n if (isKnownInAnyLanguage(lower, languages)) {\n return lower;\n }\n return tok;\n })\n .join('');\n}\n\nexport type { Language as SentenceCaseLanguage };\n"],"mappings":";;;;;AAAA,MAAM,qBACF;AAGJ,MAAM,gBAAgB;AAEtB,MAAM,gBAAgB;AACtB,MAAM,qBAAqB;AAC3B,MAAM,QAAQ;AACd,MAAM,cAAc;AACpB,MAAM,uBAAuB;AAE7B,MAAM,0BAA2E;CAC7E;EAAE,SAAS;EAAyB,aAAa;CAAI;CACrD;EAAE,SAAS;EAAyB,aAAa;CAAI;CACrD;EAAE,SAAS;EAAW,aAAa;CAAM;CACzC;EAAE,SAAS;EAA6C,aAAa;CAAI;AAC7E;;;;;;;;AAgBA,SAAgB,YAAY,MAAc,UAA8B,CAAC,GAAW;CAChF,MAAM,EAAE,4BAA4B,MAAM,iBAAiB,SAAS;CAEpE,IAAI,CAAC,MACD,OAAO;CAGX,IAAI,SAAS;CAEb,SAAS,OAAO,QAAQ,OAAO,IAAI;CACnC,SAAS,OAAO,QAAQ,aAAa,EAAE;CACvC,SAAS,OAAO,UAAU,MAAM;CAChC,SAAS,OAAO,QAAQ,oBAAoB,EAAE;CAC9C,SAAS,OAAO,QAAQ,eAAe,EAAE;CAEzC,IAAI,2BACA,SAAS,OAAO,QAAQ,sBAAsB,IAAI;CAGtD,SAAS,OAAO,QAAQ,eAAe,GAAG;CAE1C,KAAK,MAAM,EAAE,SAAS,iBAAiB,yBACnC,SAAS,OAAO,QAAQ,SAAS,WAAW;CAGhD,IAAI,gBACA,SAAS,OAAO,QAAQ,oBAAoB,GAAG,CAAC,CAAC,KAAK;CAG1D,OAAO;AACX;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrCA,MAAa,4BAA+C;CACxD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAC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"}