import { IPublicSuffix, ISuffixLookupOptions } from './interface'; export default function ( hostname: string, options: ISuffixLookupOptions, out: IPublicSuffix, ): boolean { // Fast path for very popular suffixes; this allows to by-pass lookup // completely as well as any extra allocation or string manipulation. if (!options.allowPrivateDomains && hostname.length > 3) { const last: number = hostname.length - 1; const c3: number = hostname.charCodeAt(last); const c2: number = hostname.charCodeAt(last - 1); const c1: number = hostname.charCodeAt(last - 2); const c0: number = hostname.charCodeAt(last - 3); if ( c3 === 109 /* 'm' */ && c2 === 111 /* 'o' */ && c1 === 99 /* 'c' */ && c0 === 46 /* '.' */ ) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'com'; return true; } else if ( c3 === 103 /* 'g' */ && c2 === 114 /* 'r' */ && c1 === 111 /* 'o' */ && c0 === 46 /* '.' */ ) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'org'; return true; } else if ( c3 === 117 /* 'u' */ && c2 === 100 /* 'd' */ && c1 === 101 /* 'e' */ && c0 === 46 /* '.' */ ) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'edu'; return true; } else if ( c3 === 118 /* 'v' */ && c2 === 111 /* 'o' */ && c1 === 103 /* 'g' */ && c0 === 46 /* '.' */ ) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'gov'; return true; } else if ( c3 === 116 /* 't' */ && c2 === 101 /* 'e' */ && c1 === 110 /* 'n' */ && c0 === 46 /* '.' */ ) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'net'; return true; } else if ( c3 === 101 /* 'e' */ && c2 === 100 /* 'd' */ && c1 === 46 /* '.' */ ) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'de'; return true; } } return false; }