1// go-qrcode
2// Copyright 2014 Tom Harwood
3
4package qrcode
5
6import (
7	"log"
8
9	bitset "github.com/skip2/go-qrcode/bitset"
10)
11
12// Error detection/recovery capacity.
13//
14// There are several levels of error detection/recovery capacity. Higher levels
15// of error recovery are able to correct more errors, with the trade-off of
16// increased symbol size.
17type RecoveryLevel int
18
19const (
20	// Level L: 7% error recovery.
21	Low RecoveryLevel = iota
22
23	// Level M: 15% error recovery. Good default choice.
24	Medium
25
26	// Level Q: 25% error recovery.
27	High
28
29	// Level H: 30% error recovery.
30	Highest
31)
32
33// qrCodeVersion describes the data length and encoding order of a single QR
34// Code version. There are 40 versions numbers x 4 recovery levels == 160
35// possible qrCodeVersion structures.
36type qrCodeVersion struct {
37	// Version number (1-40 inclusive).
38	version int
39
40	// Error recovery level.
41	level RecoveryLevel
42
43	dataEncoderType dataEncoderType
44
45	// Encoded data can be split into multiple blocks. Each block contains data
46	// and error recovery bytes.
47	//
48	// Larger QR Codes contain more blocks.
49	block []block
50
51	// Number of bits required to pad the combined data & error correction bit
52	// stream up to the symbol's full capacity.
53	numRemainderBits int
54}
55
56type block struct {
57	numBlocks int
58
59	// Total codewords (numCodewords == numErrorCodewords+numDataCodewords).
60	numCodewords int
61
62	// Number of data codewords.
63	numDataCodewords int
64}
65
66var (
67	versions = []qrCodeVersion{
68		{
69			1,
70			Low,
71			dataEncoderType1To9,
72			[]block{
73				{
74					1,
75					26,
76					19,
77				},
78			},
79			0,
80		},
81		{
82			1,
83			Medium,
84			dataEncoderType1To9,
85			[]block{
86				{
87					1,
88					26,
89					16,
90				},
91			},
92			0,
93		},
94		{
95			1,
96			High,
97			dataEncoderType1To9,
98			[]block{
99				{
100					1,
101					26,
102					13,
103				},
104			},
105			0,
106		},
107		{
108			1,
109			Highest,
110			dataEncoderType1To9,
111			[]block{
112				{
113					1,
114					26,
115					9,
116				},
117			},
118			0,
119		},
120		{
121			2,
122			Low,
123			dataEncoderType1To9,
124			[]block{
125				{
126					1,
127					44,
128					34,
129				},
130			},
131			7,
132		},
133		{
134			2,
135			Medium,
136			dataEncoderType1To9,
137			[]block{
138				{
139					1,
140					44,
141					28,
142				},
143			},
144			7,
145		},
146		{
147			2,
148			High,
149			dataEncoderType1To9,
150			[]block{
151				{
152					1,
153					44,
154					22,
155				},
156			},
157			7,
158		},
159		{
160			2,
161			Highest,
162			dataEncoderType1To9,
163			[]block{
164				{
165					1,
166					44,
167					16,
168				},
169			},
170			7,
171		},
172		{
173			3,
174			Low,
175			dataEncoderType1To9,
176			[]block{
177				{
178					1,
179					70,
180					55,
181				},
182			},
183			7,
184		},
185		{
186			3,
187			Medium,
188			dataEncoderType1To9,
189			[]block{
190				{
191					1,
192					70,
193					44,
194				},
195			},
196			7,
197		},
198		{
199			3,
200			High,
201			dataEncoderType1To9,
202			[]block{
203				{
204					2,
205					35,
206					17,
207				},
208			},
209			7,
210		},
211		{
212			3,
213			Highest,
214			dataEncoderType1To9,
215			[]block{
216				{
217					2,
218					35,
219					13,
220				},
221			},
222			7,
223		},
224		{
225			4,
226			Low,
227			dataEncoderType1To9,
228			[]block{
229				{
230					1,
231					100,
232					80,
233				},
234			},
235			7,
236		},
237		{
238			4,
239			Medium,
240			dataEncoderType1To9,
241			[]block{
242				{
243					2,
244					50,
245					32,
246				},
247			},
248			7,
249		},
250		{
251			4,
252			High,
253			dataEncoderType1To9,
254			[]block{
255				{
256					2,
257					50,
258					24,
259				},
260			},
261			7,
262		},
263		{
264			4,
265			Highest,
266			dataEncoderType1To9,
267			[]block{
268				{
269					4,
270					25,
271					9,
272				},
273			},
274			7,
275		},
276		{
277			5,
278			Low,
279			dataEncoderType1To9,
280			[]block{
281				{
282					1,
283					134,
284					108,
285				},
286			},
287			7,
288		},
289		{
290			5,
291			Medium,
292			dataEncoderType1To9,
293			[]block{
294				{
295					2,
296					67,
297					43,
298				},
299			},
300			7,
301		},
302		{
303			5,
304			High,
305			dataEncoderType1To9,
306			[]block{
307				{
308					2,
309					33,
310					15,
311				},
312				{
313					2,
314					34,
315					16,
316				},
317			},
318			7,
319		},
320		{
321			5,
322			Highest,
323			dataEncoderType1To9,
324			[]block{
325				{
326					2,
327					33,
328					11,
329				},
330				{
331					2,
332					34,
333					12,
334				},
335			},
336			7,
337		},
338		{
339			6,
340			Low,
341			dataEncoderType1To9,
342			[]block{
343				{
344					2,
345					86,
346					68,
347				},
348			},
349			7,
350		},
351		{
352			6,
353			Medium,
354			dataEncoderType1To9,
355			[]block{
356				{
357					4,
358					43,
359					27,
360				},
361			},
362			7,
363		},
364		{
365			6,
366			High,
367			dataEncoderType1To9,
368			[]block{
369				{
370					4,
371					43,
372					19,
373				},
374			},
375			7,
376		},
377		{
378			6,
379			Highest,
380			dataEncoderType1To9,
381			[]block{
382				{
383					4,
384					43,
385					15,
386				},
387			},
388			7,
389		},
390		{
391			7,
392			Low,
393			dataEncoderType1To9,
394			[]block{
395				{
396					2,
397					98,
398					78,
399				},
400			},
401			0,
402		},
403		{
404			7,
405			Medium,
406			dataEncoderType1To9,
407			[]block{
408				{
409					4,
410					49,
411					31,
412				},
413			},
414			0,
415		},
416		{
417			7,
418			High,
419			dataEncoderType1To9,
420			[]block{
421				{
422					2,
423					32,
424					14,
425				},
426				{
427					4,
428					33,
429					15,
430				},
431			},
432			0,
433		},
434		{
435			7,
436			Highest,
437			dataEncoderType1To9,
438			[]block{
439				{
440					4,
441					39,
442					13,
443				},
444				{
445					1,
446					40,
447					14,
448				},
449			},
450			0,
451		},
452		{
453			8,
454			Low,
455			dataEncoderType1To9,
456			[]block{
457				{
458					2,
459					121,
460					97,
461				},
462			},
463			0,
464		},
465		{
466			8,
467			Medium,
468			dataEncoderType1To9,
469			[]block{
470				{
471					2,
472					60,
473					38,
474				},
475				{
476					2,
477					61,
478					39,
479				},
480			},
481			0,
482		},
483		{
484			8,
485			High,
486			dataEncoderType1To9,
487			[]block{
488				{
489					4,
490					40,
491					18,
492				},
493				{
494					2,
495					41,
496					19,
497				},
498			},
499			0,
500		},
501		{
502			8,
503			Highest,
504			dataEncoderType1To9,
505			[]block{
506				{
507					4,
508					40,
509					14,
510				},
511				{
512					2,
513					41,
514					15,
515				},
516			},
517			0,
518		},
519		{
520			9,
521			Low,
522			dataEncoderType1To9,
523			[]block{
524				{
525					2,
526					146,
527					116,
528				},
529			},
530			0,
531		},
532		{
533			9,
534			Medium,
535			dataEncoderType1To9,
536			[]block{
537				{
538					3,
539					58,
540					36,
541				},
542				{
543					2,
544					59,
545					37,
546				},
547			},
548			0,
549		},
550		{
551			9,
552			High,
553			dataEncoderType1To9,
554			[]block{
555				{
556					4,
557					36,
558					16,
559				},
560				{
561					4,
562					37,
563					17,
564				},
565			},
566			0,
567		},
568		{
569			9,
570			Highest,
571			dataEncoderType1To9,
572			[]block{
573				{
574					4,
575					36,
576					12,
577				},
578				{
579					4,
580					37,
581					13,
582				},
583			},
584			0,
585		},
586		{
587			10,
588			Low,
589			dataEncoderType10To26,
590			[]block{
591				{
592					2,
593					86,
594					68,
595				},
596				{
597					2,
598					87,
599					69,
600				},
601			},
602			0,
603		},
604		{
605			10,
606			Medium,
607			dataEncoderType10To26,
608			[]block{
609				{
610					4,
611					69,
612					43,
613				},
614				{
615					1,
616					70,
617					44,
618				},
619			},
620			0,
621		},
622		{
623			10,
624			High,
625			dataEncoderType10To26,
626			[]block{
627				{
628					6,
629					43,
630					19,
631				},
632				{
633					2,
634					44,
635					20,
636				},
637			},
638			0,
639		},
640		{
641			10,
642			Highest,
643			dataEncoderType10To26,
644			[]block{
645				{
646					6,
647					43,
648					15,
649				},
650				{
651					2,
652					44,
653					16,
654				},
655			},
656			0,
657		},
658		{
659			11,
660			Low,
661			dataEncoderType10To26,
662			[]block{
663				{
664					4,
665					101,
666					81,
667				},
668			},
669			0,
670		},
671		{
672			11,
673			Medium,
674			dataEncoderType10To26,
675			[]block{
676				{
677					1,
678					80,
679					50,
680				},
681				{
682					4,
683					81,
684					51,
685				},
686			},
687			0,
688		},
689		{
690			11,
691			High,
692			dataEncoderType10To26,
693			[]block{
694				{
695					4,
696					50,
697					22,
698				},
699				{
700					4,
701					51,
702					23,
703				},
704			},
705			0,
706		},
707		{
708			11,
709			Highest,
710			dataEncoderType10To26,
711			[]block{
712				{
713					3,
714					36,
715					12,
716				},
717				{
718					8,
719					37,
720					13,
721				},
722			},
723			0,
724		},
725		{
726			12,
727			Low,
728			dataEncoderType10To26,
729			[]block{
730				{
731					2,
732					116,
733					92,
734				},
735				{
736					2,
737					117,
738					93,
739				},
740			},
741			0,
742		},
743		{
744			12,
745			Medium,
746			dataEncoderType10To26,
747			[]block{
748				{
749					6,
750					58,
751					36,
752				},
753				{
754					2,
755					59,
756					37,
757				},
758			},
759			0,
760		},
761		{
762			12,
763			High,
764			dataEncoderType10To26,
765			[]block{
766				{
767					4,
768					46,
769					20,
770				},
771				{
772					6,
773					47,
774					21,
775				},
776			},
777			0,
778		},
779		{
780			12,
781			Highest,
782			dataEncoderType10To26,
783			[]block{
784				{
785					7,
786					42,
787					14,
788				},
789				{
790					4,
791					43,
792					15,
793				},
794			},
795			0,
796		},
797		{
798			13,
799			Low,
800			dataEncoderType10To26,
801			[]block{
802				{
803					4,
804					133,
805					107,
806				},
807			},
808			0,
809		},
810		{
811			13,
812			Medium,
813			dataEncoderType10To26,
814			[]block{
815				{
816					8,
817					59,
818					37,
819				},
820				{
821					1,
822					60,
823					38,
824				},
825			},
826			0,
827		},
828		{
829			13,
830			High,
831			dataEncoderType10To26,
832			[]block{
833				{
834					8,
835					44,
836					20,
837				},
838				{
839					4,
840					45,
841					21,
842				},
843			},
844			0,
845		},
846		{
847			13,
848			Highest,
849			dataEncoderType10To26,
850			[]block{
851				{
852					12,
853					33,
854					11,
855				},
856				{
857					4,
858					34,
859					12,
860				},
861			},
862			0,
863		},
864		{
865			14,
866			Low,
867			dataEncoderType10To26,
868			[]block{
869				{
870					3,
871					145,
872					115,
873				},
874				{
875					1,
876					146,
877					116,
878				},
879			},
880			3,
881		},
882		{
883			14,
884			Medium,
885			dataEncoderType10To26,
886			[]block{
887				{
888					4,
889					64,
890					40,
891				},
892				{
893					5,
894					65,
895					41,
896				},
897			},
898			3,
899		},
900		{
901			14,
902			High,
903			dataEncoderType10To26,
904			[]block{
905				{
906					11,
907					36,
908					16,
909				},
910				{
911					5,
912					37,
913					17,
914				},
915			},
916			3,
917		},
918		{
919			14,
920			Highest,
921			dataEncoderType10To26,
922			[]block{
923				{
924					11,
925					36,
926					12,
927				},
928				{
929					5,
930					37,
931					13,
932				},
933			},
934			3,
935		},
936		{
937			15,
938			Low,
939			dataEncoderType10To26,
940			[]block{
941				{
942					5,
943					109,
944					87,
945				},
946				{
947					1,
948					110,
949					88,
950				},
951			},
952			3,
953		},
954		{
955			15,
956			Medium,
957			dataEncoderType10To26,
958			[]block{
959				{
960					5,
961					65,
962					41,
963				},
964				{
965					5,
966					66,
967					42,
968				},
969			},
970			3,
971		},
972		{
973			15,
974			High,
975			dataEncoderType10To26,
976			[]block{
977				{
978					5,
979					54,
980					24,
981				},
982				{
983					7,
984					55,
985					25,
986				},
987			},
988			3,
989		},
990		{
991			15,
992			Highest,
993			dataEncoderType10To26,
994			[]block{
995				{
996					11,
997					36,
998					12,
999				},
1000				{
1001					7,
1002					37,
1003					13,
1004				},
1005			},
1006			3,
1007		},
1008		{
1009			16,
1010			Low,
1011			dataEncoderType10To26,
1012			[]block{
1013				{
1014					5,
1015					122,
1016					98,
1017				},
1018				{
1019					1,
1020					123,
1021					99,
1022				},
1023			},
1024			3,
1025		},
1026		{
1027			16,
1028			Medium,
1029			dataEncoderType10To26,
1030			[]block{
1031				{
1032					7,
1033					73,
1034					45,
1035				},
1036				{
1037					3,
1038					74,
1039					46,
1040				},
1041			},
1042			3,
1043		},
1044		{
1045			16,
1046			High,
1047			dataEncoderType10To26,
1048			[]block{
1049				{
1050					15,
1051					43,
1052					19,
1053				},
1054				{
1055					2,
1056					44,
1057					20,
1058				},
1059			},
1060			3,
1061		},
1062		{
1063			16,
1064			Highest,
1065			dataEncoderType10To26,
1066			[]block{
1067				{
1068					3,
1069					45,
1070					15,
1071				},
1072				{
1073					13,
1074					46,
1075					16,
1076				},
1077			},
1078			3,
1079		},
1080		{
1081			17,
1082			Low,
1083			dataEncoderType10To26,
1084			[]block{
1085				{
1086					1,
1087					135,
1088					107,
1089				},
1090				{
1091					5,
1092					136,
1093					108,
1094				},
1095			},
1096			3,
1097		},
1098		{
1099			17,
1100			Medium,
1101			dataEncoderType10To26,
1102			[]block{
1103				{
1104					10,
1105					74,
1106					46,
1107				},
1108				{
1109					1,
1110					75,
1111					47,
1112				},
1113			},
1114			3,
1115		},
1116		{
1117			17,
1118			High,
1119			dataEncoderType10To26,
1120			[]block{
1121				{
1122					1,
1123					50,
1124					22,
1125				},
1126				{
1127					15,
1128					51,
1129					23,
1130				},
1131			},
1132			3,
1133		},
1134		{
1135			17,
1136			Highest,
1137			dataEncoderType10To26,
1138			[]block{
1139				{
1140					2,
1141					42,
1142					14,
1143				},
1144				{
1145					17,
1146					43,
1147					15,
1148				},
1149			},
1150			3,
1151		},
1152		{
1153			18,
1154			Low,
1155			dataEncoderType10To26,
1156			[]block{
1157				{
1158					5,
1159					150,
1160					120,
1161				},
1162				{
1163					1,
1164					151,
1165					121,
1166				},
1167			},
1168			3,
1169		},
1170		{
1171			18,
1172			Medium,
1173			dataEncoderType10To26,
1174			[]block{
1175				{
1176					9,
1177					69,
1178					43,
1179				},
1180				{
1181					4,
1182					70,
1183					44,
1184				},
1185			},
1186			3,
1187		},
1188		{
1189			18,
1190			High,
1191			dataEncoderType10To26,
1192			[]block{
1193				{
1194					17,
1195					50,
1196					22,
1197				},
1198				{
1199					1,
1200					51,
1201					23,
1202				},
1203			},
1204			3,
1205		},
1206		{
1207			18,
1208			Highest,
1209			dataEncoderType10To26,
1210			[]block{
1211				{
1212					2,
1213					42,
1214					14,
1215				},
1216				{
1217					19,
1218					43,
1219					15,
1220				},
1221			},
1222			3,
1223		},
1224		{
1225			19,
1226			Low,
1227			dataEncoderType10To26,
1228			[]block{
1229				{
1230					3,
1231					141,
1232					113,
1233				},
1234				{
1235					4,
1236					142,
1237					114,
1238				},
1239			},
1240			3,
1241		},
1242		{
1243			19,
1244			Medium,
1245			dataEncoderType10To26,
1246			[]block{
1247				{
1248					3,
1249					70,
1250					44,
1251				},
1252				{
1253					11,
1254					71,
1255					45,
1256				},
1257			},
1258			3,
1259		},
1260		{
1261			19,
1262			High,
1263			dataEncoderType10To26,
1264			[]block{
1265				{
1266					17,
1267					47,
1268					21,
1269				},
1270				{
1271					4,
1272					48,
1273					22,
1274				},
1275			},
1276			3,
1277		},
1278		{
1279			19,
1280			Highest,
1281			dataEncoderType10To26,
1282			[]block{
1283				{
1284					9,
1285					39,
1286					13,
1287				},
1288				{
1289					16,
1290					40,
1291					14,
1292				},
1293			},
1294			3,
1295		},
1296		{
1297			20,
1298			Low,
1299			dataEncoderType10To26,
1300			[]block{
1301				{
1302					3,
1303					135,
1304					107,
1305				},
1306				{
1307					5,
1308					136,
1309					108,
1310				},
1311			},
1312			3,
1313		},
1314		{
1315			20,
1316			Medium,
1317			dataEncoderType10To26,
1318			[]block{
1319				{
1320					3,
1321					67,
1322					41,
1323				},
1324				{
1325					13,
1326					68,
1327					42,
1328				},
1329			},
1330			3,
1331		},
1332		{
1333			20,
1334			High,
1335			dataEncoderType10To26,
1336			[]block{
1337				{
1338					15,
1339					54,
1340					24,
1341				},
1342				{
1343					5,
1344					55,
1345					25,
1346				},
1347			},
1348			3,
1349		},
1350		{
1351			20,
1352			Highest,
1353			dataEncoderType10To26,
1354			[]block{
1355				{
1356					15,
1357					43,
1358					15,
1359				},
1360				{
1361					10,
1362					44,
1363					16,
1364				},
1365			},
1366			3,
1367		},
1368		{
1369			21,
1370			Low,
1371			dataEncoderType10To26,
1372			[]block{
1373				{
1374					4,
1375					144,
1376					116,
1377				},
1378				{
1379					4,
1380					145,
1381					117,
1382				},
1383			},
1384			4,
1385		},
1386		{
1387			21,
1388			Medium,
1389			dataEncoderType10To26,
1390			[]block{
1391				{
1392					17,
1393					68,
1394					42,
1395				},
1396			},
1397			4,
1398		},
1399		{
1400			21,
1401			High,
1402			dataEncoderType10To26,
1403			[]block{
1404				{
1405					17,
1406					50,
1407					22,
1408				},
1409				{
1410					6,
1411					51,
1412					23,
1413				},
1414			},
1415			4,
1416		},
1417		{
1418			21,
1419			Highest,
1420			dataEncoderType10To26,
1421			[]block{
1422				{
1423					19,
1424					46,
1425					16,
1426				},
1427				{
1428					6,
1429					47,
1430					17,
1431				},
1432			},
1433			4,
1434		},
1435		{
1436			22,
1437			Low,
1438			dataEncoderType10To26,
1439			[]block{
1440				{
1441					2,
1442					139,
1443					111,
1444				},
1445				{
1446					7,
1447					140,
1448					112,
1449				},
1450			},
1451			4,
1452		},
1453		{
1454			22,
1455			Medium,
1456			dataEncoderType10To26,
1457			[]block{
1458				{
1459					17,
1460					74,
1461					46,
1462				},
1463			},
1464			4,
1465		},
1466		{
1467			22,
1468			High,
1469			dataEncoderType10To26,
1470			[]block{
1471				{
1472					7,
1473					54,
1474					24,
1475				},
1476				{
1477					16,
1478					55,
1479					25,
1480				},
1481			},
1482			4,
1483		},
1484		{
1485			22,
1486			Highest,
1487			dataEncoderType10To26,
1488			[]block{
1489				{
1490					34,
1491					37,
1492					13,
1493				},
1494			},
1495			4,
1496		},
1497		{
1498			23,
1499			Low,
1500			dataEncoderType10To26,
1501			[]block{
1502				{
1503					4,
1504					151,
1505					121,
1506				},
1507				{
1508					5,
1509					152,
1510					122,
1511				},
1512			},
1513			4,
1514		},
1515		{
1516			23,
1517			Medium,
1518			dataEncoderType10To26,
1519			[]block{
1520				{
1521					4,
1522					75,
1523					47,
1524				},
1525				{
1526					14,
1527					76,
1528					48,
1529				},
1530			},
1531			4,
1532		},
1533		{
1534			23,
1535			High,
1536			dataEncoderType10To26,
1537			[]block{
1538				{
1539					11,
1540					54,
1541					24,
1542				},
1543				{
1544					14,
1545					55,
1546					25,
1547				},
1548			},
1549			4,
1550		},
1551		{
1552			23,
1553			Highest,
1554			dataEncoderType10To26,
1555			[]block{
1556				{
1557					16,
1558					45,
1559					15,
1560				},
1561				{
1562					14,
1563					46,
1564					16,
1565				},
1566			},
1567			4,
1568		},
1569		{
1570			24,
1571			Low,
1572			dataEncoderType10To26,
1573			[]block{
1574				{
1575					6,
1576					147,
1577					117,
1578				},
1579				{
1580					4,
1581					148,
1582					118,
1583				},
1584			},
1585			4,
1586		},
1587		{
1588			24,
1589			Medium,
1590			dataEncoderType10To26,
1591			[]block{
1592				{
1593					6,
1594					73,
1595					45,
1596				},
1597				{
1598					14,
1599					74,
1600					46,
1601				},
1602			},
1603			4,
1604		},
1605		{
1606			24,
1607			High,
1608			dataEncoderType10To26,
1609			[]block{
1610				{
1611					11,
1612					54,
1613					24,
1614				},
1615				{
1616					16,
1617					55,
1618					25,
1619				},
1620			},
1621			4,
1622		},
1623		{
1624			24,
1625			Highest,
1626			dataEncoderType10To26,
1627			[]block{
1628				{
1629					30,
1630					46,
1631					16,
1632				},
1633				{
1634					2,
1635					47,
1636					17,
1637				},
1638			},
1639			4,
1640		},
1641		{
1642			25,
1643			Low,
1644			dataEncoderType10To26,
1645			[]block{
1646				{
1647					8,
1648					132,
1649					106,
1650				},
1651				{
1652					4,
1653					133,
1654					107,
1655				},
1656			},
1657			4,
1658		},
1659		{
1660			25,
1661			Medium,
1662			dataEncoderType10To26,
1663			[]block{
1664				{
1665					8,
1666					75,
1667					47,
1668				},
1669				{
1670					13,
1671					76,
1672					48,
1673				},
1674			},
1675			4,
1676		},
1677		{
1678			25,
1679			High,
1680			dataEncoderType10To26,
1681			[]block{
1682				{
1683					7,
1684					54,
1685					24,
1686				},
1687				{
1688					22,
1689					55,
1690					25,
1691				},
1692			},
1693			4,
1694		},
1695		{
1696			25,
1697			Highest,
1698			dataEncoderType10To26,
1699			[]block{
1700				{
1701					22,
1702					45,
1703					15,
1704				},
1705				{
1706					13,
1707					46,
1708					16,
1709				},
1710			},
1711			4,
1712		},
1713		{
1714			26,
1715			Low,
1716			dataEncoderType10To26,
1717			[]block{
1718				{
1719					10,
1720					142,
1721					114,
1722				},
1723				{
1724					2,
1725					143,
1726					115,
1727				},
1728			},
1729			4,
1730		},
1731		{
1732			26,
1733			Medium,
1734			dataEncoderType10To26,
1735			[]block{
1736				{
1737					19,
1738					74,
1739					46,
1740				},
1741				{
1742					4,
1743					75,
1744					47,
1745				},
1746			},
1747			4,
1748		},
1749		{
1750			26,
1751			High,
1752			dataEncoderType10To26,
1753			[]block{
1754				{
1755					28,
1756					50,
1757					22,
1758				},
1759				{
1760					6,
1761					51,
1762					23,
1763				},
1764			},
1765			4,
1766		},
1767		{
1768			26,
1769			Highest,
1770			dataEncoderType10To26,
1771			[]block{
1772				{
1773					33,
1774					46,
1775					16,
1776				},
1777				{
1778					4,
1779					47,
1780					17,
1781				},
1782			},
1783			4,
1784		},
1785		{
1786			27,
1787			Low,
1788			dataEncoderType27To40,
1789			[]block{
1790				{
1791					8,
1792					152,
1793					122,
1794				},
1795				{
1796					4,
1797					153,
1798					123,
1799				},
1800			},
1801			4,
1802		},
1803		{
1804			27,
1805			Medium,
1806			dataEncoderType27To40,
1807			[]block{
1808				{
1809					22,
1810					73,
1811					45,
1812				},
1813				{
1814					3,
1815					74,
1816					46,
1817				},
1818			},
1819			4,
1820		},
1821		{
1822			27,
1823			High,
1824			dataEncoderType27To40,
1825			[]block{
1826				{
1827					8,
1828					53,
1829					23,
1830				},
1831				{
1832					26,
1833					54,
1834					24,
1835				},
1836			},
1837			4,
1838		},
1839		{
1840			27,
1841			Highest,
1842			dataEncoderType27To40,
1843			[]block{
1844				{
1845					12,
1846					45,
1847					15,
1848				},
1849				{
1850					28,
1851					46,
1852					16,
1853				},
1854			},
1855			4,
1856		},
1857		{
1858			28,
1859			Low,
1860			dataEncoderType27To40,
1861			[]block{
1862				{
1863					3,
1864					147,
1865					117,
1866				},
1867				{
1868					10,
1869					148,
1870					118,
1871				},
1872			},
1873			3,
1874		},
1875		{
1876			28,
1877			Medium,
1878			dataEncoderType27To40,
1879			[]block{
1880				{
1881					3,
1882					73,
1883					45,
1884				},
1885				{
1886					23,
1887					74,
1888					46,
1889				},
1890			},
1891			3,
1892		},
1893		{
1894			28,
1895			High,
1896			dataEncoderType27To40,
1897			[]block{
1898				{
1899					4,
1900					54,
1901					24,
1902				},
1903				{
1904					31,
1905					55,
1906					25,
1907				},
1908			},
1909			3,
1910		},
1911		{
1912			28,
1913			Highest,
1914			dataEncoderType27To40,
1915			[]block{
1916				{
1917					11,
1918					45,
1919					15,
1920				},
1921				{
1922					31,
1923					46,
1924					16,
1925				},
1926			},
1927			3,
1928		},
1929		{
1930			29,
1931			Low,
1932			dataEncoderType27To40,
1933			[]block{
1934				{
1935					7,
1936					146,
1937					116,
1938				},
1939				{
1940					7,
1941					147,
1942					117,
1943				},
1944			},
1945			3,
1946		},
1947		{
1948			29,
1949			Medium,
1950			dataEncoderType27To40,
1951			[]block{
1952				{
1953					21,
1954					73,
1955					45,
1956				},
1957				{
1958					7,
1959					74,
1960					46,
1961				},
1962			},
1963			3,
1964		},
1965		{
1966			29,
1967			High,
1968			dataEncoderType27To40,
1969			[]block{
1970				{
1971					1,
1972					53,
1973					23,
1974				},
1975				{
1976					37,
1977					54,
1978					24,
1979				},
1980			},
1981			3,
1982		},
1983		{
1984			29,
1985			Highest,
1986			dataEncoderType27To40,
1987			[]block{
1988				{
1989					19,
1990					45,
1991					15,
1992				},
1993				{
1994					26,
1995					46,
1996					16,
1997				},
1998			},
1999			3,
2000		},
2001		{
2002			30,
2003			Low,
2004			dataEncoderType27To40,
2005			[]block{
2006				{
2007					5,
2008					145,
2009					115,
2010				},
2011				{
2012					10,
2013					146,
2014					116,
2015				},
2016			},
2017			3,
2018		},
2019		{
2020			30,
2021			Medium,
2022			dataEncoderType27To40,
2023			[]block{
2024				{
2025					19,
2026					75,
2027					47,
2028				},
2029				{
2030					10,
2031					76,
2032					48,
2033				},
2034			},
2035			3,
2036		},
2037		{
2038			30,
2039			High,
2040			dataEncoderType27To40,
2041			[]block{
2042				{
2043					15,
2044					54,
2045					24,
2046				},
2047				{
2048					25,
2049					55,
2050					25,
2051				},
2052			},
2053			3,
2054		},
2055		{
2056			30,
2057			Highest,
2058			dataEncoderType27To40,
2059			[]block{
2060				{
2061					23,
2062					45,
2063					15,
2064				},
2065				{
2066					25,
2067					46,
2068					16,
2069				},
2070			},
2071			3,
2072		},
2073		{
2074			31,
2075			Low,
2076			dataEncoderType27To40,
2077			[]block{
2078				{
2079					13,
2080					145,
2081					115,
2082				},
2083				{
2084					3,
2085					146,
2086					116,
2087				},
2088			},
2089			3,
2090		},
2091		{
2092			31,
2093			Medium,
2094			dataEncoderType27To40,
2095			[]block{
2096				{
2097					2,
2098					74,
2099					46,
2100				},
2101				{
2102					29,
2103					75,
2104					47,
2105				},
2106			},
2107			3,
2108		},
2109		{
2110			31,
2111			High,
2112			dataEncoderType27To40,
2113			[]block{
2114				{
2115					42,
2116					54,
2117					24,
2118				},
2119				{
2120					1,
2121					55,
2122					25,
2123				},
2124			},
2125			3,
2126		},
2127		{
2128			31,
2129			Highest,
2130			dataEncoderType27To40,
2131			[]block{
2132				{
2133					23,
2134					45,
2135					15,
2136				},
2137				{
2138					28,
2139					46,
2140					16,
2141				},
2142			},
2143			3,
2144		},
2145		{
2146			32,
2147			Low,
2148			dataEncoderType27To40,
2149			[]block{
2150				{
2151					17,
2152					145,
2153					115,
2154				},
2155			},
2156			3,
2157		},
2158		{
2159			32,
2160			Medium,
2161			dataEncoderType27To40,
2162			[]block{
2163				{
2164					10,
2165					74,
2166					46,
2167				},
2168				{
2169					23,
2170					75,
2171					47,
2172				},
2173			},
2174			3,
2175		},
2176		{
2177			32,
2178			High,
2179			dataEncoderType27To40,
2180			[]block{
2181				{
2182					10,
2183					54,
2184					24,
2185				},
2186				{
2187					35,
2188					55,
2189					25,
2190				},
2191			},
2192			3,
2193		},
2194		{
2195			32,
2196			Highest,
2197			dataEncoderType27To40,
2198			[]block{
2199				{
2200					19,
2201					45,
2202					15,
2203				},
2204				{
2205					35,
2206					46,
2207					16,
2208				},
2209			},
2210			3,
2211		},
2212		{
2213			33,
2214			Low,
2215			dataEncoderType27To40,
2216			[]block{
2217				{
2218					17,
2219					145,
2220					115,
2221				},
2222				{
2223					1,
2224					146,
2225					116,
2226				},
2227			},
2228			3,
2229		},
2230		{
2231			33,
2232			Medium,
2233			dataEncoderType27To40,
2234			[]block{
2235				{
2236					14,
2237					74,
2238					46,
2239				},
2240				{
2241					21,
2242					75,
2243					47,
2244				},
2245			},
2246			3,
2247		},
2248		{
2249			33,
2250			High,
2251			dataEncoderType27To40,
2252			[]block{
2253				{
2254					29,
2255					54,
2256					24,
2257				},
2258				{
2259					19,
2260					55,
2261					25,
2262				},
2263			},
2264			3,
2265		},
2266		{
2267			33,
2268			Highest,
2269			dataEncoderType27To40,
2270			[]block{
2271				{
2272					11,
2273					45,
2274					15,
2275				},
2276				{
2277					46,
2278					46,
2279					16,
2280				},
2281			},
2282			3,
2283		},
2284		{
2285			34,
2286			Low,
2287			dataEncoderType27To40,
2288			[]block{
2289				{
2290					13,
2291					145,
2292					115,
2293				},
2294				{
2295					6,
2296					146,
2297					116,
2298				},
2299			},
2300			3,
2301		},
2302		{
2303			34,
2304			Medium,
2305			dataEncoderType27To40,
2306			[]block{
2307				{
2308					14,
2309					74,
2310					46,
2311				},
2312				{
2313					23,
2314					75,
2315					47,
2316				},
2317			},
2318			3,
2319		},
2320		{
2321			34,
2322			High,
2323			dataEncoderType27To40,
2324			[]block{
2325				{
2326					44,
2327					54,
2328					24,
2329				},
2330				{
2331					7,
2332					55,
2333					25,
2334				},
2335			},
2336			3,
2337		},
2338		{
2339			34,
2340			Highest,
2341			dataEncoderType27To40,
2342			[]block{
2343				{
2344					59,
2345					46,
2346					16,
2347				},
2348				{
2349					1,
2350					47,
2351					17,
2352				},
2353			},
2354			3,
2355		},
2356		{
2357			35,
2358			Low,
2359			dataEncoderType27To40,
2360			[]block{
2361				{
2362					12,
2363					151,
2364					121,
2365				},
2366				{
2367					7,
2368					152,
2369					122,
2370				},
2371			},
2372			0,
2373		},
2374		{
2375			35,
2376			Medium,
2377			dataEncoderType27To40,
2378			[]block{
2379				{
2380					12,
2381					75,
2382					47,
2383				},
2384				{
2385					26,
2386					76,
2387					48,
2388				},
2389			},
2390			0,
2391		},
2392		{
2393			35,
2394			High,
2395			dataEncoderType27To40,
2396			[]block{
2397				{
2398					39,
2399					54,
2400					24,
2401				},
2402				{
2403					14,
2404					55,
2405					25,
2406				},
2407			},
2408			0,
2409		},
2410		{
2411			35,
2412			Highest,
2413			dataEncoderType27To40,
2414			[]block{
2415				{
2416					22,
2417					45,
2418					15,
2419				},
2420				{
2421					41,
2422					46,
2423					16,
2424				},
2425			},
2426			0,
2427		},
2428		{
2429			36,
2430			Low,
2431			dataEncoderType27To40,
2432			[]block{
2433				{
2434					6,
2435					151,
2436					121,
2437				},
2438				{
2439					14,
2440					152,
2441					122,
2442				},
2443			},
2444			0,
2445		},
2446		{
2447			36,
2448			Medium,
2449			dataEncoderType27To40,
2450			[]block{
2451				{
2452					6,
2453					75,
2454					47,
2455				},
2456				{
2457					34,
2458					76,
2459					48,
2460				},
2461			},
2462			0,
2463		},
2464		{
2465			36,
2466			High,
2467			dataEncoderType27To40,
2468			[]block{
2469				{
2470					46,
2471					54,
2472					24,
2473				},
2474				{
2475					10,
2476					55,
2477					25,
2478				},
2479			},
2480			0,
2481		},
2482		{
2483			36,
2484			Highest,
2485			dataEncoderType27To40,
2486			[]block{
2487				{
2488					2,
2489					45,
2490					15,
2491				},
2492				{
2493					64,
2494					46,
2495					16,
2496				},
2497			},
2498			0,
2499		},
2500		{
2501			37,
2502			Low,
2503			dataEncoderType27To40,
2504			[]block{
2505				{
2506					17,
2507					152,
2508					122,
2509				},
2510				{
2511					4,
2512					153,
2513					123,
2514				},
2515			},
2516			0,
2517		},
2518		{
2519			37,
2520			Medium,
2521			dataEncoderType27To40,
2522			[]block{
2523				{
2524					29,
2525					74,
2526					46,
2527				},
2528				{
2529					14,
2530					75,
2531					47,
2532				},
2533			},
2534			0,
2535		},
2536		{
2537			37,
2538			High,
2539			dataEncoderType27To40,
2540			[]block{
2541				{
2542					49,
2543					54,
2544					24,
2545				},
2546				{
2547					10,
2548					55,
2549					25,
2550				},
2551			},
2552			0,
2553		},
2554		{
2555			37,
2556			Highest,
2557			dataEncoderType27To40,
2558			[]block{
2559				{
2560					24,
2561					45,
2562					15,
2563				},
2564				{
2565					46,
2566					46,
2567					16,
2568				},
2569			},
2570			0,
2571		},
2572		{
2573			38,
2574			Low,
2575			dataEncoderType27To40,
2576			[]block{
2577				{
2578					4,
2579					152,
2580					122,
2581				},
2582				{
2583					18,
2584					153,
2585					123,
2586				},
2587			},
2588			0,
2589		},
2590		{
2591			38,
2592			Medium,
2593			dataEncoderType27To40,
2594			[]block{
2595				{
2596					13,
2597					74,
2598					46,
2599				},
2600				{
2601					32,
2602					75,
2603					47,
2604				},
2605			},
2606			0,
2607		},
2608		{
2609			38,
2610			High,
2611			dataEncoderType27To40,
2612			[]block{
2613				{
2614					48,
2615					54,
2616					24,
2617				},
2618				{
2619					14,
2620					55,
2621					25,
2622				},
2623			},
2624			0,
2625		},
2626		{
2627			38,
2628			Highest,
2629			dataEncoderType27To40,
2630			[]block{
2631				{
2632					42,
2633					45,
2634					15,
2635				},
2636				{
2637					32,
2638					46,
2639					16,
2640				},
2641			},
2642			0,
2643		},
2644		{
2645			39,
2646			Low,
2647			dataEncoderType27To40,
2648			[]block{
2649				{
2650					20,
2651					147,
2652					117,
2653				},
2654				{
2655					4,
2656					148,
2657					118,
2658				},
2659			},
2660			0,
2661		},
2662		{
2663			39,
2664			Medium,
2665			dataEncoderType27To40,
2666			[]block{
2667				{
2668					40,
2669					75,
2670					47,
2671				},
2672				{
2673					7,
2674					76,
2675					48,
2676				},
2677			},
2678			0,
2679		},
2680		{
2681			39,
2682			High,
2683			dataEncoderType27To40,
2684			[]block{
2685				{
2686					43,
2687					54,
2688					24,
2689				},
2690				{
2691					22,
2692					55,
2693					25,
2694				},
2695			},
2696			0,
2697		},
2698		{
2699			39,
2700			Highest,
2701			dataEncoderType27To40,
2702			[]block{
2703				{
2704					10,
2705					45,
2706					15,
2707				},
2708				{
2709					67,
2710					46,
2711					16,
2712				},
2713			},
2714			0,
2715		},
2716		{
2717			40,
2718			Low,
2719			dataEncoderType27To40,
2720			[]block{
2721				{
2722					19,
2723					148,
2724					118,
2725				},
2726				{
2727					6,
2728					149,
2729					119,
2730				},
2731			},
2732			0,
2733		},
2734		{
2735			40,
2736			Medium,
2737			dataEncoderType27To40,
2738			[]block{
2739				{
2740					18,
2741					75,
2742					47,
2743				},
2744				{
2745					31,
2746					76,
2747					48,
2748				},
2749			},
2750			0,
2751		},
2752		{
2753			40,
2754			High,
2755			dataEncoderType27To40,
2756			[]block{
2757				{
2758					34,
2759					54,
2760					24,
2761				},
2762				{
2763					34,
2764					55,
2765					25,
2766				},
2767			},
2768			0,
2769		},
2770		{
2771			40,
2772			Highest,
2773			dataEncoderType27To40,
2774			[]block{
2775				{
2776					20,
2777					45,
2778					15,
2779				},
2780				{
2781					61,
2782					46,
2783					16,
2784				},
2785			},
2786			0,
2787		},
2788	}
2789)
2790
2791var (
2792	// Each QR Code contains a 15-bit Format Information value.  The 15 bits
2793	// consist of 5 data bits concatenated with 10 error correction bits.
2794	//
2795	// The 5 data bits consist of:
2796	// - 2 bits for the error correction level (L=01, M=00, G=11, H=10).
2797	// - 3 bits for the data mask pattern identifier.
2798	//
2799	// formatBitSequence is a mapping from the 5 data bits to the completed 15-bit
2800	// Format Information value.
2801	//
2802	// For example, a QR Code using error correction level L, and data mask
2803	// pattern identifier 001:
2804	//
2805	// 01 | 001 = 01001 = 0x9
2806	// formatBitSequence[0x9].qrCode = 0x72f3 = 111001011110011
2807	formatBitSequence = []struct {
2808		regular uint32
2809		micro   uint32
2810	}{
2811		{0x5412, 0x4445},
2812		{0x5125, 0x4172},
2813		{0x5e7c, 0x4e2b},
2814		{0x5b4b, 0x4b1c},
2815		{0x45f9, 0x55ae},
2816		{0x40ce, 0x5099},
2817		{0x4f97, 0x5fc0},
2818		{0x4aa0, 0x5af7},
2819		{0x77c4, 0x6793},
2820		{0x72f3, 0x62a4},
2821		{0x7daa, 0x6dfd},
2822		{0x789d, 0x68ca},
2823		{0x662f, 0x7678},
2824		{0x6318, 0x734f},
2825		{0x6c41, 0x7c16},
2826		{0x6976, 0x7921},
2827		{0x1689, 0x06de},
2828		{0x13be, 0x03e9},
2829		{0x1ce7, 0x0cb0},
2830		{0x19d0, 0x0987},
2831		{0x0762, 0x1735},
2832		{0x0255, 0x1202},
2833		{0x0d0c, 0x1d5b},
2834		{0x083b, 0x186c},
2835		{0x355f, 0x2508},
2836		{0x3068, 0x203f},
2837		{0x3f31, 0x2f66},
2838		{0x3a06, 0x2a51},
2839		{0x24b4, 0x34e3},
2840		{0x2183, 0x31d4},
2841		{0x2eda, 0x3e8d},
2842		{0x2bed, 0x3bba},
2843	}
2844
2845	// QR Codes version 7 and higher contain an 18-bit Version Information value,
2846	// consisting of a 6 data bits and 12 error correction bits.
2847	//
2848	// versionBitSequence is a mapping from QR Code version to the completed
2849	// 18-bit Version Information value.
2850	//
2851	// For example, a QR code of version 7:
2852	// versionBitSequence[0x7] = 0x07c94 = 000111110010010100
2853	versionBitSequence = []uint32{
2854		0x00000,
2855		0x00000,
2856		0x00000,
2857		0x00000,
2858		0x00000,
2859		0x00000,
2860		0x00000,
2861		0x07c94,
2862		0x085bc,
2863		0x09a99,
2864		0x0a4d3,
2865		0x0bbf6,
2866		0x0c762,
2867		0x0d847,
2868		0x0e60d,
2869		0x0f928,
2870		0x10b78,
2871		0x1145d,
2872		0x12a17,
2873		0x13532,
2874		0x149a6,
2875		0x15683,
2876		0x168c9,
2877		0x177ec,
2878		0x18ec4,
2879		0x191e1,
2880		0x1afab,
2881		0x1b08e,
2882		0x1cc1a,
2883		0x1d33f,
2884		0x1ed75,
2885		0x1f250,
2886		0x209d5,
2887		0x216f0,
2888		0x228ba,
2889		0x2379f,
2890		0x24b0b,
2891		0x2542e,
2892		0x26a64,
2893		0x27541,
2894		0x28c69,
2895	}
2896)
2897
2898const (
2899	formatInfoLengthBits  = 15
2900	versionInfoLengthBits = 18
2901)
2902
2903// formatInfo returns the 15-bit Format Information value for a QR
2904// code.
2905func (v qrCodeVersion) formatInfo(maskPattern int) *bitset.Bitset {
2906	formatID := 0
2907
2908	switch v.level {
2909	case Low:
2910		formatID = 0x08 // 0b01000
2911	case Medium:
2912		formatID = 0x00 // 0b00000
2913	case High:
2914		formatID = 0x18 // 0b11000
2915	case Highest:
2916		formatID = 0x10 // 0b10000
2917	default:
2918		log.Panicf("Invalid level %d", v.level)
2919	}
2920
2921	if maskPattern < 0 || maskPattern > 7 {
2922		log.Panicf("Invalid maskPattern %d", maskPattern)
2923	}
2924
2925	formatID |= maskPattern & 0x7
2926
2927	result := bitset.New()
2928
2929	result.AppendUint32(formatBitSequence[formatID].regular, formatInfoLengthBits)
2930
2931	return result
2932}
2933
2934// versionInfo returns the 18-bit Version Information value for a QR Code.
2935//
2936// Version Information is applicable only to QR Codes versions 7-40 inclusive.
2937// nil is returned if Version Information is not required.
2938func (v qrCodeVersion) versionInfo() *bitset.Bitset {
2939	if v.version < 7 {
2940		return nil
2941	}
2942
2943	result := bitset.New()
2944	result.AppendUint32(versionBitSequence[v.version], 18)
2945
2946	return result
2947}
2948
2949// numDataBits returns the data capacity in bits.
2950func (v qrCodeVersion) numDataBits() int {
2951	numDataBits := 0
2952	for _, b := range v.block {
2953		numDataBits += 8 * b.numBlocks * b.numDataCodewords // 8 bits in a byte
2954	}
2955
2956	return numDataBits
2957}
2958
2959// chooseQRCodeVersion chooses the most suitable QR Code version for a stated
2960// data length in bits, the error recovery level required, and the data encoder
2961// used.
2962//
2963// The chosen QR Code version is the smallest version able to fit numDataBits
2964// and the optional terminator bits required by the specified encoder.
2965//
2966// On success the chosen QR Code version is returned.
2967func chooseQRCodeVersion(level RecoveryLevel, encoder *dataEncoder, numDataBits int) *qrCodeVersion {
2968	var chosenVersion *qrCodeVersion
2969
2970	for _, v := range versions {
2971		if v.level != level {
2972			continue
2973		} else if v.version < encoder.minVersion {
2974			continue
2975		} else if v.version > encoder.maxVersion {
2976			break
2977		}
2978
2979		numFreeBits := v.numDataBits() - numDataBits
2980
2981		if numFreeBits >= 0 {
2982			chosenVersion = &v
2983			break
2984		}
2985	}
2986
2987	return chosenVersion
2988}
2989
2990func (v qrCodeVersion) numTerminatorBitsRequired(numDataBits int) int {
2991	numFreeBits := v.numDataBits() - numDataBits
2992
2993	var numTerminatorBits int
2994
2995	switch {
2996	case numFreeBits >= 4:
2997		numTerminatorBits = 4
2998	default:
2999		numTerminatorBits = numFreeBits
3000	}
3001
3002	return numTerminatorBits
3003}
3004
3005// numBlocks returns the number of blocks.
3006func (v qrCodeVersion) numBlocks() int {
3007	numBlocks := 0
3008
3009	for _, b := range v.block {
3010		numBlocks += b.numBlocks
3011	}
3012
3013	return numBlocks
3014}
3015
3016// numBitsToPadToCodeword returns the number of bits required to pad data of
3017// length numDataBits upto the nearest codeword size.
3018func (v qrCodeVersion) numBitsToPadToCodeword(numDataBits int) int {
3019	if numDataBits == v.numDataBits() {
3020		return 0
3021	}
3022
3023	return (8 - numDataBits%8) % 8
3024}
3025
3026// symbolSize returns the size of the QR Code symbol in number of modules (which
3027// is both the width and height, since QR codes are square). The QR Code has
3028// size symbolSize() x symbolSize() pixels. This does not include the quiet
3029// zone.
3030func (v qrCodeVersion) symbolSize() int {
3031	return 21 + (v.version-1)*4
3032}
3033
3034// quietZoneSize returns the number of pixels of border space on each side of
3035// the QR Code. The quiet space assists with decoding.
3036func (v qrCodeVersion) quietZoneSize() int {
3037	return 4
3038}
3039
3040// getQRCodeVersion returns the QR Code version by version number and recovery
3041// level. Returns nil if the requested combination is not defined.
3042func getQRCodeVersion(level RecoveryLevel, version int) *qrCodeVersion {
3043	for _, v := range versions {
3044		if v.level == level && v.version == version {
3045			return &v
3046		}
3047	}
3048
3049	return nil
3050}
3051