1 String.prototype.hashCode = function () {
 2     var hash = 0;
 3     if (this.length === 0) return hash;
 4     for (var i = 0; i < this.length; i++) {
 5         var char = this.charCodeAt(i);
 6         hash = ((hash << 5) - hash) + char;
 7         hash = hash & hash;
 8     }
 9     return hash;
10 };
11 
12 const rootPackageColor = "darkred";
13 const invalidPackageColor = "snow";
14 const packageJavaValueLMax = 80;
15 const packageJavaValueL = 65;
16 const packageJavaHslHSValues = [184, 10];
17 const packageSunValueLMax = 54;
18 const packageSunValueL = 31;
19 const packageSunHSValues = [211, 21];
20 const packageComSunValueLMax = 55;
21 const packageComSunValueL = 45;
22 const packageComSunHSValues = [204, 5];
23 const packageRestValueHMax = 360;
24 const packageRestValueH = 0;
25 const packageRestSLValues = [42, 53];
26 const packageConsideredDepth = 3;
27 const packageMarkerJava = "java";
28 const packageMarkerSun = "sun";
29 const packageMarkerComSun = "comSun";
30 const packageMarkerRest = "rest";
31 const packagesIdentifierMap = new Map().set("java.", packageMarkerJava).set("sun.", packageMarkerSun)
32     .set("com.sun.", packageMarkerComSun);
33 const packageColorMap = new Map().set("", rootPackageColor);
34 
35 const colorByPackage = function (p) {
36     if (p === undefined) {
37         return invalidPackageColor;
38     } else {
39         const packageNameStrip = stripPackageName(p);
40         const packageSelectedColor = packageColorMap.get(packageNameStrip);
41         if (packageSelectedColor === undefined) {
42             const packageMarkerSelected = getPackageMarker(packageNameStrip);
43             const packageNameStripHash = packageNameStrip.hashCode();
44             switch (packageMarkerSelected) {
45                 case packageMarkerJava:
46                     const packageJavaSelectedColor = createHslColorString(packageJavaHslHSValues[0], packageJavaHslHSValues[1], adjustHslPropertyByHash(packageNameStripHash, packageJavaValueL, packageJavaValueLMax));
47                     packageColorMap.set(packageNameStrip, packageJavaSelectedColor);
48                     break;
49                 case packageMarkerComSun:
50                     const packageComSunSelectedColor = createHslColorString(packageComSunHSValues[0], packageComSunHSValues[1], adjustHslPropertyByHash(packageNameStripHash, packageComSunValueL, packageComSunValueLMax));
51                     packageColorMap.set(packageNameStrip, packageComSunSelectedColor);
52                     break;
53                 case packageMarkerSun:
54                     const packageSunSelectedColor = createHslColorString(packageSunHSValues[0], packageSunHSValues[1], adjustHslPropertyByHash(packageNameStripHash, packageSunValueL, packageSunValueLMax));
55                     packageColorMap.set(packageNameStrip, packageSunSelectedColor);
56                     break;
57                 case packageMarkerRest:
58                     const packageRestSelectedColor = createHslColorString(adjustHslPropertyByHash(packageNameStripHash, packageRestValueH, packageRestValueHMax), packageRestSLValues[0], packageRestSLValues[1]);
59                     packageColorMap.set(packageNameStrip, packageRestSelectedColor);
60                     break;
61             }
62             return packageColorMap.get(packageNameStrip);
63         } else {
64             return packageSelectedColor;
65         }
66     }
67 };
68 
69 const getPackageMarker = function(p){
70     for(let k of packagesIdentifierMap.keys()){
71         if(p.startsWith(k)){
72             return packagesIdentifierMap.get(k);
73         }
74     }
75     return packageMarkerRest;
76 };
77 
78 const stripPackageName = function (p) {
79     const splitString = p.split("\u002E");
80     const number = Math.min(splitString.length, packageConsideredDepth);
81     return splitString.slice(0, number).join("\u002E");
82 };
83 
84 const adjustHslPropertyByHash = function (hash, min, max) {
85 	const proposedValue = hash % (max - min) + min;
86 	return Math.min(proposedValue, max);
87 };
88 
89 const createHslColorString = function(h,s,l){
90     return "hsl\u0028" + h + "\u002c " + s + "\u0025\u002c " + l + "\u0025\u0029";
91 };
92 
93 const colorCell = function (d) {
94     return colorByPackage(d.data.p);
95 };
96 
97 const adjustTip = function (d) {
98 	return d.data.n + "\u003Cbr\u002F\u003Epackage: " + d.data.p + "\u003Cbr\u002F\u003Esamples: " + d.data.v;
99 };