From 52a1d59ddd1cd8cd1cbb2138c012ba40944850d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20L=2E=20H=2E-F?= Date: Mon, 9 Jan 2023 23:38:48 +0100 Subject: [PATCH] Add source code --- .gitignore | 1 + assets/css/bootstrap.min.css | 6 + assets/css/style.css | 502 +++ .../fonts/varela-round-v19-latin-regular.eot | Bin 0 -> 23800 bytes .../fonts/varela-round-v19-latin-regular.svg | 453 +++ .../fonts/varela-round-v19-latin-regular.ttf | Bin 0 -> 53112 bytes .../fonts/varela-round-v19-latin-regular.woff | Bin 0 -> 25564 bytes .../varela-round-v19-latin-regular.woff2 | Bin 0 -> 20636 bytes assets/img/android-chrome-144x144.png | Bin 0 -> 4554 bytes assets/img/android-chrome-192x192.png | Bin 0 -> 7372 bytes assets/img/android-chrome-36x36.png | Bin 0 -> 991 bytes assets/img/android-chrome-48x48.png | Bin 0 -> 1409 bytes assets/img/android-chrome-72x72.png | Bin 0 -> 2119 bytes assets/img/android-chrome-96x96.png | Bin 0 -> 2912 bytes assets/img/apple-touch-icon-120x120.png | Bin 0 -> 3764 bytes assets/img/apple-touch-icon-152x152.png | Bin 0 -> 5135 bytes assets/img/apple-touch-icon-180x180.png | Bin 0 -> 5873 bytes assets/img/apple-touch-icon-76x76.png | Bin 0 -> 2031 bytes assets/img/apple-touch-icon.png | Bin 0 -> 1679 bytes assets/img/favicon-16x16.png | Bin 0 -> 480 bytes assets/img/favicon-32x32.png | Bin 0 -> 914 bytes assets/img/favicon-96x96.png | Bin 0 -> 2912 bytes assets/includes/config.example.php | 18 + assets/includes/footer.php | 53 + assets/includes/header.php | 111 + assets/includes/modalotoast.php | 82 + assets/js/bootstrap.bundle.min.js | 6 + assets/js/jquery.min.js | 2 + assets/js/script.js | 57 + assets/lang/fr.txt | 48 + assets/lang/translator.php | 45 + assets/tools/qrcode-url/README.md | 34 + assets/tools/qrcode-url/index.php | 26 + assets/tools/qrcode-url/lib/.htaccess | 4 + assets/tools/qrcode-url/lib/CHANGELOG | 38 + assets/tools/qrcode-url/lib/INSTALL | 67 + assets/tools/qrcode-url/lib/LICENSE | 165 + assets/tools/qrcode-url/lib/README | 45 + assets/tools/qrcode-url/lib/VERSION | 2 + .../qrcode-url/lib/bindings/tcpdf/qrcode.php | 2875 ++++++++++++++ assets/tools/qrcode-url/lib/cache/frame_1.dat | 2 + assets/tools/qrcode-url/lib/cache/frame_1.png | Bin 0 -> 126 bytes .../tools/qrcode-url/lib/cache/frame_10.dat | Bin 0 -> 204 bytes .../tools/qrcode-url/lib/cache/frame_10.png | Bin 0 -> 202 bytes .../tools/qrcode-url/lib/cache/frame_11.dat | Bin 0 -> 210 bytes .../tools/qrcode-url/lib/cache/frame_11.png | Bin 0 -> 202 bytes .../tools/qrcode-url/lib/cache/frame_12.dat | Bin 0 -> 222 bytes .../tools/qrcode-url/lib/cache/frame_12.png | Bin 0 -> 213 bytes .../tools/qrcode-url/lib/cache/frame_13.dat | Bin 0 -> 223 bytes .../tools/qrcode-url/lib/cache/frame_13.png | Bin 0 -> 204 bytes .../tools/qrcode-url/lib/cache/frame_14.dat | Bin 0 -> 227 bytes .../tools/qrcode-url/lib/cache/frame_14.png | Bin 0 -> 213 bytes .../tools/qrcode-url/lib/cache/frame_15.dat | Bin 0 -> 242 bytes .../tools/qrcode-url/lib/cache/frame_15.png | Bin 0 -> 218 bytes .../tools/qrcode-url/lib/cache/frame_16.dat | 1 + .../tools/qrcode-url/lib/cache/frame_16.png | Bin 0 -> 211 bytes .../tools/qrcode-url/lib/cache/frame_17.dat | Bin 0 -> 237 bytes .../tools/qrcode-url/lib/cache/frame_17.png | Bin 0 -> 209 bytes .../tools/qrcode-url/lib/cache/frame_18.dat | 2 + .../tools/qrcode-url/lib/cache/frame_18.png | Bin 0 -> 226 bytes .../tools/qrcode-url/lib/cache/frame_19.dat | 3 + .../tools/qrcode-url/lib/cache/frame_19.png | Bin 0 -> 220 bytes assets/tools/qrcode-url/lib/cache/frame_2.dat | 1 + assets/tools/qrcode-url/lib/cache/frame_2.png | Bin 0 -> 144 bytes .../tools/qrcode-url/lib/cache/frame_20.dat | Bin 0 -> 250 bytes .../tools/qrcode-url/lib/cache/frame_20.png | Bin 0 -> 217 bytes .../tools/qrcode-url/lib/cache/frame_21.dat | 1 + .../tools/qrcode-url/lib/cache/frame_21.png | Bin 0 -> 230 bytes .../tools/qrcode-url/lib/cache/frame_22.dat | 3 + .../tools/qrcode-url/lib/cache/frame_22.png | Bin 0 -> 222 bytes .../tools/qrcode-url/lib/cache/frame_23.dat | 3 + .../tools/qrcode-url/lib/cache/frame_23.png | Bin 0 -> 215 bytes .../tools/qrcode-url/lib/cache/frame_24.dat | 1 + .../tools/qrcode-url/lib/cache/frame_24.png | Bin 0 -> 233 bytes .../tools/qrcode-url/lib/cache/frame_25.dat | 3 + .../tools/qrcode-url/lib/cache/frame_25.png | Bin 0 -> 236 bytes .../tools/qrcode-url/lib/cache/frame_26.dat | 2 + .../tools/qrcode-url/lib/cache/frame_26.png | Bin 0 -> 239 bytes .../tools/qrcode-url/lib/cache/frame_27.dat | Bin 0 -> 284 bytes .../tools/qrcode-url/lib/cache/frame_27.png | Bin 0 -> 230 bytes .../tools/qrcode-url/lib/cache/frame_28.dat | Bin 0 -> 318 bytes .../tools/qrcode-url/lib/cache/frame_28.png | Bin 0 -> 228 bytes .../tools/qrcode-url/lib/cache/frame_29.dat | 2 + .../tools/qrcode-url/lib/cache/frame_29.png | Bin 0 -> 227 bytes assets/tools/qrcode-url/lib/cache/frame_3.dat | 1 + assets/tools/qrcode-url/lib/cache/frame_3.png | Bin 0 -> 145 bytes .../tools/qrcode-url/lib/cache/frame_30.dat | Bin 0 -> 324 bytes .../tools/qrcode-url/lib/cache/frame_30.png | Bin 0 -> 247 bytes .../tools/qrcode-url/lib/cache/frame_31.dat | 1 + .../tools/qrcode-url/lib/cache/frame_31.png | Bin 0 -> 244 bytes .../tools/qrcode-url/lib/cache/frame_32.dat | 2 + .../tools/qrcode-url/lib/cache/frame_32.png | Bin 0 -> 251 bytes .../tools/qrcode-url/lib/cache/frame_33.dat | 14 + .../tools/qrcode-url/lib/cache/frame_33.png | Bin 0 -> 238 bytes .../tools/qrcode-url/lib/cache/frame_34.dat | Bin 0 -> 331 bytes .../tools/qrcode-url/lib/cache/frame_34.png | Bin 0 -> 242 bytes .../tools/qrcode-url/lib/cache/frame_35.dat | Bin 0 -> 342 bytes .../tools/qrcode-url/lib/cache/frame_35.png | Bin 0 -> 231 bytes .../tools/qrcode-url/lib/cache/frame_36.dat | Bin 0 -> 370 bytes .../tools/qrcode-url/lib/cache/frame_36.png | Bin 0 -> 254 bytes .../tools/qrcode-url/lib/cache/frame_37.dat | Bin 0 -> 376 bytes .../tools/qrcode-url/lib/cache/frame_37.png | Bin 0 -> 259 bytes .../tools/qrcode-url/lib/cache/frame_38.dat | 1 + .../tools/qrcode-url/lib/cache/frame_38.png | Bin 0 -> 260 bytes .../tools/qrcode-url/lib/cache/frame_39.dat | Bin 0 -> 404 bytes .../tools/qrcode-url/lib/cache/frame_39.png | Bin 0 -> 244 bytes assets/tools/qrcode-url/lib/cache/frame_4.dat | 1 + assets/tools/qrcode-url/lib/cache/frame_4.png | Bin 0 -> 149 bytes .../tools/qrcode-url/lib/cache/frame_40.dat | 2 + .../tools/qrcode-url/lib/cache/frame_40.png | Bin 0 -> 248 bytes assets/tools/qrcode-url/lib/cache/frame_5.dat | 1 + assets/tools/qrcode-url/lib/cache/frame_5.png | Bin 0 -> 150 bytes assets/tools/qrcode-url/lib/cache/frame_6.dat | Bin 0 -> 132 bytes assets/tools/qrcode-url/lib/cache/frame_6.png | Bin 0 -> 151 bytes assets/tools/qrcode-url/lib/cache/frame_7.dat | Bin 0 -> 196 bytes assets/tools/qrcode-url/lib/cache/frame_7.png | Bin 0 -> 189 bytes assets/tools/qrcode-url/lib/cache/frame_8.dat | Bin 0 -> 201 bytes assets/tools/qrcode-url/lib/cache/frame_8.png | Bin 0 -> 203 bytes assets/tools/qrcode-url/lib/cache/frame_9.dat | Bin 0 -> 206 bytes assets/tools/qrcode-url/lib/cache/frame_9.png | Bin 0 -> 198 bytes .../lib/cache/mask_0/mask_101_0.dat | Bin 0 -> 157 bytes .../lib/cache/mask_0/mask_105_0.dat | Bin 0 -> 162 bytes .../lib/cache/mask_0/mask_109_0.dat | 2 + .../lib/cache/mask_0/mask_113_0.dat | 2 + .../lib/cache/mask_0/mask_117_0.dat | 2 + .../lib/cache/mask_0/mask_121_0.dat | 1 + .../lib/cache/mask_0/mask_125_0.dat | 2 + .../lib/cache/mask_0/mask_129_0.dat | 2 + .../lib/cache/mask_0/mask_133_0.dat | 2 + .../lib/cache/mask_0/mask_137_0.dat | 1 + .../lib/cache/mask_0/mask_141_0.dat | 2 + .../lib/cache/mask_0/mask_145_0.dat | 2 + .../lib/cache/mask_0/mask_149_0.dat | 3 + .../lib/cache/mask_0/mask_153_0.dat | 1 + .../lib/cache/mask_0/mask_157_0.dat | 2 + .../lib/cache/mask_0/mask_161_0.dat | Bin 0 -> 241 bytes .../lib/cache/mask_0/mask_165_0.dat | 2 + .../lib/cache/mask_0/mask_169_0.dat | 2 + .../lib/cache/mask_0/mask_173_0.dat | 1 + .../lib/cache/mask_0/mask_177_0.dat | 2 + .../qrcode-url/lib/cache/mask_0/mask_21_0.dat | Bin 0 -> 48 bytes .../qrcode-url/lib/cache/mask_0/mask_25_0.dat | Bin 0 -> 57 bytes .../qrcode-url/lib/cache/mask_0/mask_29_0.dat | Bin 0 -> 59 bytes .../qrcode-url/lib/cache/mask_0/mask_33_0.dat | Bin 0 -> 62 bytes .../qrcode-url/lib/cache/mask_0/mask_37_0.dat | Bin 0 -> 65 bytes .../qrcode-url/lib/cache/mask_0/mask_41_0.dat | Bin 0 -> 68 bytes .../qrcode-url/lib/cache/mask_0/mask_45_0.dat | Bin 0 -> 106 bytes .../qrcode-url/lib/cache/mask_0/mask_49_0.dat | 2 + .../qrcode-url/lib/cache/mask_0/mask_53_0.dat | 2 + .../qrcode-url/lib/cache/mask_0/mask_57_0.dat | 4 + .../qrcode-url/lib/cache/mask_0/mask_61_0.dat | Bin 0 -> 119 bytes .../qrcode-url/lib/cache/mask_0/mask_65_0.dat | Bin 0 -> 123 bytes .../qrcode-url/lib/cache/mask_0/mask_69_0.dat | 1 + .../qrcode-url/lib/cache/mask_0/mask_73_0.dat | 1 + .../qrcode-url/lib/cache/mask_0/mask_77_0.dat | 2 + .../qrcode-url/lib/cache/mask_0/mask_81_0.dat | 2 + .../qrcode-url/lib/cache/mask_0/mask_85_0.dat | 2 + .../qrcode-url/lib/cache/mask_0/mask_89_0.dat | 1 + .../qrcode-url/lib/cache/mask_0/mask_93_0.dat | 3 + .../qrcode-url/lib/cache/mask_0/mask_97_0.dat | Bin 0 -> 150 bytes .../lib/cache/mask_1/mask_101_1.dat | 2 + .../lib/cache/mask_1/mask_105_1.dat | 1 + .../lib/cache/mask_1/mask_109_1.dat | 1 + .../lib/cache/mask_1/mask_113_1.dat | 1 + .../lib/cache/mask_1/mask_117_1.dat | 2 + .../lib/cache/mask_1/mask_121_1.dat | 2 + .../lib/cache/mask_1/mask_125_1.dat | 2 + .../lib/cache/mask_1/mask_129_1.dat | Bin 0 -> 164 bytes .../lib/cache/mask_1/mask_133_1.dat | 1 + .../lib/cache/mask_1/mask_137_1.dat | 3 + .../lib/cache/mask_1/mask_141_1.dat | 2 + .../lib/cache/mask_1/mask_145_1.dat | 1 + .../lib/cache/mask_1/mask_149_1.dat | 1 + .../lib/cache/mask_1/mask_153_1.dat | 2 + .../lib/cache/mask_1/mask_157_1.dat | 2 + .../lib/cache/mask_1/mask_161_1.dat | 1 + .../lib/cache/mask_1/mask_165_1.dat | 1 + .../lib/cache/mask_1/mask_169_1.dat | 1 + .../lib/cache/mask_1/mask_173_1.dat | 1 + .../lib/cache/mask_1/mask_177_1.dat | 1 + .../qrcode-url/lib/cache/mask_1/mask_21_1.dat | Bin 0 -> 42 bytes .../qrcode-url/lib/cache/mask_1/mask_25_1.dat | Bin 0 -> 48 bytes .../qrcode-url/lib/cache/mask_1/mask_29_1.dat | Bin 0 -> 50 bytes .../qrcode-url/lib/cache/mask_1/mask_33_1.dat | Bin 0 -> 53 bytes .../qrcode-url/lib/cache/mask_1/mask_37_1.dat | Bin 0 -> 56 bytes .../qrcode-url/lib/cache/mask_1/mask_41_1.dat | Bin 0 -> 58 bytes .../qrcode-url/lib/cache/mask_1/mask_45_1.dat | Bin 0 -> 82 bytes .../qrcode-url/lib/cache/mask_1/mask_49_1.dat | Bin 0 -> 84 bytes .../qrcode-url/lib/cache/mask_1/mask_53_1.dat | Bin 0 -> 87 bytes .../qrcode-url/lib/cache/mask_1/mask_57_1.dat | Bin 0 -> 92 bytes .../qrcode-url/lib/cache/mask_1/mask_61_1.dat | 1 + .../qrcode-url/lib/cache/mask_1/mask_65_1.dat | Bin 0 -> 99 bytes .../qrcode-url/lib/cache/mask_1/mask_69_1.dat | Bin 0 -> 102 bytes .../qrcode-url/lib/cache/mask_1/mask_73_1.dat | Bin 0 -> 104 bytes .../qrcode-url/lib/cache/mask_1/mask_77_1.dat | Bin 0 -> 110 bytes .../qrcode-url/lib/cache/mask_1/mask_81_1.dat | Bin 0 -> 114 bytes .../qrcode-url/lib/cache/mask_1/mask_85_1.dat | 2 + .../qrcode-url/lib/cache/mask_1/mask_89_1.dat | 1 + .../qrcode-url/lib/cache/mask_1/mask_93_1.dat | 2 + .../qrcode-url/lib/cache/mask_1/mask_97_1.dat | 2 + .../lib/cache/mask_2/mask_101_2.dat | 3 + .../lib/cache/mask_2/mask_105_2.dat | 1 + .../lib/cache/mask_2/mask_109_2.dat | 2 + .../lib/cache/mask_2/mask_113_2.dat | 1 + .../lib/cache/mask_2/mask_117_2.dat | 2 + .../lib/cache/mask_2/mask_121_2.dat | Bin 0 -> 127 bytes .../lib/cache/mask_2/mask_125_2.dat | 1 + .../lib/cache/mask_2/mask_129_2.dat | 2 + .../lib/cache/mask_2/mask_133_2.dat | 10 + .../lib/cache/mask_2/mask_137_2.dat | 2 + .../lib/cache/mask_2/mask_141_2.dat | 2 + .../lib/cache/mask_2/mask_145_2.dat | 4 + .../lib/cache/mask_2/mask_149_2.dat | 1 + .../lib/cache/mask_2/mask_153_2.dat | 2 + .../lib/cache/mask_2/mask_157_2.dat | 3 + .../lib/cache/mask_2/mask_161_2.dat | Bin 0 -> 190 bytes .../lib/cache/mask_2/mask_165_2.dat | 2 + .../lib/cache/mask_2/mask_169_2.dat | Bin 0 -> 196 bytes .../lib/cache/mask_2/mask_173_2.dat | 1 + .../lib/cache/mask_2/mask_177_2.dat | 2 + .../qrcode-url/lib/cache/mask_2/mask_21_2.dat | Bin 0 -> 35 bytes .../qrcode-url/lib/cache/mask_2/mask_25_2.dat | Bin 0 -> 41 bytes .../qrcode-url/lib/cache/mask_2/mask_29_2.dat | Bin 0 -> 45 bytes .../qrcode-url/lib/cache/mask_2/mask_33_2.dat | Bin 0 -> 47 bytes .../qrcode-url/lib/cache/mask_2/mask_37_2.dat | Bin 0 -> 47 bytes .../qrcode-url/lib/cache/mask_2/mask_41_2.dat | 1 + .../qrcode-url/lib/cache/mask_2/mask_45_2.dat | Bin 0 -> 68 bytes .../qrcode-url/lib/cache/mask_2/mask_49_2.dat | Bin 0 -> 70 bytes .../qrcode-url/lib/cache/mask_2/mask_53_2.dat | Bin 0 -> 73 bytes .../qrcode-url/lib/cache/mask_2/mask_57_2.dat | Bin 0 -> 76 bytes .../qrcode-url/lib/cache/mask_2/mask_61_2.dat | Bin 0 -> 78 bytes .../qrcode-url/lib/cache/mask_2/mask_65_2.dat | Bin 0 -> 89 bytes .../qrcode-url/lib/cache/mask_2/mask_69_2.dat | Bin 0 -> 88 bytes .../qrcode-url/lib/cache/mask_2/mask_73_2.dat | Bin 0 -> 94 bytes .../qrcode-url/lib/cache/mask_2/mask_77_2.dat | 1 + .../qrcode-url/lib/cache/mask_2/mask_81_2.dat | 2 + .../qrcode-url/lib/cache/mask_2/mask_85_2.dat | 2 + .../qrcode-url/lib/cache/mask_2/mask_89_2.dat | 1 + .../qrcode-url/lib/cache/mask_2/mask_93_2.dat | Bin 0 -> 103 bytes .../qrcode-url/lib/cache/mask_2/mask_97_2.dat | 2 + .../lib/cache/mask_3/mask_101_3.dat | 1 + .../lib/cache/mask_3/mask_105_3.dat | 1 + .../lib/cache/mask_3/mask_109_3.dat | 1 + .../lib/cache/mask_3/mask_113_3.dat | 2 + .../lib/cache/mask_3/mask_117_3.dat | 4 + .../lib/cache/mask_3/mask_121_3.dat | Bin 0 -> 212 bytes .../lib/cache/mask_3/mask_125_3.dat | 2 + .../lib/cache/mask_3/mask_129_3.dat | 8 + .../lib/cache/mask_3/mask_133_3.dat | Bin 0 -> 216 bytes .../lib/cache/mask_3/mask_137_3.dat | 2 + .../lib/cache/mask_3/mask_141_3.dat | 2 + .../lib/cache/mask_3/mask_145_3.dat | 3 + .../lib/cache/mask_3/mask_149_3.dat | 1 + .../lib/cache/mask_3/mask_153_3.dat | 2 + .../lib/cache/mask_3/mask_157_3.dat | Bin 0 -> 248 bytes .../lib/cache/mask_3/mask_161_3.dat | 3 + .../lib/cache/mask_3/mask_165_3.dat | 2 + .../lib/cache/mask_3/mask_169_3.dat | 1 + .../lib/cache/mask_3/mask_173_3.dat | 1 + .../lib/cache/mask_3/mask_177_3.dat | Bin 0 -> 312 bytes .../qrcode-url/lib/cache/mask_3/mask_21_3.dat | Bin 0 -> 60 bytes .../qrcode-url/lib/cache/mask_3/mask_25_3.dat | Bin 0 -> 75 bytes .../qrcode-url/lib/cache/mask_3/mask_29_3.dat | Bin 0 -> 75 bytes .../qrcode-url/lib/cache/mask_3/mask_33_3.dat | Bin 0 -> 79 bytes .../qrcode-url/lib/cache/mask_3/mask_37_3.dat | Bin 0 -> 83 bytes .../qrcode-url/lib/cache/mask_3/mask_41_3.dat | Bin 0 -> 85 bytes .../qrcode-url/lib/cache/mask_3/mask_45_3.dat | 2 + .../qrcode-url/lib/cache/mask_3/mask_49_3.dat | Bin 0 -> 127 bytes .../qrcode-url/lib/cache/mask_3/mask_53_3.dat | 2 + .../qrcode-url/lib/cache/mask_3/mask_57_3.dat | Bin 0 -> 126 bytes .../qrcode-url/lib/cache/mask_3/mask_61_3.dat | 2 + .../qrcode-url/lib/cache/mask_3/mask_65_3.dat | 2 + .../qrcode-url/lib/cache/mask_3/mask_69_3.dat | 2 + .../qrcode-url/lib/cache/mask_3/mask_73_3.dat | 2 + .../qrcode-url/lib/cache/mask_3/mask_77_3.dat | 2 + .../qrcode-url/lib/cache/mask_3/mask_81_3.dat | 2 + .../qrcode-url/lib/cache/mask_3/mask_85_3.dat | Bin 0 -> 160 bytes .../qrcode-url/lib/cache/mask_3/mask_89_3.dat | 2 + .../qrcode-url/lib/cache/mask_3/mask_93_3.dat | 2 + .../qrcode-url/lib/cache/mask_3/mask_97_3.dat | Bin 0 -> 175 bytes .../lib/cache/mask_4/mask_101_4.dat | 2 + .../lib/cache/mask_4/mask_105_4.dat | 2 + .../lib/cache/mask_4/mask_109_4.dat | Bin 0 -> 182 bytes .../lib/cache/mask_4/mask_113_4.dat | 2 + .../lib/cache/mask_4/mask_117_4.dat | 2 + .../lib/cache/mask_4/mask_121_4.dat | Bin 0 -> 208 bytes .../lib/cache/mask_4/mask_125_4.dat | Bin 0 -> 213 bytes .../lib/cache/mask_4/mask_129_4.dat | Bin 0 -> 220 bytes .../lib/cache/mask_4/mask_133_4.dat | 3 + .../lib/cache/mask_4/mask_137_4.dat | Bin 0 -> 248 bytes .../lib/cache/mask_4/mask_141_4.dat | Bin 0 -> 254 bytes .../lib/cache/mask_4/mask_145_4.dat | Bin 0 -> 255 bytes .../lib/cache/mask_4/mask_149_4.dat | 2 + .../lib/cache/mask_4/mask_153_4.dat | 2 + .../lib/cache/mask_4/mask_157_4.dat | 1 + .../lib/cache/mask_4/mask_161_4.dat | 1 + .../lib/cache/mask_4/mask_165_4.dat | 3 + .../lib/cache/mask_4/mask_169_4.dat | Bin 0 -> 297 bytes .../lib/cache/mask_4/mask_173_4.dat | 2 + .../lib/cache/mask_4/mask_177_4.dat | 2 + .../qrcode-url/lib/cache/mask_4/mask_21_4.dat | Bin 0 -> 57 bytes .../qrcode-url/lib/cache/mask_4/mask_25_4.dat | Bin 0 -> 76 bytes .../qrcode-url/lib/cache/mask_4/mask_29_4.dat | Bin 0 -> 78 bytes .../qrcode-url/lib/cache/mask_4/mask_33_4.dat | Bin 0 -> 89 bytes .../qrcode-url/lib/cache/mask_4/mask_37_4.dat | Bin 0 -> 86 bytes .../qrcode-url/lib/cache/mask_4/mask_41_4.dat | Bin 0 -> 89 bytes .../qrcode-url/lib/cache/mask_4/mask_45_4.dat | Bin 0 -> 120 bytes .../qrcode-url/lib/cache/mask_4/mask_49_4.dat | Bin 0 -> 124 bytes .../qrcode-url/lib/cache/mask_4/mask_53_4.dat | Bin 0 -> 128 bytes .../qrcode-url/lib/cache/mask_4/mask_57_4.dat | Bin 0 -> 130 bytes .../qrcode-url/lib/cache/mask_4/mask_61_4.dat | Bin 0 -> 132 bytes .../qrcode-url/lib/cache/mask_4/mask_65_4.dat | 2 + .../qrcode-url/lib/cache/mask_4/mask_69_4.dat | 1 + .../qrcode-url/lib/cache/mask_4/mask_73_4.dat | 3 + .../qrcode-url/lib/cache/mask_4/mask_77_4.dat | 2 + .../qrcode-url/lib/cache/mask_4/mask_81_4.dat | 3 + .../qrcode-url/lib/cache/mask_4/mask_85_4.dat | Bin 0 -> 154 bytes .../qrcode-url/lib/cache/mask_4/mask_89_4.dat | 2 + .../qrcode-url/lib/cache/mask_4/mask_93_4.dat | 2 + .../qrcode-url/lib/cache/mask_4/mask_97_4.dat | Bin 0 -> 176 bytes .../lib/cache/mask_5/mask_101_5.dat | 2 + .../lib/cache/mask_5/mask_105_5.dat | Bin 0 -> 224 bytes .../lib/cache/mask_5/mask_109_5.dat | Bin 0 -> 211 bytes .../lib/cache/mask_5/mask_113_5.dat | 9 + .../lib/cache/mask_5/mask_117_5.dat | 1 + .../lib/cache/mask_5/mask_121_5.dat | Bin 0 -> 256 bytes .../lib/cache/mask_5/mask_125_5.dat | 2 + .../lib/cache/mask_5/mask_129_5.dat | Bin 0 -> 259 bytes .../lib/cache/mask_5/mask_133_5.dat | 2 + .../lib/cache/mask_5/mask_137_5.dat | 3 + .../lib/cache/mask_5/mask_141_5.dat | Bin 0 -> 297 bytes .../lib/cache/mask_5/mask_145_5.dat | Bin 0 -> 300 bytes .../lib/cache/mask_5/mask_149_5.dat | 3 + .../lib/cache/mask_5/mask_153_5.dat | 2 + .../lib/cache/mask_5/mask_157_5.dat | 1 + .../lib/cache/mask_5/mask_161_5.dat | 2 + .../lib/cache/mask_5/mask_165_5.dat | Bin 0 -> 332 bytes .../lib/cache/mask_5/mask_169_5.dat | 1 + .../lib/cache/mask_5/mask_173_5.dat | 4 + .../lib/cache/mask_5/mask_177_5.dat | 11 + .../qrcode-url/lib/cache/mask_5/mask_21_5.dat | Bin 0 -> 74 bytes .../qrcode-url/lib/cache/mask_5/mask_25_5.dat | 2 + .../qrcode-url/lib/cache/mask_5/mask_29_5.dat | 2 + .../qrcode-url/lib/cache/mask_5/mask_33_5.dat | Bin 0 -> 106 bytes .../qrcode-url/lib/cache/mask_5/mask_37_5.dat | Bin 0 -> 103 bytes .../qrcode-url/lib/cache/mask_5/mask_41_5.dat | 2 + .../qrcode-url/lib/cache/mask_5/mask_45_5.dat | 1 + .../qrcode-url/lib/cache/mask_5/mask_49_5.dat | Bin 0 -> 146 bytes .../qrcode-url/lib/cache/mask_5/mask_53_5.dat | 1 + .../qrcode-url/lib/cache/mask_5/mask_57_5.dat | 2 + .../qrcode-url/lib/cache/mask_5/mask_61_5.dat | 1 + .../qrcode-url/lib/cache/mask_5/mask_65_5.dat | Bin 0 -> 163 bytes .../qrcode-url/lib/cache/mask_5/mask_69_5.dat | Bin 0 -> 167 bytes .../qrcode-url/lib/cache/mask_5/mask_73_5.dat | Bin 0 -> 184 bytes .../qrcode-url/lib/cache/mask_5/mask_77_5.dat | 1 + .../qrcode-url/lib/cache/mask_5/mask_81_5.dat | 3 + .../qrcode-url/lib/cache/mask_5/mask_85_5.dat | Bin 0 -> 186 bytes .../qrcode-url/lib/cache/mask_5/mask_89_5.dat | 2 + .../qrcode-url/lib/cache/mask_5/mask_93_5.dat | 2 + .../qrcode-url/lib/cache/mask_5/mask_97_5.dat | 1 + .../lib/cache/mask_6/mask_101_6.dat | 2 + .../lib/cache/mask_6/mask_105_6.dat | 3 + .../lib/cache/mask_6/mask_109_6.dat | 1 + .../lib/cache/mask_6/mask_113_6.dat | 3 + .../lib/cache/mask_6/mask_117_6.dat | 1 + .../lib/cache/mask_6/mask_121_6.dat | Bin 0 -> 309 bytes .../lib/cache/mask_6/mask_125_6.dat | 1 + .../lib/cache/mask_6/mask_129_6.dat | Bin 0 -> 310 bytes .../lib/cache/mask_6/mask_133_6.dat | Bin 0 -> 296 bytes .../lib/cache/mask_6/mask_137_6.dat | 2 + .../lib/cache/mask_6/mask_141_6.dat | 10 + .../lib/cache/mask_6/mask_145_6.dat | Bin 0 -> 357 bytes .../lib/cache/mask_6/mask_149_6.dat | 2 + .../lib/cache/mask_6/mask_153_6.dat | Bin 0 -> 367 bytes .../lib/cache/mask_6/mask_157_6.dat | 1 + .../lib/cache/mask_6/mask_161_6.dat | Bin 0 -> 399 bytes .../lib/cache/mask_6/mask_165_6.dat | Bin 0 -> 400 bytes .../lib/cache/mask_6/mask_169_6.dat | 1 + .../lib/cache/mask_6/mask_173_6.dat | 1 + .../lib/cache/mask_6/mask_177_6.dat | 14 + .../qrcode-url/lib/cache/mask_6/mask_21_6.dat | 1 + .../qrcode-url/lib/cache/mask_6/mask_25_6.dat | 1 + .../qrcode-url/lib/cache/mask_6/mask_29_6.dat | 3 + .../qrcode-url/lib/cache/mask_6/mask_33_6.dat | Bin 0 -> 124 bytes .../qrcode-url/lib/cache/mask_6/mask_37_6.dat | 1 + .../qrcode-url/lib/cache/mask_6/mask_41_6.dat | Bin 0 -> 132 bytes .../qrcode-url/lib/cache/mask_6/mask_45_6.dat | Bin 0 -> 189 bytes .../qrcode-url/lib/cache/mask_6/mask_49_6.dat | 2 + .../qrcode-url/lib/cache/mask_6/mask_53_6.dat | Bin 0 -> 195 bytes .../qrcode-url/lib/cache/mask_6/mask_57_6.dat | 2 + .../qrcode-url/lib/cache/mask_6/mask_61_6.dat | 2 + .../qrcode-url/lib/cache/mask_6/mask_65_6.dat | 1 + .../qrcode-url/lib/cache/mask_6/mask_69_6.dat | 1 + .../qrcode-url/lib/cache/mask_6/mask_73_6.dat | Bin 0 -> 230 bytes .../qrcode-url/lib/cache/mask_6/mask_77_6.dat | 1 + .../qrcode-url/lib/cache/mask_6/mask_81_6.dat | 3 + .../qrcode-url/lib/cache/mask_6/mask_85_6.dat | Bin 0 -> 229 bytes .../qrcode-url/lib/cache/mask_6/mask_89_6.dat | Bin 0 -> 263 bytes .../qrcode-url/lib/cache/mask_6/mask_93_6.dat | Bin 0 -> 276 bytes .../qrcode-url/lib/cache/mask_6/mask_97_6.dat | 2 + .../lib/cache/mask_7/mask_101_7.dat | 1 + .../lib/cache/mask_7/mask_105_7.dat | 2 + .../lib/cache/mask_7/mask_109_7.dat | 2 + .../lib/cache/mask_7/mask_113_7.dat | 11 + .../lib/cache/mask_7/mask_117_7.dat | 2 + .../lib/cache/mask_7/mask_121_7.dat | 2 + .../lib/cache/mask_7/mask_125_7.dat | Bin 0 -> 288 bytes .../lib/cache/mask_7/mask_129_7.dat | Bin 0 -> 282 bytes .../lib/cache/mask_7/mask_133_7.dat | Bin 0 -> 281 bytes .../lib/cache/mask_7/mask_137_7.dat | 5 + .../lib/cache/mask_7/mask_141_7.dat | 1 + .../lib/cache/mask_7/mask_145_7.dat | 2 + .../lib/cache/mask_7/mask_149_7.dat | 1 + .../lib/cache/mask_7/mask_153_7.dat | 2 + .../lib/cache/mask_7/mask_157_7.dat | 2 + .../lib/cache/mask_7/mask_161_7.dat | 1 + .../lib/cache/mask_7/mask_165_7.dat | 1 + .../lib/cache/mask_7/mask_169_7.dat | Bin 0 -> 383 bytes .../lib/cache/mask_7/mask_173_7.dat | 1 + .../lib/cache/mask_7/mask_177_7.dat | Bin 0 -> 407 bytes .../qrcode-url/lib/cache/mask_7/mask_21_7.dat | 4 + .../qrcode-url/lib/cache/mask_7/mask_25_7.dat | 1 + .../qrcode-url/lib/cache/mask_7/mask_29_7.dat | 2 + .../qrcode-url/lib/cache/mask_7/mask_33_7.dat | 1 + .../qrcode-url/lib/cache/mask_7/mask_37_7.dat | Bin 0 -> 122 bytes .../qrcode-url/lib/cache/mask_7/mask_41_7.dat | 1 + .../qrcode-url/lib/cache/mask_7/mask_45_7.dat | Bin 0 -> 173 bytes .../qrcode-url/lib/cache/mask_7/mask_49_7.dat | 1 + .../qrcode-url/lib/cache/mask_7/mask_53_7.dat | 1 + .../qrcode-url/lib/cache/mask_7/mask_57_7.dat | 1 + .../qrcode-url/lib/cache/mask_7/mask_61_7.dat | 2 + .../qrcode-url/lib/cache/mask_7/mask_65_7.dat | 1 + .../qrcode-url/lib/cache/mask_7/mask_69_7.dat | Bin 0 -> 202 bytes .../qrcode-url/lib/cache/mask_7/mask_73_7.dat | Bin 0 -> 221 bytes .../qrcode-url/lib/cache/mask_7/mask_77_7.dat | Bin 0 -> 226 bytes .../qrcode-url/lib/cache/mask_7/mask_81_7.dat | 1 + .../qrcode-url/lib/cache/mask_7/mask_85_7.dat | Bin 0 -> 213 bytes .../qrcode-url/lib/cache/mask_7/mask_89_7.dat | Bin 0 -> 244 bytes .../qrcode-url/lib/cache/mask_7/mask_93_7.dat | Bin 0 -> 248 bytes .../qrcode-url/lib/cache/mask_7/mask_97_7.dat | 2 + assets/tools/qrcode-url/lib/index.php | 95 + assets/tools/qrcode-url/lib/phpqrcode.php | 3312 +++++++++++++++++ assets/tools/qrcode-url/lib/qrbitstream.php | 180 + assets/tools/qrcode-url/lib/qrconfig.php | 17 + assets/tools/qrcode-url/lib/qrconst.php | 54 + assets/tools/qrcode-url/lib/qrencode.php | 502 +++ assets/tools/qrcode-url/lib/qrimage.php | 95 + assets/tools/qrcode-url/lib/qrinput.php | 729 ++++ assets/tools/qrcode-url/lib/qrlib.php | 43 + assets/tools/qrcode-url/lib/qrmask.php | 328 ++ assets/tools/qrcode-url/lib/qrrscode.php | 210 ++ assets/tools/qrcode-url/lib/qrspec.php | 592 +++ assets/tools/qrcode-url/lib/qrsplit.php | 311 ++ assets/tools/qrcode-url/lib/qrtools.php | 172 + assets/tools/qrcode-url/lib/tools/merge.bat | 2 + assets/tools/qrcode-url/lib/tools/merge.php | 70 + assets/tools/qrcode-url/lib/tools/merge.sh | 2 + .../qrcode-url/lib/tools/merged_config.php | 17 + .../qrcode-url/lib/tools/merged_header.php | 36 + collabore_link.sql | 15 + favicon.ico | Bin 0 -> 1150 bytes index.php | 170 + manifest.webmanifest | 45 + report.php | 52 + reported.php | 111 + robots.txt | 3 + shorten.php | 239 ++ sitemap.xml | 18 + 468 files changed, 12518 insertions(+) create mode 100644 .gitignore create mode 100644 assets/css/bootstrap.min.css create mode 100755 assets/css/style.css create mode 100644 assets/fonts/varela-round-v19-latin-regular.eot create mode 100644 assets/fonts/varela-round-v19-latin-regular.svg create mode 100644 assets/fonts/varela-round-v19-latin-regular.ttf create mode 100644 assets/fonts/varela-round-v19-latin-regular.woff create mode 100644 assets/fonts/varela-round-v19-latin-regular.woff2 create mode 100644 assets/img/android-chrome-144x144.png create mode 100644 assets/img/android-chrome-192x192.png create mode 100644 assets/img/android-chrome-36x36.png create mode 100644 assets/img/android-chrome-48x48.png create mode 100644 assets/img/android-chrome-72x72.png create mode 100644 assets/img/android-chrome-96x96.png create mode 100644 assets/img/apple-touch-icon-120x120.png create mode 100644 assets/img/apple-touch-icon-152x152.png create mode 100644 assets/img/apple-touch-icon-180x180.png create mode 100644 assets/img/apple-touch-icon-76x76.png create mode 100644 assets/img/apple-touch-icon.png create mode 100644 assets/img/favicon-16x16.png create mode 100644 assets/img/favicon-32x32.png create mode 100644 assets/img/favicon-96x96.png create mode 100755 assets/includes/config.example.php create mode 100755 assets/includes/footer.php create mode 100755 assets/includes/header.php create mode 100755 assets/includes/modalotoast.php create mode 100644 assets/js/bootstrap.bundle.min.js create mode 100644 assets/js/jquery.min.js create mode 100755 assets/js/script.js create mode 100755 assets/lang/fr.txt create mode 100755 assets/lang/translator.php create mode 100755 assets/tools/qrcode-url/README.md create mode 100755 assets/tools/qrcode-url/index.php create mode 100755 assets/tools/qrcode-url/lib/.htaccess create mode 100755 assets/tools/qrcode-url/lib/CHANGELOG create mode 100755 assets/tools/qrcode-url/lib/INSTALL create mode 100755 assets/tools/qrcode-url/lib/LICENSE create mode 100755 assets/tools/qrcode-url/lib/README create mode 100755 assets/tools/qrcode-url/lib/VERSION create mode 100755 assets/tools/qrcode-url/lib/bindings/tcpdf/qrcode.php create mode 100755 assets/tools/qrcode-url/lib/cache/frame_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_1.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_10.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_10.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_11.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_11.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_12.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_12.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_13.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_13.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_14.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_14.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_15.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_15.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_16.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_16.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_17.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_17.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_18.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_18.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_19.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_19.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_2.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_20.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_20.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_21.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_21.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_22.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_22.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_23.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_23.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_24.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_24.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_25.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_25.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_26.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_26.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_27.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_27.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_28.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_28.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_29.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_29.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_3.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_30.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_30.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_31.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_31.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_32.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_32.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_33.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_33.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_34.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_34.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_35.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_35.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_36.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_36.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_37.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_37.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_38.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_38.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_39.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_39.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_4.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_40.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_40.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_5.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_6.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_7.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_8.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_8.png create mode 100755 assets/tools/qrcode-url/lib/cache/frame_9.dat create mode 100755 assets/tools/qrcode-url/lib/cache/frame_9.png create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_101_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_105_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_109_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_113_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_117_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_121_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_125_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_129_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_133_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_137_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_141_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_145_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_149_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_153_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_157_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_161_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_165_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_169_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_173_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_177_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_21_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_25_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_29_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_33_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_37_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_41_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_45_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_49_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_53_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_57_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_61_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_65_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_69_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_73_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_77_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_81_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_85_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_89_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_93_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_0/mask_97_0.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_101_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_105_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_109_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_113_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_117_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_121_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_125_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_129_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_133_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_137_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_141_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_145_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_149_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_153_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_157_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_161_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_165_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_169_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_173_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_177_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_21_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_25_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_29_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_33_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_37_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_41_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_45_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_49_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_53_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_57_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_61_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_65_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_69_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_73_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_77_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_81_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_85_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_89_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_93_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_1/mask_97_1.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_101_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_105_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_109_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_113_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_117_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_121_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_125_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_129_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_133_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_137_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_141_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_145_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_149_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_153_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_157_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_161_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_165_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_169_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_173_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_177_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_21_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_25_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_29_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_33_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_37_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_41_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_45_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_49_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_53_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_57_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_61_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_65_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_69_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_73_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_77_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_81_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_85_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_89_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_93_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_2/mask_97_2.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_101_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_105_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_109_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_113_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_117_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_121_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_125_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_129_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_133_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_137_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_141_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_145_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_149_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_153_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_157_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_161_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_165_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_169_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_173_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_177_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_21_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_25_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_29_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_33_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_37_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_41_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_45_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_49_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_53_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_57_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_61_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_65_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_69_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_73_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_77_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_81_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_85_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_89_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_93_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_3/mask_97_3.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_101_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_105_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_109_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_113_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_117_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_121_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_125_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_129_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_133_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_137_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_141_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_145_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_149_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_153_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_157_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_161_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_165_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_169_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_173_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_177_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_21_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_25_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_29_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_33_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_37_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_41_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_45_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_49_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_53_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_57_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_61_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_65_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_69_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_73_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_77_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_81_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_85_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_89_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_93_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_4/mask_97_4.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_101_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_105_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_109_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_113_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_117_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_121_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_125_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_129_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_133_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_137_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_141_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_145_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_149_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_153_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_157_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_161_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_165_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_169_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_173_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_177_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_21_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_25_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_29_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_33_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_37_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_41_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_45_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_49_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_53_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_57_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_61_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_65_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_69_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_73_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_77_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_81_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_85_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_89_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_93_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_5/mask_97_5.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_101_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_105_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_109_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_113_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_117_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_121_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_125_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_129_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_133_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_137_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_141_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_145_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_149_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_153_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_157_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_161_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_165_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_169_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_173_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_177_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_21_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_25_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_29_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_33_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_37_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_41_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_45_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_49_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_53_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_57_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_61_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_65_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_69_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_73_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_77_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_81_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_85_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_89_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_93_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_6/mask_97_6.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_101_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_105_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_109_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_113_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_117_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_121_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_125_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_129_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_133_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_137_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_141_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_145_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_149_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_153_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_157_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_161_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_165_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_169_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_173_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_177_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_21_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_25_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_29_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_33_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_37_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_41_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_45_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_49_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_53_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_57_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_61_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_65_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_69_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_73_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_77_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_81_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_85_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_89_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_93_7.dat create mode 100755 assets/tools/qrcode-url/lib/cache/mask_7/mask_97_7.dat create mode 100755 assets/tools/qrcode-url/lib/index.php create mode 100755 assets/tools/qrcode-url/lib/phpqrcode.php create mode 100755 assets/tools/qrcode-url/lib/qrbitstream.php create mode 100755 assets/tools/qrcode-url/lib/qrconfig.php create mode 100755 assets/tools/qrcode-url/lib/qrconst.php create mode 100755 assets/tools/qrcode-url/lib/qrencode.php create mode 100755 assets/tools/qrcode-url/lib/qrimage.php create mode 100755 assets/tools/qrcode-url/lib/qrinput.php create mode 100755 assets/tools/qrcode-url/lib/qrlib.php create mode 100755 assets/tools/qrcode-url/lib/qrmask.php create mode 100755 assets/tools/qrcode-url/lib/qrrscode.php create mode 100755 assets/tools/qrcode-url/lib/qrspec.php create mode 100755 assets/tools/qrcode-url/lib/qrsplit.php create mode 100755 assets/tools/qrcode-url/lib/qrtools.php create mode 100755 assets/tools/qrcode-url/lib/tools/merge.bat create mode 100755 assets/tools/qrcode-url/lib/tools/merge.php create mode 100755 assets/tools/qrcode-url/lib/tools/merge.sh create mode 100755 assets/tools/qrcode-url/lib/tools/merged_config.php create mode 100755 assets/tools/qrcode-url/lib/tools/merged_header.php create mode 100644 collabore_link.sql create mode 100644 favicon.ico create mode 100755 index.php create mode 100644 manifest.webmanifest create mode 100755 report.php create mode 100755 reported.php create mode 100755 robots.txt create mode 100755 shorten.php create mode 100755 sitemap.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..67b42ad --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +assets/includes/config.php diff --git a/assets/css/bootstrap.min.css b/assets/css/bootstrap.min.css new file mode 100644 index 0000000..aa88c4a --- /dev/null +++ b/assets/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.6.2 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Copyright 2011-2022 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:.875em;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.width{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.width{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:1px solid #adb5bd}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background-color:transparent;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentcolor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentcolor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100755 index 0000000..d2a1c30 --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,502 @@ +@font-face { + font-family: "Varela Round"; + font-style: normal; + font-weight: 400; + src: url("../fonts/varela-round-v19-latin-regular.eot"); + src: local(""), url("../fonts/varela-round-v19-latin-regular.eot?#iefix") format("embedded-opentype"), + url("../fonts/varela-round-v19-latin-regular.woff2") format("woff2"), + url("../fonts/varela-round-v19-latin-regular.woff") format("woff"), + url("../fonts/varela-round-v19-latin-regular.ttf") format("truetype"), + url("../fonts/varela-round-v19-latin-regular.svg#VarelaRound") format("svg"); +} + +html { + position: relative; + min-height: 100%; +} + +html, +body { + font-family: "Varela Round", sans-serif; + line-height: 1.5; + font-weight: 400; + margin: 0; + padding: 0; + width: 100%; + height: 100%; + text-rendering: optimizeLegibility; + background-color: #e1e0e2; + overflow-x: hidden; + display: flex; +} + +.top-logo { + position: absolute; + top: 0; + left: 0; + border: 0; + width: 180px; + transition: left .1s ease-in-out, opacity .1s ease-in-out; + z-index: 999; + opacity: .8 +} + +.top-logo:hover { + opacity: 1 +} + +.logo { + filter: invert(100%); + width: 20%; + min-width: 100px; + height: auto; +} + +.content { + z-index: 999; + color: #1e1f1d; +} + +.masthead { + text-align: center; +} + +.masthead a, +.masthead a:focus, +.masthead a:hover { + color: #1e1f1d; +} + +.btn-secondary, +.btn-secondary:hover, +.btn-secondary:focus { + color: #333; + text-shadow: none; + background-color: #e1e0e2; + border: .05rem solid #e1e0e2; +} + +.cover-container { + max-width: 42em; +} + +.masthead { + display: flex; + justify-content: center; +} + +@media (max-width:500px) { + .masthead { + margin-top: 50px; + } +} + +.cover { + padding: 0 1.5rem; + margin-top: 3rem; + margin-bottom: 3rem; + background-color: #d7d7d7; + padding: 16px; + box-shadow: 0 1px 2px #00000010, 0 8px 12px #00000020; + border-radius: 12px; + overflow: hidden; +} + +.cover .btn-lg { + padding: .75rem 1.25rem; + font-weight: 700; +} + +@media (max-width:500px) { + .cover-heading { + font-size: 8vmin; + } +} + +@media (max-width:500px) { + .lead { + font-size: 5vmin; + } +} + +.lead { + font-weight: 400; +} + +.mastfoot { + color: #1e1f1db2; + text-align: center; +} + +a { + transition: color .25s ease-in; + color: #1e1f1d99; +} + +a:hover { + color: #1e1f1d; + text-decoration: none; +} + +.modal-header { + background-color: inherit; +} + +.modal-body { + background-color: inherit; +} + +.modal-content { + background-color: #e1e0e2b2; + box-shadow: 0 1px 2px #00000010, 0 8px 12px #00000020; + border-radius: 12px; +} + +.modal-body p { + font-weight: 300; +} + +.form-control:focus, +.form-control[readonly]:focus { + color: #1e1f1d; + background-color: #e1e0e2; + border-color: #1e1f1d; + outline: 0; + box-shadow: 0 0 0 .2rem #1e1f1d88; +} + +.form-control, +.form-control[readonly] { + color: #1e1f1d; + background-color: #ffffff5b; + border: 1px solid #1e1f1d; + transition: background-color .25s ease-in; +} + +.btn-outline-primary:hover { + color: #e1e0e2 !important; + background-color: #1e1f1d; + border-color: #1e1f1d; +} + +.btn-outline-primary:active { + color: #e1e0e2 !important; + background-color: #1e1f1d; + border-color: #1e1f1d; +} + +.btn-outline-primary { + color: #1e1f1d !important; + border-color: #1e1f1d; + background-color: #ffffff5b; + text-shadow: none; + display: inline-flex; + gap: 5px; + align-items: center; +} + +.input-group>.custom-select:not(:last-child), +.input-group>.form-control:not(:last-child) { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; +} + +.input-group>.form-control-shortenedlink:not(:last-child), +.input-group>.form-control-deletionlink:not(:last-child), +.input-group>.form-control-report:not(:last-child) { + border-top-left-radius: .0rem; + border-bottom-left-radius: .0rem; +} + +.input-group>.form-control-nobtn:not(:last-child) { + border-top-left-radius: .0rem; + border-bottom-left-radius: .0rem; + border-top-right-radius: .25rem !important; + border-bottom-right-radius: .25rem !important; +} + +.input-group-text { + color: #1e1f1d; + background-color: #ffffff5b; + border: 1px solid #1e1f1d; + text-shadow: none; + gap: 5px; +} + +.btn-outline-primary:not(:disabled):not(.disabled).active, +.btn-outline-primary:not(:disabled):not(.disabled):active, +.show>.btn-outline-primary.dropdown-toggle { + color: #e1e0e2 !important; + background-color: #1e1f1d; + border-color: #1e1f1d; +} + +.btn-outline-primary.focus, +.btn-outline-primary:focus { + box-shadow: 0 0 0 .2rem #1e1f1d88; +} + +.btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, +.show>.btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem #1e1f1d88; +} + +.nojs { + display: none; +} + +.toast { + background-color: #ffffff5b; + z-index: 999; + position: absolute; + top: 5px; + right: 5px; + box-shadow: 0 1px 2px #00000010, 0 8px 12px #00000020; + border-radius: 12px; +} + +@media (max-width: 862px) { + .toast { + margin-top: 80px; + left: 50%; + position: fixed; + transform: translate(-50%, 0px); + } +} + +.toast-header { + background-color: #e1e0e2e0; + color: #1e1f1d; +} + +.toast-body { + background-color: #e1e0e2e0; +} + +.arrow::after, +.bs-popover-bottom .arrow::after { + border-bottom-color: #e1e0e2e0 !important; +} + +.popover { + text-align: center; + background-color: #e1e0e2e0; +} + +.popover-body { + color: #1e1f1d; +} + +.fadeIn { + animation-duration: 0.6s; + animation-fill-mode: both; + animation-name: fadeIn; +} + +.bi { + font-size: inherit; + text-rendering: auto; + width: 1.28571429em; + align-self: center; + gap: 5px; +} + +.bi-fix { + display: inline-flex; +} + +.toast .bi.bi-clipboard-fill { + margin-right: 5px; +} + +.toast .bi.bi-exclamation-circle-fill { + margin-right: 5px; +} + +.btn .bi.bi-house-door-fill { + margin-right: 5px; +} + +.btn .bi.bi-arrow-left-circle-fill { + margin-right: 5px; +} + +.close { + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #1e1f1d99; + text-shadow: 0 1px 0 #e1e0e2; +} + +.close:hover { + color: #1e1f1d; + text-decoration: none; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@media (print), +(prefers-reduced-motion: reduce) { + .fadeIn { + animation-duration: 1ms !important; + transition-duration: 1ms !important; + animation-iteration-count: 1 !important; + } +} + +@media (prefers-color-scheme: dark) { + body { + background-color: #1e1f1d; + } + + .top-logo { + filter: invert(100%); + } + + .content { + color: #e1e0e2; + } + + .masthead a, + .masthead a:focus, + .masthead a:hover { + color: #e1e0e2; + } + + .btn-secondary, + .btn-secondary:hover, + .btn-secondary:focus { + background-color: #1e1f1d; + border: .05rem solid #1e1f1d; + } + + .cover { + background-color: #282828; + } + + .mastfoot { + color: #e1e0e2; + } + + a { + color: #e1e0e299; + } + + a:hover { + color: #e1e0e2; + } + + .modal-content { + background-color: #1e1f1db2; + } + + .form-control:focus, + .form-control[readonly]:focus { + color: #e1e0e2; + background-color: #1e1f1d; + border-color: #e1e0e2; + box-shadow: 0 0 0 .2rem #e1e0e288; + } + + .form-control, + .form-control[readonly] { + color: #e1e0e2; + background-color: #0000005b; + border: 1px solid #e1e0e2; + } + + .btn-outline-primary:hover { + color: #1e1f1d !important; + background-color: #e1e0e2; + border-color: #e1e0e2; + } + + .btn-outline-primary:active { + color: #1e1f1d !important; + background-color: #e1e0e2; + border-color: #e1e0e2; + } + + .btn-outline-primary { + color: #e1e0e2 !important; + border-color: #e1e0e2; + background-color: #0000005b; + } + + .input-group-text { + color: #e1e0e2; + background-color: #0000005b; + border: 1px solid #e1e0e2; + } + + .btn-outline-primary:not(:disabled):not(.disabled).active, + .btn-outline-primary:not(:disabled):not(.disabled):active, + .show>.btn-outline-primary.dropdown-toggle { + color: #1e1f1d !important; + background-color: #e1e0e2; + border-color: #e1e0e2; + } + + .btn-outline-primary.focus, + .btn-outline-primary:focus { + box-shadow: 0 0 0 .2rem #e1e0e288; + } + + .btn-outline-primary:not(:disabled):not(.disabled).active:focus, + .btn-outline-primary:not(:disabled):not(.disabled):active:focus, + .show>.btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem #e1e0e288; + } + + .modal-header { + color: #e1e0e2; + } + + .toast-header { + background-color: #1e1f1de0; + color: #e1e0e2; + } + + .toast-body { + background-color: #1e1f1de0; + color: #e1e0e2; + } + + .arrow::after, + .bs-popover-bottom .arrow::after { + border-bottom-color: #1e1f1de0 !important; + } + + .popover { + text-align: center; + background-color: #1e1f1de0; + } + + .popover-body { + color: #e1e0e2; + } + + .close { + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #e1e0e299; + text-shadow: 0 1px 0 #1e1f1db2; + } + + .close:hover { + color: #e1e0e2; + text-decoration: none; + } + +} \ No newline at end of file diff --git a/assets/fonts/varela-round-v19-latin-regular.eot b/assets/fonts/varela-round-v19-latin-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..3a296a9f942aa1d57a14cb137bf9fbae04f59b21 GIT binary patch literal 23800 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 z�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�FC)Al4tX#EL+|;%*%Ft1+ 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/varela-round-v19-latin-regular.ttf b/assets/fonts/varela-round-v19-latin-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a862fd1ba2cce23c892fc3fd2433e4c440abb73b GIT binary patch literal 53112 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 z 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

0#KdZLh~5xMO$@1tAvGyULToIR3S*Eaa$6*h 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 H9RL6TQXH+~ literal 0 HcmV?d00001 diff --git a/assets/img/android-chrome-144x144.png b/assets/img/android-chrome-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..91251facb45ff1802a9560f3cdadd11a463b3b4c GIT binary patch literal 4554 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 literal 0 HcmV?d00001 diff --git a/assets/img/android-chrome-192x192.png b/assets/img/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..3656c14508656db2ad2382c2f0228cf08d4516f1 GIT binary patch literal 7372 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 literal 0 HcmV?d00001 diff --git a/assets/img/android-chrome-36x36.png b/assets/img/android-chrome-36x36.png new file mode 100644 index 0000000000000000000000000000000000000000..77380ba532b88f4041c58c3c7e88a75ee4fb305c GIT binary patch literal 991 zcmV<510ei~P)Xp=@&TSffn&;}ERv?ObZ6^R%oD!Ie4aA4nM zAa)!AzO&D?{jBHb@k`(D^W2ZeLq*!!Lq6af@G0d{!=e6W^Ve^LfL$1DNCT4(e5e8l?`c)ec6uZ&SB6zm7Rn!ka!)^h7l z#Pc@I1L1lwLxXAFedj%nAAgr}4+r=%vQgw*6Yps!v`^z9g%o0}Mh zK_n7!gE|WQC8Q=V16^(~=Tiyh=4XjT&$>kggw*5&5O9N8dAveCpJ(~uGO=jP4XQ;* zO@_C*x1-$_30`-J-y7_ouj`m zZacWGYTJo2>)o!LlsJn5Cur3=DlzUQGvly{ngm_ll@ z4~L&Yb||M?yGrsxYBEX@OnLrjgQugDIdrDKM$-bQ2+Un-ZOBpmh98f`Ro7y N002ovPDHLkV1kMM&|m-n literal 0 HcmV?d00001 diff --git a/assets/img/android-chrome-48x48.png b/assets/img/android-chrome-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..6865572ba72a6a18c6609399bbbeb23498e8e885 GIT binary patch literal 1409 zcmV-{1%CR8P)#6kDf`fIs?Z zfmUCw`c^eWv=#f)AMJEhh(1>P2ej7u+yTc{c&Mm|)9FYw3ITs)Kr`-Ytp+yR2h1jc zKz28~OnaV^oqNyyeD~gS?%lI1ki{x0%L{=E@PDN3501=?7stVvJ;CEsq0AIC_Q$L;N^r!zV2zq8y*kXNWl8{X43v z+EZXhK(=g?3qEPtM2w6Kb8X<7Wq5!Wtag|!V9lDQX&gMXpJ?SCY;wo0r~m2|?%cU!x}WJ8FxI>a@bl--=jf3RmcPE7yZ7$0anlE;`-)~7 z*$G&)mJSc_@Zm#C{c{SKOZcIoA@;U?V#&v>0`kc=xokT8AUj*O8+$@QK>_vk4J>+f z(X4)Ei~%PfzY;FXy=bEfD@Lz!kc>3(wjPO|n%vH8A z13x-C%I-b8X7!mNV6Fo;7yJ(Yc4JQvMUmRKYFW5&VTNBL1|&)1$l-QZ-~o2;+A{@y zy9xN)27KGzeXL*i9uHyAKFP%NMCzT~AR_5kB8yyk0LoJ>8C!MJ`0#<#b(h~4SP27InNpEOg?19K4*Wn~KhYw%#tHJg8|qqY=OPyG*ha)Wns-{6VQgu;;t1DR(DvF z7MEm?yqP@8>t;l_1P>6AWRJX(JYR6kCPEMdx8MOfg^J4Z4}l+@@RsfDq-k14z&Z#I zu+j0Cd{adv%?0=&V40*SswR8n2(ZZsuTz&3xB?Hbc{noimjqB+`tpE|?g3Uf;W;T{ z)w`>B`t%vCtpTUug9%MPrmAY{TZxLwauJ8$)=QFvAP7uMI9ebG0=tGIBMC^$|B9mO z^Ij?bRZ2*I0&nBM_Y%6UlSm};b(6GV;3I7!5xhNe+t_4;Y%Tv!pWFNk1r*8}>fQl* P00000NkvXXu0mjfzS5jn literal 0 HcmV?d00001 diff --git a/assets/img/android-chrome-72x72.png b/assets/img/android-chrome-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..9663802b03da60483f863341a8b8f2eb94d7205f GIT binary patch literal 2119 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 KMNUMnLSTZ$1B&|q literal 0 HcmV?d00001 diff --git a/assets/img/apple-touch-icon-120x120.png b/assets/img/apple-touch-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6c3a20ec990e53e7fe08da81604aadc51e5099 GIT binary patch literal 3764 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 literal 0 HcmV?d00001 diff --git a/assets/img/apple-touch-icon-180x180.png b/assets/img/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..71334e9252a23e3b74d724607406e6eaaa95dd54 GIT binary patch literal 5873 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 N002ovPDHLkV1k^|%sc=9 literal 0 HcmV?d00001 diff --git a/assets/img/apple-touch-icon.png b/assets/img/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c6225dcc40596a82922d52c697b0d6e05cf40634 GIT binary patch literal 1679 zcmV;A25|X_P)`^*1*-}9XJyvM*4vgKMA0Lz^FkZ)m8vF25eJ;l|kBUHZTO=0h~aVKJ8Og_kfKC zjQc$vPxzoo`e3zMF&NniG@((KwApegUs1vEu%FwvZ)=ev11N`JP!zL&_WSPulORQl z@HWt_MP`7)fT6W!I8Yt09K2cFO(V?jY7 z&5bQ&XJ?0xjf{-2W$SzNx%;$82`~yg>-7x$DNQQ%XarcO00>||+U^ecdt z;c{Kj1k@ymLOn2Bt%%BiABF)XDT8X_=q!^U3ZI}-RTHa=MgmIG$V=$hSKrNz$Q>Ra*(>x%}8dVuE zaR(!Hx;F&0WBX1rGBQ-Fh77h`YcQ2RraA@_k#(LGK@hmqcPZ^ykRqho4#v}}m9MdA z(IPqyc5v<5)ujKQbaz!M)wBd$zitCnRjUD5upo~$Yu`*dMpBSkc2Om*uiik_8>_?L z{VCpqCR_yQ4OqQS4(RoIsNG$YQmlj^rvq?xl^k%>yPFsq8cHc%T*$`*aHFg!uvjcK zHMa28mtV7RVL{xOQ$ju-fN}>d77KftTUq?vV)FCyW#`9I%!xy5aL{fqrM9MytgKmxqDaXLcG>ST$TMfpFfwvC{Jnfd1!azx z)FD#P@#8-d33na-|GS|c5_mr}c{j*N`Z96CBW%Gq;gWqG0s^rE6-ni`rg zn?uV!K2uUnSPS<3VlaoVhi!)rVB?|~iJ|38k$w-(Zqy-2mEH3NqsBh56*w`4O zqa!plewxxUWyTB;?XhbBQ3HlWg;fn*&`rPxkE|C$6* zSdNOjKN7u;>foTHUrmB2%mY*{S>l1}JElO%SPw_d*JRr+9qc3mF8ikidH( Z{{demNKph~3BmvX002ovPDHLkV1iQi1eO2* literal 0 HcmV?d00001 diff --git a/assets/img/favicon-16x16.png b/assets/img/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..2656a77546a750b6f403218b96bb613b13afc282 GIT binary patch literal 480 zcmV<60U!Q}P)LlRZnrP!xurG@Y9ST}n}lj;`4iL>;t3>!$t!zYw&O zm=9M!v8|iB`yBDfNQnK3gH7aBoyg|CHmqv%c)d6buNQQFQWv0-uRqO?Km z?R~)f%l6#!edoXDKj;2}6;V~~-3>GY`+?1XgY^jwm(hyuw}n5%G8mu@IBx|i zga9Cy%UPBA1GqSym?^^AfD2aOQcC)I`|0nyg`y}{1RTq(HULpo?cD{uu?p|H+KtcW z17KoeoaS&7>2%tPhz9I&N=04*ey{_7_-Kgt??(yv>k0S+JbV6>Y&L6lDgkV8N=5bn z(hfY<(awwb3*2tEU5QGkROFRq8_RG_(*TISjN6r{a7snCtp#3))e^&xhgn)$GMZW# zZoJj-_SpAu$d_VAXN(6!gKXKdl`5~-XzIK{Rkc^Qh|R3LR8&@0l1wJ4-B!!|r+F3^ z7j?(#X232SAel@OYzWcU+s}#PC(Dj4DX}ql6mQaE1{{w351OV~y6ZUN~HjB zN=5z#kj-X!_WUV+e}I6$9=F>~{AJv-K>Otwz8aq?_%{OUCGjQug^`gF{`vQBLpbOh z#q0GtS|d?H!A4y;=$wS)$L$zZWdKlb;p*yj;&@w2tjKk%KdwT)Ya`^bo5PeU>wK6f|l#1L5>@hRCltjQ^Zx;@5 z*H&Y)vN`~}@O)#E$^7?OD$)t;Gy7yA6F>dvCzVdo5^1su2l#zDF>_~4&8b5;Kw#s_g&F=r7+w)oA39H)kuhcv$y4$eot^fc407*qoM6N<$f;_dcxc~qF literal 0 HcmV?d00001 diff --git a/assets/img/favicon-96x96.png b/assets/img/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a92f7abeb71e3888631f76edd66ded48fd46ed GIT binary patch literal 2912 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 KMNUMnLSTZ$1B&|q literal 0 HcmV?d00001 diff --git a/assets/includes/config.example.php b/assets/includes/config.example.php new file mode 100755 index 0000000..6d797bc --- /dev/null +++ b/assets/includes/config.example.php @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/assets/includes/footer.php b/assets/includes/footer.php new file mode 100755 index 0000000..5a88265 --- /dev/null +++ b/assets/includes/footer.php @@ -0,0 +1,53 @@ + +

+ + + + + + + + + diff --git a/assets/includes/header.php b/assets/includes/header.php new file mode 100755 index 0000000..a9472ab --- /dev/null +++ b/assets/includes/header.php @@ -0,0 +1,111 @@ + + + + + + + + + <?php if (isset($pagename)) { + echo $translate->__($pagename) . " • " . $name; + } else { + echo $name; + } ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ \ No newline at end of file diff --git a/assets/includes/modalotoast.php b/assets/includes/modalotoast.php new file mode 100755 index 0000000..31fbd51 --- /dev/null +++ b/assets/includes/modalotoast.php @@ -0,0 +1,82 @@ + + +
+
+ __("Link copied!"); ?> +
+
+
+ __("Your shortened link has been successfully copied to your clipboard."); ?> +
+
+
+
+
+ __("Unable to copy your link..."); ?> +
+
+
+ __("An error occurred on copying the shortened link to your clipboard."); ?> +
+
+
+
+
+ __("Deletion link copied!"); ?> +
+
+
+ __("Your deletion link has been successfully copied to your clipboard."); ?> +
+
+
+
+
+ __("Unable to copy your deletion link..."); ?> +
+
+
+ __("An error occurred on copying the deletion link to your clipboard."); ?> +
+
+
+ + + \ No newline at end of file diff --git a/assets/js/bootstrap.bundle.min.js b/assets/js/bootstrap.bundle.min.js new file mode 100644 index 0000000..b920656 --- /dev/null +++ b/assets/js/bootstrap.bundle.min.js @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.6.2 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap={},t.jQuery)}(this,(function(t,e){"use strict";function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var i=n(e);function o(t,e){for(var n=0;n=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};u.jQueryDetection(),i.default.fn.emulateTransitionEnd=function(t){var e=this,n=!1;return i.default(this).one(u.TRANSITION_END,(function(){n=!0})),setTimeout((function(){n||u.triggerTransitionEnd(e)}),t),this},i.default.event.special[u.TRANSITION_END]={bindType:l,delegateType:l,handle:function(t){if(i.default(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var f="bs.alert",d=i.default.fn.alert,c=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){i.default.removeData(this._element,f),this._element=null},e._getRootElement=function(t){var e=u.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=i.default(t).closest(".alert")[0]),n},e._triggerCloseEvent=function(t){var e=i.default.Event("close.bs.alert");return i.default(t).trigger(e),e},e._removeElement=function(t){var e=this;if(i.default(t).removeClass("show"),i.default(t).hasClass("fade")){var n=u.getTransitionDurationFromElement(t);i.default(t).one(u.TRANSITION_END,(function(n){return e._destroyElement(t,n)})).emulateTransitionEnd(n)}else this._destroyElement(t)},e._destroyElement=function(t){i.default(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data(f);o||(o=new t(this),n.data(f,o)),"close"===e&&o[e](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},r(t,null,[{key:"VERSION",get:function(){return"4.6.2"}}]),t}();i.default(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',c._handleDismiss(new c)),i.default.fn.alert=c._jQueryInterface,i.default.fn.alert.Constructor=c,i.default.fn.alert.noConflict=function(){return i.default.fn.alert=d,c._jQueryInterface};var h="bs.button",p=i.default.fn.button,m="active",g='[data-toggle^="button"]',_='input:not([type="hidden"])',v=".btn",b=function(){function t(t){this._element=t,this.shouldAvoidTriggerChange=!1}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=i.default(this._element).closest('[data-toggle="buttons"]')[0];if(n){var o=this._element.querySelector(_);if(o){if("radio"===o.type)if(o.checked&&this._element.classList.contains(m))t=!1;else{var r=n.querySelector(".active");r&&i.default(r).removeClass(m)}t&&("checkbox"!==o.type&&"radio"!==o.type||(o.checked=!this._element.classList.contains(m)),this.shouldAvoidTriggerChange||i.default(o).trigger("change")),o.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(m)),t&&i.default(this._element).toggleClass(m))},e.dispose=function(){i.default.removeData(this._element,h),this._element=null},t._jQueryInterface=function(e,n){return this.each((function(){var o=i.default(this),r=o.data(h);r||(r=new t(this),o.data(h,r)),r.shouldAvoidTriggerChange=n,"toggle"===e&&r[e]()}))},r(t,null,[{key:"VERSION",get:function(){return"4.6.2"}}]),t}();i.default(document).on("click.bs.button.data-api",g,(function(t){var e=t.target,n=e;if(i.default(e).hasClass("btn")||(e=i.default(e).closest(v)[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var o=e.querySelector(_);if(o&&(o.hasAttribute("disabled")||o.classList.contains("disabled")))return void t.preventDefault();"INPUT"!==n.tagName&&"LABEL"===e.tagName||b._jQueryInterface.call(i.default(e),"toggle","INPUT"===n.tagName)}})).on("focus.bs.button.data-api blur.bs.button.data-api",g,(function(t){var e=i.default(t.target).closest(v)[0];i.default(e).toggleClass("focus",/^focus(in)?$/.test(t.type))})),i.default(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=t.prototype;return e.next=function(){this._isSliding||this._slide(C)},e.nextWhenVisible=function(){var t=i.default(this._element);!document.hidden&&t.is(":visible")&&"hidden"!==t.css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(S)},e.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(u.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(t){var e=this;this._activeElement=this._element.querySelector(D);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)i.default(this._element).one(N,(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var o=t>n?C:S;this._slide(o,this._items[t])}},e.dispose=function(){i.default(this._element).off(".bs.carousel"),i.default.removeData(this._element,E),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(t){return t=a({},A,t),u.typeCheckConfig(y,t,k),t},e._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&i.default(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&i.default(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var e=function(e){t._pointerEvent&&I[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},n=function(e){t._pointerEvent&&I[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};i.default(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(i.default(this._element).on("pointerdown.bs.carousel",(function(t){return e(t)})),i.default(this._element).on("pointerup.bs.carousel",(function(t){return n(t)})),this._element.classList.add("pointer-event")):(i.default(this._element).on("touchstart.bs.carousel",(function(t){return e(t)})),i.default(this._element).on("touchmove.bs.carousel",(function(e){return function(e){t.touchDeltaX=e.originalEvent.touches&&e.originalEvent.touches.length>1?0:e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),i.default(this._element).on("touchend.bs.carousel",(function(t){return n(t)})))}},e._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},e._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},e._getItemByDirection=function(t,e){var n=t===C,i=t===S,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var a=(o+(t===S?-1:1))%this._items.length;return-1===a?this._items[this._items.length-1]:this._items[a]},e._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),o=this._getItemIndex(this._element.querySelector(D)),r=i.default.Event("slide.bs.carousel",{relatedTarget:t,direction:e,from:o,to:n});return i.default(this._element).trigger(r),r},e._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));i.default(e).removeClass(T);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&i.default(n).addClass(T)}},e._updateInterval=function(){var t=this._activeElement||this._element.querySelector(D);if(t){var e=parseInt(t.getAttribute("data-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}},e._slide=function(t,e){var n,o,r,a=this,s=this._element.querySelector(D),l=this._getItemIndex(s),f=e||s&&this._getItemByDirection(t,s),d=this._getItemIndex(f),c=Boolean(this._interval);if(t===C?(n="carousel-item-left",o="carousel-item-next",r="left"):(n="carousel-item-right",o="carousel-item-prev",r="right"),f&&i.default(f).hasClass(T))this._isSliding=!1;else if(!this._triggerSlideEvent(f,r).isDefaultPrevented()&&s&&f){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(f),this._activeElement=f;var h=i.default.Event(N,{relatedTarget:f,direction:r,from:l,to:d});if(i.default(this._element).hasClass("slide")){i.default(f).addClass(o),u.reflow(f),i.default(s).addClass(n),i.default(f).addClass(n);var p=u.getTransitionDurationFromElement(s);i.default(s).one(u.TRANSITION_END,(function(){i.default(f).removeClass(n+" "+o).addClass(T),i.default(s).removeClass("active "+o+" "+n),a._isSliding=!1,setTimeout((function(){return i.default(a._element).trigger(h)}),0)})).emulateTransitionEnd(p)}else i.default(s).removeClass(T),i.default(f).addClass(T),this._isSliding=!1,i.default(this._element).trigger(h);c&&this.cycle()}},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this).data(E),o=a({},A,i.default(this).data());"object"==typeof e&&(o=a({},o,e));var r="string"==typeof e?e:o.slide;if(n||(n=new t(this,o),i.default(this).data(E,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if("undefined"==typeof n[r])throw new TypeError('No method named "'+r+'"');n[r]()}else o.interval&&o.ride&&(n.pause(),n.cycle())}))},t._dataApiClickHandler=function(e){var n=u.getSelectorFromElement(this);if(n){var o=i.default(n)[0];if(o&&i.default(o).hasClass("carousel")){var r=a({},i.default(o).data(),i.default(this).data()),s=this.getAttribute("data-slide-to");s&&(r.interval=!1),t._jQueryInterface.call(i.default(o),r),s&&i.default(o).data(E).to(s),e.preventDefault()}}},r(t,null,[{key:"VERSION",get:function(){return"4.6.2"}},{key:"Default",get:function(){return A}}]),t}();i.default(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",O._dataApiClickHandler),i.default(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),e=0,n=t.length;e0&&(this._selector=a,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=t.prototype;return e.toggle=function(){i.default(this._element).hasClass(P)?this.hide():this.show()},e.show=function(){var e,n,o=this;if(!(this._isTransitioning||i.default(this._element).hasClass(P)||(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof o._config.parent?t.getAttribute("data-parent")===o._config.parent:t.classList.contains(F)}))).length&&(e=null),e&&(n=i.default(e).not(this._selector).data(j))&&n._isTransitioning))){var r=i.default.Event("show.bs.collapse");if(i.default(this._element).trigger(r),!r.isDefaultPrevented()){e&&(t._jQueryInterface.call(i.default(e).not(this._selector),"hide"),n||i.default(e).data(j,null));var a=this._getDimension();i.default(this._element).removeClass(F).addClass(R),this._element.style[a]=0,this._triggerArray.length&&i.default(this._triggerArray).removeClass(B).attr("aria-expanded",!0),this.setTransitioning(!0);var s="scroll"+(a[0].toUpperCase()+a.slice(1)),l=u.getTransitionDurationFromElement(this._element);i.default(this._element).one(u.TRANSITION_END,(function(){i.default(o._element).removeClass(R).addClass("collapse show"),o._element.style[a]="",o.setTransitioning(!1),i.default(o._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(l),this._element.style[a]=this._element[s]+"px"}}},e.hide=function(){var t=this;if(!this._isTransitioning&&i.default(this._element).hasClass(P)){var e=i.default.Event("hide.bs.collapse");if(i.default(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",u.reflow(this._element),i.default(this._element).addClass(R).removeClass("collapse show");var o=this._triggerArray.length;if(o>0)for(var r=0;r=0)return 1;return 0}(),Y=U&&window.Promise?function(t){var e=!1;return function(){e||(e=!0,window.Promise.resolve().then((function(){e=!1,t()})))}}:function(t){var e=!1;return function(){e||(e=!0,setTimeout((function(){e=!1,t()}),V))}};function z(t){return t&&"[object Function]"==={}.toString.call(t)}function K(t,e){if(1!==t.nodeType)return[];var n=t.ownerDocument.defaultView.getComputedStyle(t,null);return e?n[e]:n}function X(t){return"HTML"===t.nodeName?t:t.parentNode||t.host}function G(t){if(!t)return document.body;switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var e=K(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?t:G(X(t))}function $(t){return t&&t.referenceNode?t.referenceNode:t}var J=U&&!(!window.MSInputMethodContext||!document.documentMode),Z=U&&/MSIE 10/.test(navigator.userAgent);function tt(t){return 11===t?J:10===t?Z:J||Z}function et(t){if(!t)return document.documentElement;for(var e=tt(10)?document.body:null,n=t.offsetParent||null;n===e&&t.nextElementSibling;)n=(t=t.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===K(n,"position")?et(n):n:t?t.ownerDocument.documentElement:document.documentElement}function nt(t){return null!==t.parentNode?nt(t.parentNode):t}function it(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.documentElement;var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?t:e,o=n?e:t,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var a,s,l=r.commonAncestorContainer;if(t!==l&&e!==l||i.contains(o))return"BODY"===(s=(a=l).nodeName)||"HTML"!==s&&et(a.firstElementChild)!==a?et(l):l;var u=nt(t);return u.host?it(u.host,e):it(t,nt(e).host)}function ot(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"top",n="top"===e?"scrollTop":"scrollLeft",i=t.nodeName;if("BODY"===i||"HTML"===i){var o=t.ownerDocument.documentElement,r=t.ownerDocument.scrollingElement||o;return r[n]}return t[n]}function rt(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=ot(e,"top"),o=ot(e,"left"),r=n?-1:1;return t.top+=i*r,t.bottom+=i*r,t.left+=o*r,t.right+=o*r,t}function at(t,e){var n="x"===e?"Left":"Top",i="Left"===n?"Right":"Bottom";return parseFloat(t["border"+n+"Width"])+parseFloat(t["border"+i+"Width"])}function st(t,e,n,i){return Math.max(e["offset"+t],e["scroll"+t],n["client"+t],n["offset"+t],n["scroll"+t],tt(10)?parseInt(n["offset"+t])+parseInt(i["margin"+("Height"===t?"Top":"Left")])+parseInt(i["margin"+("Height"===t?"Bottom":"Right")]):0)}function lt(t){var e=t.body,n=t.documentElement,i=tt(10)&&getComputedStyle(n);return{height:st("Height",e,n,i),width:st("Width",e,n,i)}}var ut=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},ft=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2],i=tt(10),o="HTML"===e.nodeName,r=pt(t),a=pt(e),s=G(t),l=K(e),u=parseFloat(l.borderTopWidth),f=parseFloat(l.borderLeftWidth);n&&o&&(a.top=Math.max(a.top,0),a.left=Math.max(a.left,0));var d=ht({top:r.top-a.top-u,left:r.left-a.left-f,width:r.width,height:r.height});if(d.marginTop=0,d.marginLeft=0,!i&&o){var c=parseFloat(l.marginTop),h=parseFloat(l.marginLeft);d.top-=u-c,d.bottom-=u-c,d.left-=f-h,d.right-=f-h,d.marginTop=c,d.marginLeft=h}return(i&&!n?e.contains(s):e===s&&"BODY"!==s.nodeName)&&(d=rt(d,e)),d}function gt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=t.ownerDocument.documentElement,i=mt(t,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),a=e?0:ot(n),s=e?0:ot(n,"left"),l={top:a-i.top+i.marginTop,left:s-i.left+i.marginLeft,width:o,height:r};return ht(l)}function _t(t){var e=t.nodeName;if("BODY"===e||"HTML"===e)return!1;if("fixed"===K(t,"position"))return!0;var n=X(t);return!!n&&_t(n)}function vt(t){if(!t||!t.parentElement||tt())return document.documentElement;for(var e=t.parentElement;e&&"none"===K(e,"transform");)e=e.parentElement;return e||document.documentElement}function bt(t,e,n,i){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},a=o?vt(t):it(t,$(e));if("viewport"===i)r=gt(a,o);else{var s=void 0;"scrollParent"===i?"BODY"===(s=G(X(e))).nodeName&&(s=t.ownerDocument.documentElement):s="window"===i?t.ownerDocument.documentElement:i;var l=mt(s,a,o);if("HTML"!==s.nodeName||_t(a))r=l;else{var u=lt(t.ownerDocument),f=u.height,d=u.width;r.top+=l.top-l.marginTop,r.bottom=f+l.top,r.left+=l.left-l.marginLeft,r.right=d+l.left}}var c="number"==typeof(n=n||0);return r.left+=c?n:n.left||0,r.top+=c?n:n.top||0,r.right-=c?n:n.right||0,r.bottom-=c?n:n.bottom||0,r}function yt(t){return t.width*t.height}function Et(t,e,n,i,o){var r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(-1===t.indexOf("auto"))return t;var a=bt(n,i,r,o),s={top:{width:a.width,height:e.top-a.top},right:{width:a.right-e.right,height:a.height},bottom:{width:a.width,height:a.bottom-e.bottom},left:{width:e.left-a.left,height:a.height}},l=Object.keys(s).map((function(t){return ct({key:t},s[t],{area:yt(s[t])})})).sort((function(t,e){return e.area-t.area})),u=l.filter((function(t){var e=t.width,i=t.height;return e>=n.clientWidth&&i>=n.clientHeight})),f=u.length>0?u[0].key:l[0].key,d=t.split("-")[1];return f+(d?"-"+d:"")}function wt(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o=i?vt(e):it(e,$(n));return mt(n,o,i)}function Tt(t){var e=t.ownerDocument.defaultView.getComputedStyle(t),n=parseFloat(e.marginTop||0)+parseFloat(e.marginBottom||0),i=parseFloat(e.marginLeft||0)+parseFloat(e.marginRight||0);return{width:t.offsetWidth+i,height:t.offsetHeight+n}}function Ct(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"};return t.replace(/left|right|bottom|top/g,(function(t){return e[t]}))}function St(t,e,n){n=n.split("-")[0];var i=Tt(t),o={width:i.width,height:i.height},r=-1!==["right","left"].indexOf(n),a=r?"top":"left",s=r?"left":"top",l=r?"height":"width",u=r?"width":"height";return o[a]=e[a]+e[l]/2-i[l]/2,o[s]=n===s?e[s]-i[u]:e[Ct(s)],o}function Nt(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}function Dt(t,e,n){return(void 0===n?t:t.slice(0,function(t,e,n){if(Array.prototype.findIndex)return t.findIndex((function(t){return t.name===n}));var i=Nt(t,(function(t){return t.name===n}));return t.indexOf(i)}(t,0,n))).forEach((function(t){t.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var n=t.function||t.fn;t.enabled&&z(n)&&(e.offsets.popper=ht(e.offsets.popper),e.offsets.reference=ht(e.offsets.reference),e=n(e,t))})),e}function At(){if(!this.state.isDestroyed){var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};t.offsets.reference=wt(this.state,this.popper,this.reference,this.options.positionFixed),t.placement=Et(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),t.originalPlacement=t.placement,t.positionFixed=this.options.positionFixed,t.offsets.popper=St(this.popper,t.offsets.reference,t.placement),t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",t=Dt(this.modifiers,t),this.state.isCreated?this.options.onUpdate(t):(this.state.isCreated=!0,this.options.onCreate(t))}}function kt(t,e){return t.some((function(t){var n=t.name;return t.enabled&&n===e}))}function It(t){for(var e=[!1,"ms","Webkit","Moz","O"],n=t.charAt(0).toUpperCase()+t.slice(1),i=0;i1&&void 0!==arguments[1]&&arguments[1],n=Qt.indexOf(t),i=Qt.slice(n+1).concat(Qt.slice(0,n));return e?i.reverse():i}var Ut={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(t){var e=t.placement,n=e.split("-")[0],i=e.split("-")[1];if(i){var o=t.offsets,r=o.reference,a=o.popper,s=-1!==["bottom","top"].indexOf(n),l=s?"left":"top",u=s?"width":"height",f={start:dt({},l,r[l]),end:dt({},l,r[l]+r[u]-a[u])};t.offsets.popper=ct({},a,f[i])}return t}},offset:{order:200,enabled:!0,fn:function(t,e){var n,i=e.offset,o=t.placement,r=t.offsets,a=r.popper,s=r.reference,l=o.split("-")[0];return n=Rt(+i)?[+i,0]:function(t,e,n,i){var o=[0,0],r=-1!==["right","left"].indexOf(i),a=t.split(/(\+|\-)/).map((function(t){return t.trim()})),s=a.indexOf(Nt(a,(function(t){return-1!==t.search(/,|\s/)})));a[s]&&-1===a[s].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,u=-1!==s?[a.slice(0,s).concat([a[s].split(l)[0]]),[a[s].split(l)[1]].concat(a.slice(s+1))]:[a];return u=u.map((function(t,i){var o=(1===i?!r:r)?"height":"width",a=!1;return t.reduce((function(t,e){return""===t[t.length-1]&&-1!==["+","-"].indexOf(e)?(t[t.length-1]=e,a=!0,t):a?(t[t.length-1]+=e,a=!1,t):t.concat(e)}),[]).map((function(t){return function(t,e,n,i){var o=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],a=o[2];return r?0===a.indexOf("%")?ht("%p"===a?n:i)[e]/100*r:"vh"===a||"vw"===a?("vh"===a?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r:r:t}(t,o,e,n)}))})),u.forEach((function(t,e){t.forEach((function(n,i){Rt(n)&&(o[e]+=n*("-"===t[i-1]?-1:1))}))})),o}(i,a,s,l),"left"===l?(a.top+=n[0],a.left-=n[1]):"right"===l?(a.top+=n[0],a.left+=n[1]):"top"===l?(a.left+=n[0],a.top-=n[1]):"bottom"===l&&(a.left+=n[0],a.top+=n[1]),t.popper=a,t},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(t,e){var n=e.boundariesElement||et(t.instance.popper);t.instance.reference===n&&(n=et(n));var i=It("transform"),o=t.instance.popper.style,r=o.top,a=o.left,s=o[i];o.top="",o.left="",o[i]="";var l=bt(t.instance.popper,t.instance.reference,e.padding,n,t.positionFixed);o.top=r,o.left=a,o[i]=s,e.boundaries=l;var u=e.priority,f=t.offsets.popper,d={primary:function(t){var n=f[t];return f[t]l[t]&&!e.escapeWithReference&&(i=Math.min(f[n],l[t]-("right"===t?f.width:f.height))),dt({},n,i)}};return u.forEach((function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";f=ct({},f,d[e](t))})),t.offsets.popper=f,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split("-")[0],r=Math.floor,a=-1!==["top","bottom"].indexOf(o),s=a?"right":"bottom",l=a?"left":"top",u=a?"width":"height";return n[s]r(i[s])&&(t.offsets.popper[l]=r(i[s])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!Mt(t.instance.modifiers,"arrow","keepTogether"))return t;var i=e.element;if("string"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],r=t.offsets,a=r.popper,s=r.reference,l=-1!==["left","right"].indexOf(o),u=l?"height":"width",f=l?"Top":"Left",d=f.toLowerCase(),c=l?"left":"top",h=l?"bottom":"right",p=Tt(i)[u];s[h]-pa[h]&&(t.offsets.popper[d]+=s[d]+p-a[h]),t.offsets.popper=ht(t.offsets.popper);var m=s[d]+s[u]/2-p/2,g=K(t.instance.popper),_=parseFloat(g["margin"+f]),v=parseFloat(g["border"+f+"Width"]),b=m-t.offsets.popper[d]-_-v;return b=Math.max(Math.min(a[u]-p,b),0),t.arrowElement=i,t.offsets.arrow=(dt(n={},d,Math.round(b)),dt(n,c,""),n),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(t,e){if(kt(t.instance.modifiers,"inner"))return t;if(t.flipped&&t.placement===t.originalPlacement)return t;var n=bt(t.instance.popper,t.instance.reference,e.padding,e.boundariesElement,t.positionFixed),i=t.placement.split("-")[0],o=Ct(i),r=t.placement.split("-")[1]||"",a=[];switch(e.behavior){case"flip":a=[i,o];break;case"clockwise":a=Wt(i);break;case"counterclockwise":a=Wt(i,!0);break;default:a=e.behavior}return a.forEach((function(s,l){if(i!==s||a.length===l+1)return t;i=t.placement.split("-")[0],o=Ct(i);var u=t.offsets.popper,f=t.offsets.reference,d=Math.floor,c="left"===i&&d(u.right)>d(f.left)||"right"===i&&d(u.left)d(f.top)||"bottom"===i&&d(u.top)d(n.right),m=d(u.top)d(n.bottom),_="left"===i&&h||"right"===i&&p||"top"===i&&m||"bottom"===i&&g,v=-1!==["top","bottom"].indexOf(i),b=!!e.flipVariations&&(v&&"start"===r&&h||v&&"end"===r&&p||!v&&"start"===r&&m||!v&&"end"===r&&g),y=!!e.flipVariationsByContent&&(v&&"start"===r&&p||v&&"end"===r&&h||!v&&"start"===r&&g||!v&&"end"===r&&m),E=b||y;(c||_||E)&&(t.flipped=!0,(c||_)&&(i=a[l+1]),E&&(r=function(t){return"end"===t?"start":"start"===t?"end":t}(r)),t.placement=i+(r?"-"+r:""),t.offsets.popper=ct({},t.offsets.popper,St(t.instance.popper,t.offsets.reference,t.placement)),t=Dt(t.instance.modifiers,t,"flip"))})),t},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split("-")[0],i=t.offsets,o=i.popper,r=i.reference,a=-1!==["left","right"].indexOf(n),s=-1===["top","left"].indexOf(n);return o[a?"left":"top"]=r[n]-(s?o[a?"width":"height"]:0),t.placement=Ct(e),t.offsets.popper=ht(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!Mt(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,n=Nt(t.instance.modifiers,(function(t){return"preventOverflow"===t.name})).boundaries;if(e.bottomn.right||e.top>n.bottom||e.right2&&void 0!==arguments[2]?arguments[2]:{};ut(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(i.update)},this.update=Y(this.update.bind(this)),this.options=ct({},t.Defaults,o),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(ct({},t.Defaults.modifiers,o.modifiers)).forEach((function(e){i.options.modifiers[e]=ct({},t.Defaults.modifiers[e]||{},o.modifiers?o.modifiers[e]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(t){return ct({name:t},i.options.modifiers[t])})).sort((function(t,e){return t.order-e.order})),this.modifiers.forEach((function(t){t.enabled&&z(t.onLoad)&&t.onLoad(i.reference,i.popper,i.options,t,i.state)})),this.update();var r=this.options.eventsEnabled;r&&this.enableEventListeners(),this.state.eventsEnabled=r}return ft(t,[{key:"update",value:function(){return At.call(this)}},{key:"destroy",value:function(){return Ot.call(this)}},{key:"enableEventListeners",value:function(){return Pt.call(this)}},{key:"disableEventListeners",value:function(){return Ft.call(this)}}]),t}();Vt.Utils=("undefined"!=typeof window?window:global).PopperUtils,Vt.placements=qt,Vt.Defaults=Ut;var Yt=Vt,zt="dropdown",Kt="bs.dropdown",Xt=i.default.fn[zt],Gt=new RegExp("38|40|27"),$t="disabled",Jt="show",Zt="dropdown-menu-right",te="hide.bs.dropdown",ee="hidden.bs.dropdown",ne="click.bs.dropdown.data-api",ie="keydown.bs.dropdown.data-api",oe='[data-toggle="dropdown"]',re=".dropdown-menu",ae={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic",popperConfig:null},se={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string",popperConfig:"(null|object)"},le=function(){function t(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var e=t.prototype;return e.toggle=function(){if(!this._element.disabled&&!i.default(this._element).hasClass($t)){var e=i.default(this._menu).hasClass(Jt);t._clearMenus(),e||this.show(!0)}},e.show=function(e){if(void 0===e&&(e=!1),!(this._element.disabled||i.default(this._element).hasClass($t)||i.default(this._menu).hasClass(Jt))){var n={relatedTarget:this._element},o=i.default.Event("show.bs.dropdown",n),r=t._getParentFromElement(this._element);if(i.default(r).trigger(o),!o.isDefaultPrevented()){if(!this._inNavbar&&e){if("undefined"==typeof Yt)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");var a=this._element;"parent"===this._config.reference?a=r:u.isElement(this._config.reference)&&(a=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(a=this._config.reference[0])),"scrollParent"!==this._config.boundary&&i.default(r).addClass("position-static"),this._popper=new Yt(a,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===i.default(r).closest(".navbar-nav").length&&i.default(document.body).children().on("mouseover",null,i.default.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),i.default(this._menu).toggleClass(Jt),i.default(r).toggleClass(Jt).trigger(i.default.Event("shown.bs.dropdown",n))}}},e.hide=function(){if(!this._element.disabled&&!i.default(this._element).hasClass($t)&&i.default(this._menu).hasClass(Jt)){var e={relatedTarget:this._element},n=i.default.Event(te,e),o=t._getParentFromElement(this._element);i.default(o).trigger(n),n.isDefaultPrevented()||(this._popper&&this._popper.destroy(),i.default(this._menu).toggleClass(Jt),i.default(o).toggleClass(Jt).trigger(i.default.Event(ee,e)))}},e.dispose=function(){i.default.removeData(this._element,Kt),i.default(this._element).off(".bs.dropdown"),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},e.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},e._addEventListeners=function(){var t=this;i.default(this._element).on("click.bs.dropdown",(function(e){e.preventDefault(),e.stopPropagation(),t.toggle()}))},e._getConfig=function(t){return t=a({},this.constructor.Default,i.default(this._element).data(),t),u.typeCheckConfig(zt,t,this.constructor.DefaultType),t},e._getMenuElement=function(){if(!this._menu){var e=t._getParentFromElement(this._element);e&&(this._menu=e.querySelector(re))}return this._menu},e._getPlacement=function(){var t=i.default(this._element.parentNode),e="bottom-start";return t.hasClass("dropup")?e=i.default(this._menu).hasClass(Zt)?"top-end":"top-start":t.hasClass("dropright")?e="right-start":t.hasClass("dropleft")?e="left-start":i.default(this._menu).hasClass(Zt)&&(e="bottom-end"),e},e._detectNavbar=function(){return i.default(this._element).closest(".navbar").length>0},e._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=a({},e.offsets,t._config.offset(e.offsets,t._element)),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),a({},t,this._config.popperConfig)},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this).data(Kt);if(n||(n=new t(this,"object"==typeof e?e:null),i.default(this).data(Kt,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}}))},t._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=[].slice.call(document.querySelectorAll(oe)),o=0,r=n.length;o0&&a--,40===e.which&&adocument.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add(pe);var o=u.getTransitionDurationFromElement(this._dialog);i.default(this._element).off(u.TRANSITION_END),i.default(this._element).one(u.TRANSITION_END,(function(){t._element.classList.remove(pe),n||i.default(t._element).one(u.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,o)})).emulateTransitionEnd(o),this._element.focus()}},e._showElement=function(t){var e=this,n=i.default(this._element).hasClass(ce),o=this._dialog?this._dialog.querySelector(".modal-body"):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),i.default(this._dialog).hasClass("modal-dialog-scrollable")&&o?o.scrollTop=0:this._element.scrollTop=0,n&&u.reflow(this._element),i.default(this._element).addClass(he),this._config.focus&&this._enforceFocus();var r=i.default.Event("shown.bs.modal",{relatedTarget:t}),a=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,i.default(e._element).trigger(r)};if(n){var s=u.getTransitionDurationFromElement(this._dialog);i.default(this._dialog).one(u.TRANSITION_END,a).emulateTransitionEnd(s)}else a()},e._enforceFocus=function(){var t=this;i.default(document).off(_e).on(_e,(function(e){document!==e.target&&t._element!==e.target&&0===i.default(t._element).has(e.target).length&&t._element.focus()}))},e._setEscapeEvent=function(){var t=this;this._isShown?i.default(this._element).on(ye,(function(e){t._config.keyboard&&27===e.which?(e.preventDefault(),t.hide()):t._config.keyboard||27!==e.which||t._triggerBackdropTransition()})):this._isShown||i.default(this._element).off(ye)},e._setResizeEvent=function(){var t=this;this._isShown?i.default(window).on(ve,(function(e){return t.handleUpdate(e)})):i.default(window).off(ve)},e._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){i.default(document.body).removeClass(de),t._resetAdjustments(),t._resetScrollbar(),i.default(t._element).trigger(me)}))},e._removeBackdrop=function(){this._backdrop&&(i.default(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(t){var e=this,n=i.default(this._element).hasClass(ce)?ce:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",n&&this._backdrop.classList.add(n),i.default(this._backdrop).appendTo(document.body),i.default(this._element).on(be,(function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._triggerBackdropTransition():e.hide())})),n&&u.reflow(this._backdrop),i.default(this._backdrop).addClass(he),!t)return;if(!n)return void t();var o=u.getTransitionDurationFromElement(this._backdrop);i.default(this._backdrop).one(u.TRANSITION_END,t).emulateTransitionEnd(o)}else if(!this._isShown&&this._backdrop){i.default(this._backdrop).removeClass(he);var r=function(){e._removeBackdrop(),t&&t()};if(i.default(this._element).hasClass(ce)){var a=u.getTransitionDurationFromElement(this._backdrop);i.default(this._backdrop).one(u.TRANSITION_END,r).emulateTransitionEnd(a)}else r()}else t&&t()},e._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:!0,sanitizeFn:null,whiteList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},We={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},Ue={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Ve=function(){function t(t,e){if("undefined"==typeof Yt)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=i.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(i.default(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),i.default.removeData(this.element,this.constructor.DATA_KEY),i.default(this.element).off(this.constructor.EVENT_KEY),i.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&i.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===i.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=i.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){i.default(this.element).trigger(e);var n=u.findShadowRoot(this.element),o=i.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!o)return;var r=this.getTipElement(),a=u.getUID(this.constructor.NAME);r.setAttribute("id",a),this.element.setAttribute("aria-describedby",a),this.setContent(),this.config.animation&&i.default(r).addClass(Pe);var s="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,l=this._getAttachment(s);this.addAttachmentClass(l);var f=this._getContainer();i.default(r).data(this.constructor.DATA_KEY,this),i.default.contains(this.element.ownerDocument.documentElement,this.tip)||i.default(r).appendTo(f),i.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Yt(this.element,r,this._getPopperConfig(l)),i.default(r).addClass(Fe),i.default(r).addClass(this.config.customClass),"ontouchstart"in document.documentElement&&i.default(document.body).children().on("mouseover",null,i.default.noop);var d=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,i.default(t.element).trigger(t.constructor.Event.SHOWN),e===Be&&t._leave(null,t)};if(i.default(this.tip).hasClass(Pe)){var c=u.getTransitionDurationFromElement(this.tip);i.default(this.tip).one(u.TRANSITION_END,d).emulateTransitionEnd(c)}else d()}},e.hide=function(t){var e=this,n=this.getTipElement(),o=i.default.Event(this.constructor.Event.HIDE),r=function(){e._hoverState!==Re&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),i.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(i.default(this.element).trigger(o),!o.isDefaultPrevented()){if(i.default(n).removeClass(Fe),"ontouchstart"in document.documentElement&&i.default(document.body).children().off("mouseover",null,i.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,i.default(this.tip).hasClass(Pe)){var a=u.getTransitionDurationFromElement(n);i.default(n).one(u.TRANSITION_END,r).emulateTransitionEnd(a)}else r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){i.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return this.tip=this.tip||i.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(i.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),i.default(t).removeClass("fade show")},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=ke(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?i.default(e).parent().is(t)||t.empty().append(e):t.text(i.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return a({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=a({},e.offsets,t.config.offset(e.offsets,t.element)),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:u.isElement(this.config.container)?i.default(this.config.container):i.default(document).find(this.config.container)},e._getAttachment=function(t){return qe[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)i.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n=e===He?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o=e===He?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;i.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},i.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=a({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||i.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:He]=!0),i.default(e.getTipElement()).hasClass(Fe)||e._hoverState===Re?e._hoverState=Re:(clearTimeout(e._timeout),e._hoverState=Re,e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){e._hoverState===Re&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||i.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:He]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=Be,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){e._hoverState===Be&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=i.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Le.indexOf(t)&&delete e[t]})),"number"==typeof(t=a({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),u.typeCheckConfig(Ie,t,this.constructor.DefaultType),t.sanitize&&(t.template=ke(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=i.default(this.getTipElement()),e=t.attr("class").match(je);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(i.default(t).removeClass(Pe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data(Oe),r="object"==typeof e&&e;if((o||!/dispose|hide/.test(e))&&(o||(o=new t(this,r),n.data(Oe,o)),"string"==typeof e)){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}}))},r(t,null,[{key:"VERSION",get:function(){return"4.6.2"}},{key:"Default",get:function(){return Qe}},{key:"NAME",get:function(){return Ie}},{key:"DATA_KEY",get:function(){return Oe}},{key:"Event",get:function(){return Ue}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return We}}]),t}();i.default.fn.tooltip=Ve._jQueryInterface,i.default.fn.tooltip.Constructor=Ve,i.default.fn.tooltip.noConflict=function(){return i.default.fn.tooltip=xe,Ve._jQueryInterface};var Ye="bs.popover",ze=i.default.fn.popover,Ke=new RegExp("(^|\\s)bs-popover\\S+","g"),Xe=a({},Ve.Default,{placement:"right",trigger:"click",content:"",template:''}),Ge=a({},Ve.DefaultType,{content:"(string|element|function)"}),$e={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},Je=function(t){var e,n;function o(){return t.apply(this,arguments)||this}n=t,(e=o).prototype=Object.create(n.prototype),e.prototype.constructor=e,s(e,n);var a=o.prototype;return a.isWithContent=function(){return this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){i.default(this.getTipElement()).addClass("bs-popover-"+t)},a.getTipElement=function(){return this.tip=this.tip||i.default(this.config.template)[0],this.tip},a.setContent=function(){var t=i.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},a._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},a._cleanTipClass=function(){var t=i.default(this.getTipElement()),e=t.attr("class").match(Ke);null!==e&&e.length>0&&t.removeClass(e.join(""))},o._jQueryInterface=function(t){return this.each((function(){var e=i.default(this).data(Ye),n="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new o(this,n),i.default(this).data(Ye,e)),"string"==typeof t)){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},r(o,null,[{key:"VERSION",get:function(){return"4.6.2"}},{key:"Default",get:function(){return Xe}},{key:"NAME",get:function(){return"popover"}},{key:"DATA_KEY",get:function(){return Ye}},{key:"Event",get:function(){return $e}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Ge}}]),o}(Ve);i.default.fn.popover=Je._jQueryInterface,i.default.fn.popover.Constructor=Je,i.default.fn.popover.noConflict=function(){return i.default.fn.popover=ze,Je._jQueryInterface};var Ze="scrollspy",tn="bs.scrollspy",en=i.default.fn[Ze],nn="active",on="position",rn=".nav, .list-group",an={offset:10,method:"auto",target:""},sn={offset:"number",method:"string",target:"(string|element)"},ln=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,i.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":on,n="auto"===this._config.method?e:this._config.method,o=n===on?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,r=u.getSelectorFromElement(t);if(r&&(e=document.querySelector(r)),e){var a=e.getBoundingClientRect();if(a.width||a.height)return[i.default(e)[n]().top+o,r]}return null})).filter(Boolean).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){i.default.removeData(this._element,tn),i.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=a({},an,"object"==typeof t&&t?t:{})).target&&u.isElement(t.target)){var e=i.default(t.target).attr("id");e||(e=u.getUID(Ze),i.default(t.target).attr("id",e)),t.target="#"+e}return u.typeCheckConfig(Ze,t,sn),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active",gn=function(){function t(t){this._element=t}var e=t.prototype;return e.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&i.default(this._element).hasClass(dn)||i.default(this._element).hasClass("disabled")||this._element.hasAttribute("disabled"))){var e,n,o=i.default(this._element).closest(".nav, .list-group")[0],r=u.getSelectorFromElement(this._element);if(o){var a="UL"===o.nodeName||"OL"===o.nodeName?mn:pn;n=(n=i.default.makeArray(i.default(o).find(a)))[n.length-1]}var s=i.default.Event("hide.bs.tab",{relatedTarget:this._element}),l=i.default.Event("show.bs.tab",{relatedTarget:n});if(n&&i.default(n).trigger(s),i.default(this._element).trigger(l),!l.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,o);var f=function(){var e=i.default.Event("hidden.bs.tab",{relatedTarget:t._element}),o=i.default.Event("shown.bs.tab",{relatedTarget:n});i.default(n).trigger(e),i.default(t._element).trigger(o)};e?this._activate(e,e.parentNode,f):f()}}},e.dispose=function(){i.default.removeData(this._element,un),this._element=null},e._activate=function(t,e,n){var o=this,r=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?i.default(e).children(pn):i.default(e).find(mn))[0],a=n&&r&&i.default(r).hasClass(cn),s=function(){return o._transitionComplete(t,r,n)};if(r&&a){var l=u.getTransitionDurationFromElement(r);i.default(r).removeClass(hn).one(u.TRANSITION_END,s).emulateTransitionEnd(l)}else s()},e._transitionComplete=function(t,e,n){if(e){i.default(e).removeClass(dn);var o=i.default(e.parentNode).find("> .dropdown-menu .active")[0];o&&i.default(o).removeClass(dn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}i.default(t).addClass(dn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),u.reflow(t),t.classList.contains(cn)&&t.classList.add(hn);var r=t.parentNode;if(r&&"LI"===r.nodeName&&(r=r.parentNode),r&&i.default(r).hasClass("dropdown-menu")){var a=i.default(t).closest(".dropdown")[0];if(a){var s=[].slice.call(a.querySelectorAll(".dropdown-toggle"));i.default(s).addClass(dn)}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data(un);if(o||(o=new t(this),n.data(un,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}}))},r(t,null,[{key:"VERSION",get:function(){return"4.6.2"}}]),t}();i.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),gn._jQueryInterface.call(i.default(this),"show")})),i.default.fn.tab=gn._jQueryInterface,i.default.fn.tab.Constructor=gn,i.default.fn.tab.noConflict=function(){return i.default.fn.tab=fn,gn._jQueryInterface};var _n="bs.toast",vn=i.default.fn.toast,bn="hide",yn="show",En="showing",wn="click.dismiss.bs.toast",Tn={animation:!0,autohide:!0,delay:500},Cn={animation:"boolean",autohide:"boolean",delay:"number"},Sn=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=i.default.Event("show.bs.toast");if(i.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove(En),t._element.classList.add(yn),i.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove(bn),u.reflow(this._element),this._element.classList.add(En),this._config.animation){var o=u.getTransitionDurationFromElement(this._element);i.default(this._element).one(u.TRANSITION_END,n).emulateTransitionEnd(o)}else n()}},e.hide=function(){if(this._element.classList.contains(yn)){var t=i.default.Event("hide.bs.toast");i.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains(yn)&&this._element.classList.remove(yn),i.default(this._element).off(wn),i.default.removeData(this._element,_n),this._element=null,this._config=null},e._getConfig=function(t){return t=a({},Tn,i.default(this._element).data(),"object"==typeof t&&t?t:{}),u.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;i.default(this._element).on(wn,'[data-dismiss="toast"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add(bn),i.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove(yn),this._config.animation){var n=u.getTransitionDurationFromElement(this._element);i.default(this._element).one(u.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data(_n);if(o||(o=new t(this,"object"==typeof e&&e),n.data(_n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e](this)}}))},r(t,null,[{key:"VERSION",get:function(){return"4.6.2"}},{key:"DefaultType",get:function(){return Cn}},{key:"Default",get:function(){return Tn}}]),t}();i.default.fn.toast=Sn._jQueryInterface,i.default.fn.toast.Constructor=Sn,i.default.fn.toast.noConflict=function(){return i.default.fn.toast=vn,Sn._jQueryInterface},t.Alert=c,t.Button=b,t.Carousel=O,t.Collapse=W,t.Dropdown=le,t.Modal=Se,t.Popover=Je,t.Scrollspy=ln,t.Tab=gn,t.Toast=Sn,t.Tooltip=Ve,t.Util=u,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/assets/js/jquery.min.js b/assets/js/jquery.min.js new file mode 100644 index 0000000..2c69bc9 --- /dev/null +++ b/assets/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 500) { + $('[data-toggle="popover"]').popover() + $("#popover").popover({ + trigger: "hover" + }); + } +}) + +function fallbackCopyTextToClipboard(text, type) { + var textArea = document.createElement("textarea"); + textArea.value = text; + textArea.style.top = "0"; + textArea.style.left = "0"; + textArea.style.position = "fixed"; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + var successful = document.execCommand("copy"); + var msg = successful ? "successful" : "unsuccessful"; + if (type == "shortUrl") { + $("#okayLinkToast").toast("show"); + } else if (type == "deletionLink") { + $("#okayDeletionlinkToast").toast("show"); + } + } catch (err) { + if (type == "shortUrl") { + $("#problemLinkToast").toast("show"); + } else if (type == "deletionLink") { + $("#problemDeletionlinkToast").toast("show"); + } + } + document.body.removeChild(textArea); +} + +function copyTextToClipboard(text, type) { + if (!navigator.clipboard) { + fallbackCopyTextToClipboard(text, type); + return; + } + navigator.clipboard.writeText(text).then(function() { + if (type == "shortUrl") { + $("#okayLinkToast").toast("show"); + } else if (type == "deletionLink") { + $("#okayDeletionlinkToast").toast("show"); + } + }, function(err) { + if (type == "shortUrl") { + $("#problemLinkToast").toast("show"); + } else if (type == "deletionLink") { + $("#problemDeletionlinkToast").toast("show"); + } + }); +} \ No newline at end of file diff --git a/assets/lang/fr.txt b/assets/lang/fr.txt new file mode 100755 index 0000000..1fe50e4 --- /dev/null +++ b/assets/lang/fr.txt @@ -0,0 +1,48 @@ +Welcome to collabore link=Bienvenue sur collabore link +Shorten all the links you want, efficiently, without any fuss.=Raccourcissez tous les liens que vous voulez, efficacement et sans difficulté. +Home=Accueil +Original link=Lien original +Oh no...=Oh non... +The shortened link you wish to access does not exist or no longer exists=Le lien raccourci auquel vous souhaitez accéder n’existe pas ou n’existe plus +The shortened link you wish to access does not exist or no longer exists.=Le lien raccourci auquel vous souhaitez accéder n’existe pas ou n’existe plus +Link copied!=Lien copié ! +Your shortened link has been successfully copied to your clipboard.=Votre lien raccourci a été copié avec succès dans votre presse-papier. +Unable to copy your link...=Impossible de copier votre lien... +Shortened link=Lien raccourci +Deletion link=Lien de suppression +Keep this deletion link in case you want to delete your shortened link in the future.=Conservez ce lien de suppression au cas où vous voudriez supprimer votre lien raccourci à l’avenir. +Deletion link copied!=Lien de suppression copié ! +Your deletion link has been successfully copied to your clipboard.=Votre lien de suppression a été copié avec succès dans votre presse-papier. +An error occurred on copying the shortened link to your clipboard.=Une erreur est survenue lors de la copie du lien raccourci dans votre presse-papier. +Unable to copy your deletion link...=Impossible de copier votre lien de suppression... +An error occurred on copying the deletion link to your clipboard.=Une erreur est survenue lors de la copie de la lien de suppression dans votre presse-papier. +An unknown error has occurred=Une erreur inconnue est survenue +An unknown error has occurred.=Une erreur inconnue est survenue. +The link you want to shorten is invalid.=Le lien que vous souhaitez raccourcir est invalide. +Your link has been successfully shortened=Votre lien a été raccourci avec succès +Thank you for your trust.=Merci pour votre confiance. +Your shortened link=Votre lien raccourci +Your QR Code=Votre Code QR +Download your QR Code=Téléchargez votre Code QR +Report an illicit link=Signaler un lien illicite +A shortened link from collabore link leads to illegal, disturbing or pornographic content?=Un lien raccourci provenant de collabore link mène à des contenus illégaux, dérangeants ou pornographiques ? +The report could not be sent=Le signalement n’a pas pu être envoyé +Report sent=Le signalement a été envoyé +Report it below and we will take care of it as soon as possible.=Signalez-le ci-dessous et nous nous en occuperons le plus rapidement possible. +Link identifier=Identifiant du lien +Thank you for your report=Merci pour votre signalement +We will take care of your report as soon as possible=Nous allons nous occuper le plus vite possible de votre signalement +The identifier of the link you wish to report does not exist.=L’identifiant du lien que vous souhaitez signaler n’existe pas. +Therefore, the report cannot be processed.=Le signalement ne peut donc pas aboutir. +Delete a shortened link=Supprimer un lien raccourci +Delete=Suppression +Shortened link deleted=Lien raccourci supprimer +Your shortened link has been deleted=Votre lien raccourci a été supprimé +The shortened link could not be removed=Le lien raccourci n’a pas pu être supprimé +This deletion link does not exist.=Ce lien de suppression n’existe pas. +Therefore, the deletion of the shortened link cannot be processed.=Par conséquent, la suppression du lien raccourci ne peut pas aboutir. +Return to the homepage=Revenir à la page d’accueil +Return to the reporting page=Revenir à la page de signalement +Source code=Code source +Legal notice=Mentions légales +Terms of service=Conditions générales d’utilisation \ No newline at end of file diff --git a/assets/lang/translator.php b/assets/lang/translator.php new file mode 100755 index 0000000..2b7839f --- /dev/null +++ b/assets/lang/translator.php @@ -0,0 +1,45 @@ +language = $language; + } + + private function findString($str) { + if (array_key_exists($str, $this->lang[$this->language])) { + echo $this->lang[$this->language][$str]; + return; + } + echo $str; + } + + private function splitStrings($str) { + return explode("=",trim($str)); + } + + public function __($str) { + if (!array_key_exists($this->language, $this->lang)) { + if (file_exists(($_SERVER["DOCUMENT_ROOT"])."/assets/lang/".$this->language.".txt")) { + $strings = array_map(array($this,"splitStrings"),file(($_SERVER["DOCUMENT_ROOT"])."/assets/lang/".$this->language.".txt")); + foreach ($strings as $k => $v) { + $this->lang[$this->language][$v[0]] = $v[1]; + } + return $this->findString($str); + } + else { + echo $str; + } + } + else { + return $this->findString($str); + } + } +} +} diff --git a/assets/tools/qrcode-url/README.md b/assets/tools/qrcode-url/README.md new file mode 100755 index 0000000..26dd656 --- /dev/null +++ b/assets/tools/qrcode-url/README.md @@ -0,0 +1,34 @@ +# QRCode-URL + +2015 - Timo van Neerden + + +This is QRCode-URL, a PHP based QRCode generator based on PHP-QRCode by Dominik Dzienia. + + +## Requirements + * PHP 5.3 + * PHP GD (for image generation); + +## Installation + * Unzip the downloaded .zip file + * Upload folder to your site (eg: http://example.com/qrcode) + + +## Usage +Create a QR-Code using this format : http://example.com/qrcode/?q=DATATEXT&s=SIZE&l=LEVEL&b=BORDERSIZE + +Where the parameters are: + * q (required) : Your text. The data you want to put in the QRCode. Keep out of url-encoding ! + * s (optionnal): An integer between 1 and 20. Defines the size of the “pixels” in the QRCode. Default: 4. + * l (optionnal): One of L, M, Q or H. Defines the error-correction level in the data. L is lowest (smaller image), H is highest (larger image). Default: M. + * b (optionnal): An integer between 1 and 20. Defines the white border width of the QRCode (may be given, but should be left empty). Default: 4. + + +## Acknowledgments + +QRCode-URL is based on PHP-QRCode by Dominik Dzienia, a free PHP QRCode lib. +http://sourceforge.net/projects/phpqrcode/ + +QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other +countries. diff --git a/assets/tools/qrcode-url/index.php b/assets/tools/qrcode-url/index.php new file mode 100755 index 0000000..6478e5e --- /dev/null +++ b/assets/tools/qrcode-url/index.php @@ -0,0 +1,26 @@ +&s=&l=&b= + + ** q (required) : Your text. The data you want to put in the QRCode. Keep out of url-encoding ! + ** s (optionnal): An integer between 1 and 20. Defines the size of the “pixels” in the QRCode. Default: 4. + ** l (optionnal): One of L, M, Q or H. Defines the error-correction level in the data. L is lowest (smaller image), H is highest (larger image). Default: M. + ** b (optionnal): An integer between 1 and 20. Defines the white border width of the QRCode (may be given, but should be left empty). Default: 4. + +*/ + +include "lib/qrlib.php"; + + +$data = ( (!empty($_GET['q']) ) ? htmlspecialchars($_GET['q']) : 'http://lehollandaisvolant.net'); +$size = ( (!empty($_GET['s']) and is_numeric($_GET['s']) ) ? htmlspecialchars($_GET['s']) : 4); +$level = ( (!empty($_GET['l']) and in_array(strtoupper($_GET['l']), str_split('LMQH')) ) ? htmlspecialchars($_GET['l']) : 'M') ; +$border = ( (!empty($_GET['b']) and is_numeric($_GET['b']) ) ? htmlspecialchars($_GET['b']) : 4) ; + + +// QRcode::png((data), (img.png||false for direct img), (level), (pointsize), (marginsize)); +QRcode::png($data, false, $level, $size, $border); diff --git a/assets/tools/qrcode-url/lib/.htaccess b/assets/tools/qrcode-url/lib/.htaccess new file mode 100755 index 0000000..43adb54 --- /dev/null +++ b/assets/tools/qrcode-url/lib/.htaccess @@ -0,0 +1,4 @@ + +Order allow,deny +Deny from all + diff --git a/assets/tools/qrcode-url/lib/CHANGELOG b/assets/tools/qrcode-url/lib/CHANGELOG new file mode 100755 index 0000000..1088530 --- /dev/null +++ b/assets/tools/qrcode-url/lib/CHANGELOG @@ -0,0 +1,38 @@ +* 1.0.0 build 2010031920 + + - first public release + - help in readme, install + - cleanup ans separation of QRtools and QRspec + - now TCPDF binding requires minimal changes in TCPDF, having most of job + done in QRtools tcpdfBarcodeArray + - nicer QRtools::timeBenchmark output + - license and copyright notices in files + - indent cleanup - from tab to 4spc, keep it that way please :) + - sf project, repository, wiki + - simple code generator in index.php + +* 1.1.0 build 2010032113 + + - added merge tool wich generate merged version of code + located in phpqrcode.php + - splited qrconst.php from qrlib.php + +* 1.1.1 build 2010032405 + + - patch by Rick Seymour allowing saving PNG and displaying it at the same time + - added version info in VERSION file + - modified merge tool to include version info into generated file + - fixed e-mail in almost all head comments + +* 1.1.2 build 2010032722 + + - full integration with TCPDF thanks to Nicola Asuni, it's author + - fixed bug with alphanumeric encoding detection + +* 1.1.3 build 2010081807 + + - short opening tags replaced with standard ones + +* 1.1.4 build 2010100721 + + - added missing static keyword QRinput::check (found by Luke Brookhart, Onjax LLC) diff --git a/assets/tools/qrcode-url/lib/INSTALL b/assets/tools/qrcode-url/lib/INSTALL new file mode 100755 index 0000000..eac6b07 --- /dev/null +++ b/assets/tools/qrcode-url/lib/INSTALL @@ -0,0 +1,67 @@ +== REQUIREMENTS == + + * PHP5 + * PHP GD2 extension with JPEG and PNG support + +== INSTALLATION == + +If you want to recreate cache by yourself make sure cache directory is +writable and you have permisions to write into it. Also make sure you are +able to read files in it if you have cache option enabled + +== CONFIGURATION == + +Feel free to modify config constants in qrconfig.php file. Read about it in +provided comments and project wiki page (links in README file) + +== QUICK START == + +Notice: probably you should'nt use all of this in same script :) + +encode('PHP QR Code :)'); +QRspec::debug($tab, true); + +== TCPDF INTEGRATION == + +Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php. +Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge) +2dbarcodes.php + +Then use similar as example #50 from TCPDF examples: + + true, + 'padding' => 4, + 'fgcolor' => array(0,0,0), + 'bgcolor' => false, //array(255,255,255) +); + +//code name: QR, specify error correction level after semicolon (L,M,Q,H) +$pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N'); diff --git a/assets/tools/qrcode-url/lib/LICENSE b/assets/tools/qrcode-url/lib/LICENSE new file mode 100755 index 0000000..1883303 --- /dev/null +++ b/assets/tools/qrcode-url/lib/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/assets/tools/qrcode-url/lib/README b/assets/tools/qrcode-url/lib/README new file mode 100755 index 0000000..a022fb5 --- /dev/null +++ b/assets/tools/qrcode-url/lib/README @@ -0,0 +1,45 @@ +This is PHP implementation of QR Code 2-D barcode generator. It is pure-php +LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi. + +== LICENSING == + +Copyright (C) 2010 by Dominik Dzienia + +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or any later version. + +This library is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file) +for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this library; if not, write to the Free Software Foundation, Inc., 51 +Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +== INSTALATION AND USAGE == + + * INSTALL file + * http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page + +== CONTACT == + +Fell free to contact me via e-mail (deltalab at poczta dot fm) or using +folowing project pages: + + * http://sourceforge.net/projects/phpqrcode/ + * http://phpqrcode.sourceforge.net/ + +== ACKNOWLEDGMENTS == + +Based on C libqrencode library (ver. 3.1.1) +Copyright (C) 2006-2010 by Kentaro Fukuchi +http://megaui.net/fukuchi/works/qrencode/index.en.html + +QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other +countries. + +Reed-Solomon code encoder is written by Phil Karn, KA9Q. +Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q + \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/VERSION b/assets/tools/qrcode-url/lib/VERSION new file mode 100755 index 0000000..9f99279 --- /dev/null +++ b/assets/tools/qrcode-url/lib/VERSION @@ -0,0 +1,2 @@ +1.1.4 +2010100721 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/bindings/tcpdf/qrcode.php b/assets/tools/qrcode-url/lib/bindings/tcpdf/qrcode.php new file mode 100755 index 0000000..4cb1389 --- /dev/null +++ b/assets/tools/qrcode-url/lib/bindings/tcpdf/qrcode.php @@ -0,0 +1,2875 @@ + +// http://phpqrcode.sourceforge.net/ +// https://sourceforge.net/projects/phpqrcode/ +// +// The "PHP QR Code encoder" is based on +// "C libqrencode library" (ver. 3.1.1) +// License: GNU-LGPL 2.1 +// Copyright (C) 2006-2010 by Kentaro Fukuchi +// http://megaui.net/fukuchi/works/qrencode/index.en.html +// +// Reed-Solomon code encoder is written by Phil Karn, KA9Q. +// Copyright (C) 2002-2006 Phil Karn, KA9Q +// +// QR Code is registered trademark of DENSO WAVE INCORPORATED +// http://www.denso-wave.com/qrcode/index-e.html +// --------------------------------------------------------- +// +// Author: Nicola Asuni +// +// (c) Copyright 2010: +// Nicola Asuni +// Tecnick.com S.r.l. +// Via della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * Class to create QR-code arrays for TCPDF class. + * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. + * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. + * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. + * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. + * + * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). + * Please read comments on this class source file for full copyright and license information. + * + * @package com.tecnick.tcpdf + * @abstract Class for generating QR-code array for TCPDF. + * @author Nicola Asuni + * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 1.0.002 + */ + +// definitions +if (!defined('QRCODEDEFS')) { + + /** + * Indicate that definitions for this class are set + */ + define('QRCODEDEFS', true); + + // ----------------------------------------------------- + + // Encoding modes (characters which can be encoded in QRcode) + + /** + * Encoding mode + */ + define('QR_MODE_NL', -1); + + /** + * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode. + */ + define('QR_MODE_NM', 0); + + /** + * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode. + */ + define('QR_MODE_AN', 1); + + /** + * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode. + */ + define('QR_MODE_8B', 2); + + /** + * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode. + */ + define('QR_MODE_KJ', 3); + + /** + * Encoding mode STRUCTURED (currently unsupported) + */ + define('QR_MODE_ST', 4); + + // ----------------------------------------------------- + + // Levels of error correction. + // QRcode has a function of an error correcting for miss reading that white is black. + // Error correcting is defined in 4 level as below. + + /** + * Error correction level L : About 7% or less errors can be corrected. + */ + define('QR_ECLEVEL_L', 0); + + /** + * Error correction level M : About 15% or less errors can be corrected. + */ + define('QR_ECLEVEL_M', 1); + + /** + * Error correction level Q : About 25% or less errors can be corrected. + */ + define('QR_ECLEVEL_Q', 2); + + /** + * Error correction level H : About 30% or less errors can be corrected. + */ + define('QR_ECLEVEL_H', 3); + + // ----------------------------------------------------- + + // Version. Size of QRcode is defined as version. + // Version is from 1 to 40. + // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. + // So version 40 is 177*177 matrix. + + /** + * Maximum QR Code version. + */ + define('QRSPEC_VERSION_MAX', 40); + + /** + * Maximum matrix size for maximum version (version 40 is 177*177 matrix). + */ + define('QRSPEC_WIDTH_MAX', 177); + + // ----------------------------------------------------- + + /** + * Matrix index to get width from $capacity array. + */ + define('QRCAP_WIDTH', 0); + + /** + * Matrix index to get number of words from $capacity array. + */ + define('QRCAP_WORDS', 1); + + /** + * Matrix index to get remainder from $capacity array. + */ + define('QRCAP_REMINDER', 2); + + /** + * Matrix index to get error correction level from $capacity array. + */ + define('QRCAP_EC', 3); + + // ----------------------------------------------------- + + // Structure (currently usupported) + + /** + * Number of header bits for structured mode + */ + define('STRUCTURE_HEADER_BITS', 20); + + /** + * Max number of symbols for structured mode + */ + define('MAX_STRUCTURED_SYMBOLS', 16); + + // ----------------------------------------------------- + + // Masks + + /** + * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column) + */ + define('N1', 3); + + /** + * Down point base value for case 2 mask pattern (module block of same color) + */ + define('N2', 3); + + /** + * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column) + */ + define('N3', 40); + + /** + * Down point base value for case 4 mask pattern (ration of dark modules in whole) + */ + define('N4', 10); + + // ----------------------------------------------------- + + // Optimization settings + + /** + * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code + */ + define('QR_FIND_BEST_MASK', true); + + /** + * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly + */ + define('QR_FIND_FROM_RANDOM', 2); + + /** + * when QR_FIND_BEST_MASK === false + */ + define('QR_DEFAULT_MASK', 2); + + // ----------------------------------------------------- + +} // end of definitions + +// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# + +if (!class_exists('QRcode', false)) { + + // for compaibility with PHP4 + if (!function_exists('str_split')) { + /** + * Convert a string to an array (needed for PHP4 compatibility) + * @param string $string The input string. + * @param int $split_length Maximum length of the chunk. + * @return If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element. + */ + function str_split($string, $split_length=1) { + if ((strlen($string) > $split_length) OR (!$split_length)) { + do { + $c = strlen($string); + $parts[] = substr($string, 0, $split_length); + $string = substr($string, $split_length); + } while ($string !== false); + } else { + $parts = array($string); + } + return $parts; + } + } + + // ##################################################### + + /** + * Class to create QR-code arrays for TCPDF class. + * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. + * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. + * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. + * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. + * + * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). + * Please read comments on this class source file for full copyright and license information. + * + * @name QRcode + * @package com.tecnick.tcpdf + * @abstract Class for generating QR-code array for TCPDF. + * @author Nicola Asuni + * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 1.0.002 + */ + class QRcode { + + /** + * @var barcode array to be returned which is readable by TCPDF + * @access protected + */ + protected $barcode_array = array(); + + /** + * @var QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix. + * @access protected + */ + protected $version = 0; + + /** + * @var Levels of error correction. See definitions for possible values. + * @access protected + */ + protected $level = QR_ECLEVEL_L; + + /** + * @var Encoding mode + * @access protected + */ + protected $hint = QR_MODE_8B; + + /** + * @var if true the input string will be converted to uppercase + * @access protected + */ + protected $casesensitive = true; + + /** + * @var structured QR code (not supported yet) + * @access protected + */ + protected $structured = 0; + + /** + * @var mask data + * @access protected + */ + protected $data; + + // FrameFiller + + /** + * @var width + * @access protected + */ + protected $width; + + /** + * @var frame + * @access protected + */ + protected $frame; + + /** + * @var X position of bit + * @access protected + */ + protected $x; + + /** + * @var Y position of bit + * @access protected + */ + protected $y; + + /** + * @var direction + * @access protected + */ + protected $dir; + + /** + * @var single bit + * @access protected + */ + protected $bit; + + // ---- QRrawcode ---- + + /** + * @var data code + * @access protected + */ + protected $datacode = array(); + + /** + * @var error correction code + * @access protected + */ + protected $ecccode = array(); + + /** + * @var blocks + * @access protected + */ + protected $blocks; + + /** + * @var Reed-Solomon blocks + * @access protected + */ + protected $rsblocks = array(); //of RSblock + + /** + * @var counter + * @access protected + */ + protected $count; + + /** + * @var data length + * @access protected + */ + protected $dataLength; + + /** + * @var error correction length + * @access protected + */ + protected $eccLength; + + /** + * @var b1 + * @access protected + */ + protected $b1; + + // ---- QRmask ---- + + /** + * @var run length + * @access protected + */ + protected $runLength = array(); + + // ---- QRsplit ---- + + /** + * @var input data string + * @access protected + */ + protected $dataStr = ''; + + /** + * @var input items + * @access protected + */ + protected $items; + + // Reed-Solomon items + + /** + * @var Reed-Solomon items + * @access protected + */ + protected $rsitems = array(); + + /** + * @var array of frames + * @access protected + */ + protected $frames = array(); + + /** + * @var alphabet-numeric convesion table + * @access protected + */ + protected $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, // + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, // + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // + ); + + /** + * @var array Table of the capacity of symbols + * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004. + * @access protected + */ + protected $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), // + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), // + array( 29, 70, 7, array( 15, 26, 36, 44)), // + array( 33, 100, 7, array( 20, 36, 52, 64)), // + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), // + array( 45, 196, 0, array( 40, 72, 108, 130)), // + array( 49, 242, 0, array( 48, 88, 132, 156)), // + array( 53, 292, 0, array( 60, 110, 160, 192)), // + array( 57, 346, 0, array( 72, 130, 192, 224)), // 10 + array( 61, 404, 0, array( 80, 150, 224, 264)), // + array( 65, 466, 0, array( 96, 176, 260, 308)), // + array( 69, 532, 0, array( 104, 198, 288, 352)), // + array( 73, 581, 3, array( 120, 216, 320, 384)), // + array( 77, 655, 3, array( 132, 240, 360, 432)), // 15 + array( 81, 733, 3, array( 144, 280, 408, 480)), // + array( 85, 815, 3, array( 168, 308, 448, 532)), // + array( 89, 901, 3, array( 180, 338, 504, 588)), // + array( 93, 991, 3, array( 196, 364, 546, 650)), // + array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20 + array(101, 1156, 4, array( 224, 442, 644, 750)), // + array(105, 1258, 4, array( 252, 476, 690, 816)), // + array(109, 1364, 4, array( 270, 504, 750, 900)), // + array(113, 1474, 4, array( 300, 560, 810, 960)), // + array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), // + array(125, 1828, 4, array( 360, 700, 1020, 1200)), // + array(129, 1921, 3, array( 390, 728, 1050, 1260)), // + array(133, 2051, 3, array( 420, 784, 1140, 1350)), // + array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), // + array(145, 2465, 3, array( 510, 924, 1350, 1620)), // + array(149, 2611, 3, array( 540, 980, 1440, 1710)), // + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), // + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), // + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), // + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), // + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), // + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40 + ); + + /** + * @var array Length indicator + * @access protected + */ + protected $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + /** + * @var array Table of the error correction code (Reed-Solomon block) + * See Table 12-16 (pp.30-36), JIS X0510:2004. + * @access protected + */ + protected $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), // + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), // + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), // + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), // + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), // + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), // + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), // + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), // + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), // + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), // + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), // + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), // + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), // + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), // + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), // + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), // + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), // + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), // + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), // + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), // + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), // + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), // + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), // + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), // + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), // + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), // + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), // + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), // + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), // + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), // + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), // + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40 + ); + + /** + * @var array Positions of alignment patterns. + * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them. + * See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + * @access protected + */ + protected $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40 + ); + + /** + * @var array Version information pattern (BCH coded). + * See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + * size: [QRSPEC_VERSION_MAX - 6] + * @access protected + */ + protected $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, // + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, // + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, // + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, // + 0x27541, 0x28c69 + ); + + /** + * @var array Format information + * @access protected + */ + protected $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), // + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), // + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), // + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) // + ); + + + // ------------------------------------------------- + // ------------------------------------------------- + + + /** + * This is the class constructor. + * Creates a QRcode object + * @param string $code code to represent using QRcode + * @param string $eclevel error level:
  • L : About 7% or less errors can be corrected.
  • M : About 15% or less errors can be corrected.
  • Q : About 25% or less errors can be corrected.
  • H : About 30% or less errors can be corrected.
+ * @access public + * @since 1.0.000 + */ + public function __construct($code, $eclevel = 'L') { + $barcode_array = array(); + if ((is_null($code)) OR ($code == '\0') OR ($code == '')) { + return false; + } + // set error correction level + $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H')); + if ($this->level === false) { + $this->level = QR_ECLEVEL_L; + } + if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) { + return false; + } + if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) { + return false; + } + $this->items = array(); + $this->encodeString($code); + $qrTab = $this->binarize($this->data); + $size = count($qrTab); + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach (str_split($line) as $char) { + $arrAdd[] = ($char=='1')?1:0; + } + $barcode_array['bcode'][] = $arrAdd; + } + $this->barcode_array = $barcode_array; + } + + /** + * Returns a barcode array which is readable by TCPDF + * @return array barcode array readable by TCPDF; + * @access public + */ + public function getBarcodeArray() { + return $this->barcode_array; + } + + /** + * Convert the frame in binary form + * @param array $frame array to binarize + * @return array frame in binary form + */ + protected function binarize($frame) { + $len = count($frame); + // the frame is square (width = height) + foreach ($frame as &$frameLine) { + for ($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + return $frame; + } + + /** + * Encode the input string to QR code + * @param string $string input string to encode + */ + protected function encodeString($string) { + $this->dataStr = $string; + if (!$this->casesensitive) { + $this->toUpper(); + } + $ret = $this->splitString(); + if ($ret < 0) { + return NULL; + } + $this->encodeMask(-1); + } + + /** + * Encode mask + * @param int $mask masking mode + */ + protected function encodeMask($mask) { + $spec = array(0, 0, 0, 0, 0); + $this->datacode = $this->getByteStream($this->items); + if (is_null($this->datacode)) { + return NULL; + } + $spec = $this->getEccSpec($this->version, $this->level, $spec); + $this->b1 = $this->rsBlockNum1($spec); + $this->dataLength = $this->rsDataLength($spec); + $this->eccLength = $this->rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = $this->rsBlockNum($spec); + $ret = $this->init($spec); + if ($ret < 0) { + return NULL; + } + $this->count = 0; + $this->width = $this->getWidth($this->version); + $this->frame = $this->newFrame($this->version); + $this->x = $this->width - 1; + $this->y = $this->width - 1; + $this->dir = -1; + $this->bit = -1; + // inteleaved data and ecc codes + for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) { + $code = $this->getCode(); + $bit = 0x80; + for ($j=0; $j<8; $j++) { + $addr = $this->getNextPosition(); + $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + // remainder bits + $j = $this->getRemainder($this->version); + for ($i=0; $i<$j; $i++) { + $addr = $this->getNextPosition(); + $this->setFrameAt($addr, 0x02); + } + // masking + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + if ($mask < 0) { + if (QR_FIND_BEST_MASK) { + $masked = $this->mask($this->width, $this->frame, $this->level); + } else { + $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level); + } + } else { + $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level); + } + if ($masked == NULL) { + return NULL; + } + $this->data = $masked; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // FrameFiller + + /** + * Set frame value at specified position + * @param array $at x,y position + * @param int $val value of the character to set + */ + protected function setFrameAt($at, $val) { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + /** + * Get frame value at specified position + * @param array $at x,y position + * @return value at specified position + */ + protected function getFrameAt($at) { + return ord($this->frame[$at['y']][$at['x']]); + } + + /** + * Return the next frame position + * @return array of x,y coordinates + */ + protected function getNextPosition() { + do { + if ($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + $x = $this->x; + $y = $this->y; + $w = $this->width; + if ($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + if ($this->dir < 0) { + if ($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if ($x == 6) { + $x--; + $y = 9; + } + } + } else { + if ($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if ($x == 6) { + $x--; + $y -= 8; + } + } + } + if (($x < 0) OR ($y < 0)) { + return NULL; + } + $this->x = $x; + $this->y = $y; + } while(ord($this->frame[$y][$x]) & 0x80); + return array('x'=>$x, 'y'=>$y); + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrawcode + + /** + * Initialize code. + * @param array $spec array of ECC specification + * @return 0 in case of success, -1 in case of error + */ + protected function init($spec) { + $dl = $this->rsDataCodes1($spec); + $el = $this->rsEccCodes1($spec); + $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + $endfor = $this->rsBlockNum1($spec); + for ($i=0; $i < $endfor; ++$i) { + $ecc = array_slice($this->ecccode, $eccPos); + $this->rsblocks[$blockNo] = array(); + $this->rsblocks[$blockNo]['dataLength'] = $dl; + $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); + $this->rsblocks[$blockNo]['eccLength'] = $el; + $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); + $this->rsblocks[$blockNo]['ecc'] = $ecc; + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + if ($this->rsBlockNum2($spec) == 0) { + return 0; + } + $dl = $this->rsDataCodes2($spec); + $el = $this->rsEccCodes2($spec); + $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + if ($rs == NULL) { + return -1; + } + $endfor = $this->rsBlockNum2($spec); + for ($i=0; $i < $endfor; ++$i) { + $ecc = array_slice($this->ecccode, $eccPos); + $this->rsblocks[$blockNo] = array(); + $this->rsblocks[$blockNo]['dataLength'] = $dl; + $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); + $this->rsblocks[$blockNo]['eccLength'] = $el; + $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); + $this->rsblocks[$blockNo]['ecc'] = $ecc; + $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc); + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + return 0; + } + + /** + * Return Reed-Solomon block code. + * @return array rsblocks + */ + protected function getCode() { + if ($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if ($col >= $this->rsblocks[0]['dataLength']) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]['data'][$col]; + } elseif ($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]['ecc'][$col]; + } else { + return 0; + } + $this->count++; + return $ret; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRmask + + /** + * Write Format Information on frame and returns the number of black bits + * @param int $width frame width + * @param array $frame frame + * @param array $mask masking mode + * @param int $level error correction level + * @return int blacks + */ + protected function writeFormatInformation($width, &$frame, $mask, $level) { + $blacks = 0; + $format = $this->getFormatInfo($mask, $level); + for ($i=0; $i<8; ++$i) { + if ($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + $frame[8][$width - 1 - $i] = chr($v); + if ($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + for ($i=0; $i<7; ++$i) { + if ($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + $frame[$width - 7 + $i][8] = chr($v); + if ($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + $format = $format >> 1; + } + return $blacks; + } + + /** + * mask0 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask0($x, $y) { + return ($x + $y) & 1; + } + + /** + * mask1 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask1($x, $y) { + return ($y & 1); + } + + /** + * mask2 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask2($x, $y) { + return ($x % 3); + } + + /** + * mask3 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask3($x, $y) { + return ($x + $y) % 3; + } + + /** + * mask4 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask4($x, $y) { + return (((int)($y / 2)) + ((int)($x / 3))) & 1; + } + + /** + * mask5 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask5($x, $y) { + return (($x * $y) & 1) + ($x * $y) % 3; + } + + /** + * mask6 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask6($x, $y) { + return ((($x * $y) & 1) + ($x * $y) % 3) & 1; + } + + /** + * mask7 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask7($x, $y) { + return ((($x * $y) % 3) + (($x + $y) & 1)) & 1; + } + + /** + * Return bitmask + * @param int $maskNo mask number + * @param int $width width + * @param array $frame frame + * @return array bitmask + */ + protected function generateMaskNo($maskNo, $width, $frame) { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($y=0; $y<$width; ++$y) { + for ($x=0; $x<$width; ++$x) { + if (ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + } + } + return $bitMask; + } + + /** + * makeMaskNo + * @param int $maskNo + * @param int $width + * @param int $s + * @param int $d + * @param boolean $maskGenOnly + * @return int b + */ + protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) { + $b = 0; + $bitMask = array(); + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if ($maskGenOnly) { + return; + } + $d = $s; + for ($y=0; $y<$width; ++$y) { + for ($x=0; $x<$width; ++$x) { + if ($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + return $b; + } + + /** + * makeMask + * @param int $width + * @param array $frame + * @param int $maskNo + * @param int $level + * @return array mask + */ + protected function makeMask($width, $frame, $maskNo, $level) { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + return $masked; + } + + /** + * calcN1N3 + * @param int $length + * @return int demerit + */ + protected function calcN1N3($length) { + $demerit = 0; + for ($i=0; $i<$length; ++$i) { + if ($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if ($i & 1) { + if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if (($this->runLength[$i-2] == $fact) + AND ($this->runLength[$i-1] == $fact) + AND ($this->runLength[$i+1] == $fact) + AND ($this->runLength[$i+2] == $fact)) { + if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + /** + * evaluateSymbol + * @param int $width + * @param array $frame + * @return int demerit + */ + protected function evaluateSymbol($width, $frame) { + $head = 0; + $demerit = 0; + for ($y=0; $y<$width; ++$y) { + $head = 0; + $this->runLength[0] = 1; + $frameY = $frame[$y]; + if ($y > 0) { + $frameYM = $frame[$y-1]; + } + for ($x=0; $x<$width; ++$x) { + if (($x > 0) AND ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + if (($b22 | ($w22 ^ 1)) & 1) { + $demerit += N2; + } + } + if (($x == 0) AND (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } elseif ($x > 0) { + if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + $demerit += $this->calcN1N3($head+1); + } + for ($x=0; $x<$width; ++$x) { + $head = 0; + $this->runLength[0] = 1; + for ($y=0; $y<$width; ++$y) { + if (($y == 0) AND (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } elseif ($y > 0) { + if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + $demerit += $this->calcN1N3($head+1); + } + return $demerit; + } + + /** + * mask + * @param int $width + * @param array $frame + * @param int $level + * @return array best mask + */ + protected function mask($width, $frame, $level) { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7); + if (QR_FIND_FROM_RANDOM !== false) { + $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; ++$i) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + } + $bestMask = $frame; + foreach ($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + if ($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + return $bestMask; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRsplit + + /** + * Return true if the character at specified position is a number + * @param string $str string + * @param int $pos characted position + * @return boolean true of false + */ + protected function isdigitat($str, $pos) { + if ($pos >= strlen($str)) { + return false; + } + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + /** + * Return true if the character at specified position is an alphanumeric character + * @param string $str string + * @param int $pos characted position + * @return boolean true of false + */ + protected function isalnumat($str, $pos) { + if ($pos >= strlen($str)) { + return false; + } + return ($this->lookAnTable(ord($str[$pos])) >= 0); + } + + /** + * identifyMode + * @param int $pos + * @return int mode + */ + protected function identifyMode($pos) { + if ($pos >= strlen($this->dataStr)) { + return QR_MODE_NL; + } + $c = $this->dataStr[$pos]; + if ($this->isdigitat($this->dataStr, $pos)) { + return QR_MODE_NM; + } elseif ($this->isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } elseif ($this->hint == QR_MODE_KJ) { + if ($pos+1 < strlen($this->dataStr)) { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KJ; + } + } + } + return QR_MODE_8B; + } + + /** + * eatNum + * @return int run + */ + protected function eatNum() { + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 0; + while($this->isdigitat($this->dataStr, $p)) { + $p++; + } + $run = $p; + $mode = $this->identifyMode($p); + if ($mode == QR_MODE_8B) { + $dif = $this->estimateBitsModeNum($run) + 4 + $ln + + $this->estimateBitsMode8(1) // + 4 + l8 + - $this->estimateBitsMode8($run + 1); // - 4 - l8 + if ($dif > 0) { + return $this->eat8(); + } + } + if ($mode == QR_MODE_AN) { + $dif = $this->estimateBitsModeNum($run) + 4 + $ln + + $this->estimateBitsModeAn(1) // + 4 + la + - $this->estimateBitsModeAn($run + 1);// - 4 - la + if ($dif > 0) { + return $this->eatAn(); + } + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr)); + return $run; + } + + /** + * eatAn + * @return int run + */ + protected function eatAn() { + $la = $this->lengthIndicator(QR_MODE_AN, $this->version); + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 0; + while($this->isalnumat($this->dataStr, $p)) { + if ($this->isdigitat($this->dataStr, $p)) { + $q = $p; + while($this->isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsModeAn($p) // + 4 + la + + $this->estimateBitsModeNum($q - $p) + 4 + $ln + - $this->estimateBitsModeAn($q); // - 4 - la + if ($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + $run = $p; + if (!$this->isalnumat($this->dataStr, $p)) { + $dif = $this->estimateBitsModeAn($run) + 4 + $la + + $this->estimateBitsMode8(1) // + 4 + l8 + - $this->estimateBitsMode8($run + 1); // - 4 - l8 + if ($dif > 0) { + return $this->eat8(); + } + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr)); + return $run; + } + + /** + * eatKanji + * @return int run + */ + protected function eatKanji() { + $p = 0; + while($this->identifyMode($p) == QR_MODE_KJ) { + $p += 2; + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr)); + return $run; + } + + /** + * eat8 + * @return int run + */ + protected function eat8() { + $la = $this->lengthIndicator(QR_MODE_AN, $this->version); + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 1; + $dataStrLen = strlen($this->dataStr); + while($p < $dataStrLen) { + $mode = $this->identifyMode($p); + if ($mode == QR_MODE_KJ) { + break; + } + if ($mode == QR_MODE_NM) { + $q = $p; + while($this->isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsMode8($p) // + 4 + l8 + + $this->estimateBitsModeNum($q - $p) + 4 + $ln + - $this->estimateBitsMode8($q); // - 4 - l8 + if ($dif < 0) { + break; + } else { + $p = $q; + } + } elseif ($mode == QR_MODE_AN) { + $q = $p; + while($this->isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsMode8($p) // + 4 + l8 + + $this->estimateBitsModeAn($q - $p) + 4 + $la + - $this->estimateBitsMode8($q); // - 4 - l8 + if ($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + $run = $p; + $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr)); + return $run; + } + + /** + * splitString + */ + protected function splitString() { + while (strlen($this->dataStr) > 0) { + if ($this->dataStr == '') { + return 0; + } + $mode = $this->identifyMode(0); + switch ($mode) { + case QR_MODE_NM: { + $length = $this->eatNum(); + break; + } + case QR_MODE_AN: { + $length = $this->eatAn(); + break; + } + case QR_MODE_KJ: { + if ($hint == QR_MODE_KJ) { + $length = $this->eatKanji(); + } else { + $length = $this->eat8(); + } + break; + } + default: { + $length = $this->eat8(); + break; + } + } + if ($length == 0) { + return 0; + } + if ($length < 0) { + return -1; + } + $this->dataStr = substr($this->dataStr, $length); + } + } + + /** + * toUpper + */ + protected function toUpper() { + $stringLen = strlen($this->dataStr); + $p = 0; + while ($p < $stringLen) { + $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint); + if ($mode == QR_MODE_KJ) { + $p += 2; + } else { + if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + return $this->dataStr; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRinputItem + + /** + * newInputItem + * @param int $mode + * @param int $size + * @param array $data + * @param array $bstream + * @return array input item + */ + protected function newInputItem($mode, $size, $data, $bstream=null) { + $setData = array_slice($data, 0, $size); + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0)); + } + if (!$this->check($mode, $size, $setData)) { + return NULL; + } + $inputitem = array(); + $inputitem['mode'] = $mode; + $inputitem['size'] = $size; + $inputitem['data'] = $setData; + $inputitem['bstream'] = $bstream; + return $inputitem; + } + + /** + * encodeModeNum + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeNum($inputitem, $version) { + $words = (int)($inputitem['size'] / 3); + $inputitem['bstream'] = array(); + $val = 0x1; + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']); + for ($i=0; $i < $words; ++$i) { + $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100; + $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10; + $val += (ord($inputitem['data'][$i*3+2]) - ord('0')); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val); + } + if ($inputitem['size'] - $words * 3 == 1) { + $val = ord($inputitem['data'][$words*3]) - ord('0'); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); + } elseif (($inputitem['size'] - ($words * 3)) == 2) { + $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10; + $val += (ord($inputitem['data'][$words*3+1]) - ord('0')); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val); + } + return $inputitem; + } + + /** + * encodeModeAn + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeAn($inputitem, $version) { + $words = (int)($inputitem['size'] / 2); + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02); + $inputitem['bstream'] = $this->appendNum(v, $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']); + for ($i=0; $i < $words; ++$i) { + $val = (int)$this->lookAnTable(ord($inputitem['data'][$i*2 ])) * 45; + $val += (int)$this->lookAnTable(ord($inputitem['data'][$i*2+1])); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val); + } + if ($inputitem['size'] & 1) { + $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)])); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val); + } + return $inputitem; + } + + /** + * encodeMode8 + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeMode8($inputitem, $version) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']); + for ($i=0; $i < $inputitem['size']; ++$i) { + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i])); + } + return $inputitem; + } + + /** + * encodeModeKanji + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeKanji($inputitem, $version) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2)); + for ($i=0; $i<$inputitem['size']; $i+=2) { + $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]); + if ($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val); + } + return $inputitem; + } + + /** + * encodeModeStructure + * @param array $inputitem + * @return array input item + */ + protected function encodeModeStructure($inputitem) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2])); + return $inputitem; + } + + /** + * encodeBitStream + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeBitStream($inputitem, $version) { + $inputitem['bstream'] = array(); + $words = $this->maximumWords($inputitem['mode'], $version); + if ($inputitem['size'] > $words) { + $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']); + $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words)); + $st1 = $this->encodeBitStream($st1, $version); + $st2 = $this->encodeBitStream($st2, $version); + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']); + $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']); + } else { + switch($inputitem['mode']) { + case QR_MODE_NM: { + $inputitem = $this->encodeModeNum($inputitem, $version); + break; + } + case QR_MODE_AN: { + $inputitem = $this->encodeModeAn($inputitem, $version); + break; + } + case QR_MODE_8B: { + $inputitem = $this->encodeMode8($inputitem, $version); + break; + } + case QR_MODE_KJ: { + $inputitem = $this->encodeModeKanji($inputitem, $version); + break; + } + case QR_MODE_ST: { + $inputitem = $this->encodeModeStructure($inputitem); + break; + } + default: { + break; + } + } + } + return $inputitem; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRinput + + /** + * Append data to an input object. + * The data is copied and appended to the input object. + * @param array items input items + * @param int $mode encoding mode. + * @param int $size size of data (byte). + * @param array $data array of input data. + * @return items + * + */ + protected function appendNewInputItem($items, $mode, $size, $data) { + $items[] = $this->newInputItem($mode, $size, $data); + return $items; + } + + /** + * insertStructuredAppendHeader + * @param array $items + * @param int $size + * @param int $index + * @param int $parity + * @return array items + */ + protected function insertStructuredAppendHeader($items, $size, $index, $parity) { + if ($size > MAX_STRUCTURED_SYMBOLS) { + return -1; + } + if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) { + return -1; + } + $buf = array($size, $index, $parity); + $entry = $this->newInputItem(QR_MODE_ST, 3, buf); + array_unshift($items, $entry); + return $items; + } + + /** + * calcParity + * @param array $items + * @return int parity + */ + protected function calcParity($items) { + $parity = 0; + foreach ($items as $item) { + if ($item['mode'] != QR_MODE_ST) { + for ($i=$item['size']-1; $i>=0; --$i) { + $parity ^= $item['data'][$i]; + } + } + } + return $parity; + } + + /** + * checkModeNum + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeNum($size, $data) { + for ($i=0; $i<$size; ++$i) { + if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){ + return false; + } + } + return true; + } + + /** + * estimateBitsModeNum + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeNum($size) { + $w = (int)$size / 3; + $bits = $w * 10; + switch($size - $w * 3) { + case 1: { + $bits += 4; + break; + } + case 2: { + $bits += 7; + break; + } + default: { + break; + } + } + return $bits; + } + + /** + * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19). + * @param int $c character value + * @return value + */ + protected function lookAnTable($c) { + return (($c > 127)?-1:$this->anTable[$c]); + } + + /** + * checkModeAn + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeAn($size, $data) { + for ($i=0; $i<$size; ++$i) { + if ($this->lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + return true; + } + + /** + * estimateBitsModeAn + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeAn($size) { + $w = (int)($size / 2); + $bits = $w * 11; + if ($size & 1) { + $bits += 6; + } + return $bits; + } + + /** + * estimateBitsMode8 + * @param int $size + * @return int number of bits + */ + protected function estimateBitsMode8($size) { + return $size * 8; + } + + /** + * estimateBitsModeKanji + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeKanji($size) { + return (int)(($size / 2) * 13); + } + + /** + * checkModeKanji + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeKanji($size, $data) { + if ($size & 1) { + return false; + } + for ($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) { + return false; + } + } + return true; + } + + /** + * Validate the input data. + * @param int $mode encoding mode. + * @param int $size size of data (byte). + * @param array data data to validate + * @return boolean true in case of valid data, false otherwise + */ + protected function check($mode, $size, $data) { + if ($size <= 0) { + return false; + } + switch($mode) { + case QR_MODE_NM: { + return $this->checkModeNum($size, $data); + } + case QR_MODE_AN: { + return $this->checkModeAn($size, $data); + } + case QR_MODE_KJ: { + return $this->checkModeKanji($size, $data); + } + case QR_MODE_8B: { + return true; + } + case QR_MODE_ST: { + return true; + } + default: { + break; + } + } + return false; + } + + /** + * estimateBitStreamSize + * @param array $items + * @param int $version + * @return int bits + */ + protected function estimateBitStreamSize($items, $version) { + $bits = 0; + if ($version == 0) { + $version = 1; + } + foreach ($items as $item) { + switch($item['mode']) { + case QR_MODE_NM: { + $bits = $this->estimateBitsModeNum($item['size']); + break; + } + case QR_MODE_AN: { + $bits = $this->estimateBitsModeAn($item['size']); + break; + } + case QR_MODE_8B: { + $bits = $this->estimateBitsMode8($item['size']); + break; + } + case QR_MODE_KJ: { + $bits = $this->estimateBitsModeKanji($item['size']); + break; + } + case QR_MODE_ST: { + return STRUCTURE_HEADER_BITS; + } + default: { + return 0; + } + } + $l = $this->lengthIndicator($item['mode'], $version); + $m = 1 << $l; + $num = (int)(($item['size'] + $m - 1) / $m); + $bits += $num * (4 + $l); + } + return $bits; + } + + /** + * estimateVersion + * @param array $items + * @return int version + */ + protected function estimateVersion($items) { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($items, $prev); + $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + return $version; + } + + /** + * lengthOfCode + * @param int $mode + * @param int $version + * @param int $bits + * @return int size + */ + protected function lengthOfCode($mode, $version, $bits) { + $payload = $bits - 4 - $this->lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NM: { + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if ($remain >= 7) { + $size += 2; + } elseif ($remain >= 4) { + $size += 1; + } + break; + } + case QR_MODE_AN: { + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if ($remain >= 6) { + ++$size; + } + break; + } + case QR_MODE_8B: { + $size = (int)($payload / 8); + break; + } + case QR_MODE_KJ: { + $size = (int)(($payload / 13) * 2); + break; + } + case QR_MODE_ST: { + $size = (int)($payload / 8); + break; + } + default: { + $size = 0; + break; + } + } + $maxsize = $this->maximumWords($mode, $version); + if ($size < 0) { + $size = 0; + } + if ($size > $maxsize) { + $size = $maxsize; + } + return $size; + } + + /** + * createBitStream + * @param array $items + * @return array of items and total bits + */ + protected function createBitStream($items) { + $total = 0; + foreach ($items as $key => $item) { + $items[$key] = $this->encodeBitStream($item, $this->version); + $bits = count($items[$key]['bstream']); + $total += $bits; + } + return array($items, $total); + } + + /** + * convertData + * @param array $items + * @return array items + */ + protected function convertData($items) { + $ver = $this->estimateVersion($items); + if ($ver > $this->version) { + $this->version = $ver; + } + for (;;) { + $cbs = $this->createBitStream($items); + $items = $cbs[0]; + $bits = $cbs[1]; + if ($bits < 0) { + return -1; + } + $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($ver < 0) { + return -1; + } elseif ($ver > $this->version) { + $this->version = $ver; + } else { + break; + } + } + return $items; + } + + /** + * Append Padding Bit to bitstream + * @param array $bstream + * @return array bitstream + */ + protected function appendPaddingBit($bstream) { + $bits = count($bstream); + $maxwords = $this->getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + if ($maxbits == $bits) { + return 0; + } + if ($maxbits - $bits < 5) { + return $this->appendNum($bstream, $maxbits - $bits, 0); + } + $bits += 4; + $words = (int)(($bits + 7) / 8); + $padding = array(); + $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0); + $padlen = $maxwords - $words; + if ($padlen > 0) { + $padbuf = array(); + for ($i=0; $i<$padlen; ++$i) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + $padding = $this->appendBytes($padding, $padlen, $padbuf); + } + return $this->appendBitstream($bstream, $padding); + } + + /** + * mergeBitStream + * @param array $bstream + * @return array bitstream + */ + protected function mergeBitStream($items) { + $items = $this->convertData($items); + $bstream = array(); + foreach ($items as $item) { + $bstream = $this->appendBitstream($bstream, $item['bstream']); + } + return $bstream; + } + + /** + * Returns a stream of bits. + * @param int $items + * @return array padded merged byte stream + */ + protected function getBitStream($items) { + $bstream = $this->mergeBitStream($items); + return $this->appendPaddingBit($bstream); + } + + /** + * Pack all bit streams padding bits into a byte array. + * @param int $items + * @return array padded merged byte stream + */ + protected function getByteStream($items) { + $bstream = $this->getBitStream($items); + return $this->bitstreamToByte($bstream); + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRbitstream + + /** + * Return an array with zeros + * @param int $setLength array size + * @return array + */ + protected function allocate($setLength) { + return array_fill(0, $setLength, 0); + } + + /** + * Return new bitstream from number + * @param int $bits number of bits + * @param int $num number + * @return array bitstream + */ + protected function newFromNum($bits, $num) { + $bstream = $this->allocate($bits); + $mask = 1 << ($bits - 1); + for ($i=0; $i<$bits; ++$i) { + if ($num & $mask) { + $bstream[$i] = 1; + } else { + $bstream[$i] = 0; + } + $mask = $mask >> 1; + } + return $bstream; + } + + /** + * Return new bitstream from bytes + * @param int $size size + * @param array $data bytes + * @return array bitstream + */ + protected function newFromBytes($size, $data) { + $bstream = $this->allocate($size * 8); + $p=0; + for ($i=0; $i<$size; ++$i) { + $mask = 0x80; + for ($j=0; $j<8; ++$j) { + if ($data[$i] & $mask) { + $bstream[$p] = 1; + } else { + $bstream[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + return $bstream; + } + + /** + * Append one bitstream to another + * @param array $bitstream original bitstream + * @param array $append bitstream to append + * @return array bitstream + */ + protected function appendBitstream($bitstream, $append) { + if ((!is_array($append)) OR (count($append) == 0)) { + return $bitstream; + } + if (count($bitstream) == 0) { + return $append; + } + return array_values(array_merge($bitstream, $append)); + } + + /** + * Append one bitstream created from number to another + * @param array $bitstream original bitstream + * @param int $bits number of bits + * @param int $num number + * @return array bitstream + */ + protected function appendNum($bitstream, $bits, $num) { + if ($bits == 0) { + return 0; + } + $b = $this->newFromNum($bits, $num); + return $this->appendBitstream($bitstream, $b); + } + + /** + * Append one bitstream created from bytes to another + * @param array $bitstream original bitstream + * @param int $size size + * @param array $data bytes + * @return array bitstream + */ + protected function appendBytes($bitstream, $size, $data) { + if ($size == 0) { + return 0; + } + $b = $this->newFromBytes($size, $data); + return $this->appendBitstream($bitstream, $b); + } + + /** + * Convert bitstream to bytes + * @param array $bitstream original bitstream + * @return array of bytes + */ + protected function bitstreamToByte($bstream) { + $size = count($bstream); + if ($size == 0) { + return array(); + } + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + $p = 0; + for ($i=0; $i<$bytes; $i++) { + $v = 0; + for ($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $bstream[$p]; + $p++; + } + $data[$i] = $v; + } + if ($size & 7) { + $v = 0; + for ($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $bstream[$p]; + $p++; + } + $data[$bytes] = $v; + } + return $data; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRspec + + /** + * Replace a value on the array at the specified position + * @param array $srctab + * @param int $x X position + * @param int $y Y position + * @param string $repl value to replace + * @param int $replLen length of the repl string + * @return array srctab + */ + protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + return $srctab; + } + + /** + * Return maximum data code length (bytes) for the version. + * @param int $version version + * @param int $level error correction level + * @return int maximum size (bytes) + */ + protected function getDataLength($version, $level) { + return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level]; + } + + /** + * Return maximum error correction code length (bytes) for the version. + * @param int $version version + * @param int $level error correction level + * @return int ECC size (bytes) + */ + protected function getECCLength($version, $level){ + return $this->capacity[$version][QRCAP_EC][$level]; + } + + /** + * Return the width of the symbol for the version. + * @param int $version version + * @return int width + */ + protected function getWidth($version) { + return $this->capacity[$version][QRCAP_WIDTH]; + } + + /** + * Return the numer of remainder bits. + * @param int $version version + * @return int number of remainder bits + */ + protected function getRemainder($version) { + return $this->capacity[$version][QRCAP_REMINDER]; + } + + /** + * Return a version number that satisfies the input code length. + * @param int $size input code length (byte) + * @param int $level error correction level + * @return int version number + */ + protected function getMinimumVersion($size, $level) { + for ($i=1; $i <= QRSPEC_VERSION_MAX; ++$i) { + $words = $this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level]; + if ($words >= $size) { + return $i; + } + } + return -1; + } + + /** + * Return the size of length indicator for the mode and version. + * @param int $mode encoding mode + * @param int $version version + * @return int the size of the appropriate length indicator (bits). + */ + protected function lengthIndicator($mode, $version) { + if ($mode == QR_MODE_ST) { + return 0; + } + if ($version <= 9) { + $l = 0; + } elseif ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + return $this->lengthTableBits[$mode][$l]; + } + + /** + * Return the maximum length for the mode and version. + * @param int $mode encoding mode + * @param int $version version + * @return int the maximum length (bytes) + */ + protected function maximumWords($mode, $version) { + if ($mode == QR_MODE_ST) { + return 3; + } + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + $bits = $this->lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + if ($mode == QR_MODE_KJ) { + $words *= 2; // the number of bytes is required + } + return $words; + } + + /** + * Return an array of ECC specification. + * @param int $version version + * @param int $level error correction level + * @param array $spec an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code} + * @return array spec + */ + protected function getEccSpec($version, $level, $spec) { + if (count($spec) < 5) { + $spec = array(0, 0, 0, 0, 0); + } + $b1 = $this->eccTable[$version][$level][0]; + $b2 = $this->eccTable[$version][$level][1]; + $data = $this->getDataLength($version, $level); + $ecc = $this->getECCLength($version, $level); + if ($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + return $spec; + } + + /** + * Put an alignment marker. + * @param array $frame frame + * @param int $width width + * @param int $ox X center coordinate of the pattern + * @param int $oy Y center coordinate of the pattern + * @return array frame + */ + protected function putAlignmentMarker($frame, $ox, $oy) { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + $yStart = $oy - 2; + $xStart = $ox - 2; + for ($y=0; $y < 5; $y++) { + $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]); + } + return $frame; + } + + /** + * Put an alignment pattern. + * @param int $version version + * @param array $fram frame + * @param int $width width + * @return array frame + */ + protected function putAlignmentPattern($version, $frame, $width) { + if ($version < 2) { + return $frame; + } + $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0]; + if ($d < 0) { + $w = 2; + } else { + $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2); + } + if ($w * $w - 3 == 1) { + $x = $this->alignmentPattern[$version][0]; + $y = $this->alignmentPattern[$version][0]; + $frame = $this->putAlignmentMarker($frame, $x, $y); + return $frame; + } + $cx = $this->alignmentPattern[$version][0]; + $wo = $w - 1; + for ($x=1; $x < $wo; ++$x) { + $frame = $this->putAlignmentMarker($frame, 6, $cx); + $frame = $this->putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + $cy = $this->alignmentPattern[$version][0]; + for ($y=0; $y < $wo; ++$y) { + $cx = $this->alignmentPattern[$version][0]; + for ($x=0; $x < $wo; ++$x) { + $frame = $this->putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + return $frame; + } + + /** + * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits. + * @param int $version version + * @return BCH encoded version information pattern + */ + protected function getVersionPattern($version) { + if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) { + return 0; + } + return $this->versionPattern[($version - 7)]; + } + + /** + * Return BCH encoded format information pattern. + * @param array $mask + * @param int $level error correction level + * @return BCH encoded format information pattern + */ + protected function getFormatInfo($mask, $level) { + if (($mask < 0) OR ($mask > 7)) { + return 0; + } + if (($level < 0) OR ($level > 3)) { + return 0; + } + return $this->formatInfo[$level][$mask]; + } + + /** + * Put a finder pattern. + * @param array $frame frame + * @param int $width width + * @param int $ox X center coordinate of the pattern + * @param int $oy Y center coordinate of the pattern + * @return array frame + */ + protected function putFinderPattern($frame, $ox, $oy) { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + for ($y=0; $y < 7; $y++) { + $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]); + } + return $frame; + } + + /** + * Return a copy of initialized frame. + * @param int $version version + * @return Array of unsigned char. + */ + protected function createFrame($version) { + $width = $this->capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + // Finder pattern + $frame = $this->putFinderPattern($frame, 0, 0); + $frame = $this->putFinderPattern($frame, $width - 7, 0); + $frame = $this->putFinderPattern($frame, 0, $width - 7); + // Separator + $yOffset = $width - 7; + for ($y=0; $y < 7; ++$y) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + ++$yOffset; + } + $setPattern = str_repeat("\xc0", 8); + $frame = $this->qrstrset($frame, 0, 7, $setPattern); + $frame = $this->qrstrset($frame, $width-8, 7, $setPattern); + $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern); + // Format info + $setPattern = str_repeat("\x84", 9); + $frame = $this->qrstrset($frame, 0, 8, $setPattern); + $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8); + $yOffset = $width - 8; + for ($y=0; $y < 8; ++$y,++$yOffset) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + // Timing pattern + $wo = $width - 15; + for ($i=1; $i < $wo; ++$i) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + // Alignment pattern + $frame = $this->putAlignmentPattern($version, $frame, $width); + // Version information + if ($version >= 7) { + $vinf = $this->getVersionPattern($version); + $v = $vinf; + for ($x=0; $x<6; ++$x) { + for ($y=0; $y<3; ++$y) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + $v = $vinf; + for ($y=0; $y<6; ++$y) { + for ($x=0; $x<3; ++$x) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + // and a little bit... + $frame[$width - 8][8] = "\x81"; + return $frame; + } + + /** + * Set new frame for the specified version. + * @param int $version version + * @return Array of unsigned char. + */ + protected function newFrame($version) { + if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) { + return NULL; + } + if (!isset($this->frames[$version])) { + $this->frames[$version] = $this->createFrame($version); + } + if (is_null($this->frames[$version])) { + return NULL; + } + return $this->frames[$version]; + } + + /** + * Return block number 0 + * @param array $spec + * @return int value + */ + protected function rsBlockNum($spec) { + return ($spec[0] + $spec[3]); + } + + /** + * Return block number 1 + * @param array $spec + * @return int value + */ + protected function rsBlockNum1($spec) { + return $spec[0]; + } + + /** + * Return data codes 1 + * @param array $spec + * @return int value + */ + protected function rsDataCodes1($spec) { + return $spec[1]; + } + + /** + * Return ecc codes 1 + * @param array $spec + * @return int value + */ + protected function rsEccCodes1($spec) { + return $spec[2]; + } + + /** + * Return block number 2 + * @param array $spec + * @return int value + */ + protected function rsBlockNum2($spec) { + return $spec[3]; + } + + /** + * Return data codes 2 + * @param array $spec + * @return int value + */ + protected function rsDataCodes2($spec) { + return $spec[4]; + } + + /** + * Return ecc codes 2 + * @param array $spec + * @return int value + */ + protected function rsEccCodes2($spec) { + return $spec[2]; + } + + /** + * Return data length + * @param array $spec + * @return int value + */ + protected function rsDataLength($spec) { + return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); + } + + /** + * Return ecc length + * @param array $spec + * @return int value + */ + protected function rsEccLength($spec) { + return ($spec[0] + $spec[3]) * $spec[2]; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrs + + /** + * Initialize a Reed-Solomon codec and add it to existing rsitems + * @param int $symsize symbol size, bits + * @param int $gfpoly Field generator polynomial coefficients + * @param int $fcr first root of RS code generator polynomial, index form + * @param int $prim primitive element to generate polynomial roots + * @param int $nroots RS code generator polynomial degree (number of roots) + * @param int $pad padding bytes at front of shortened block + * @return array Array of RS values:
  • mm = Bits per symbol;
  • nn = Symbols per block;
  • alpha_to = log lookup table array;
  • index_of = Antilog lookup table array;
  • genpoly = Generator polynomial array;
  • nroots = Number of generator;
  • roots = number of parity symbols;
  • fcr = First consecutive root, index form;
  • prim = Primitive element, index form;
  • iprim = prim-th root of 1, index form;
  • pad = Padding bytes in shortened block;
  • gfpoly
. + */ + protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { + foreach ($this->rsitems as $rs) { + if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize) + OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) { + continue; + } + return $rs; + } + $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift($this->rsitems, $rs); + return $rs; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrsItem + + /** + * modnn + * @param array RS values + * @param int $x X position + * @return int X osition + */ + protected function modnn($rs, $x) { + while ($x >= $rs['nn']) { + $x -= $rs['nn']; + $x = ($x >> $rs['mm']) + ($x & $rs['nn']); + } + return $x; + } + + /** + * Initialize a Reed-Solomon codec and returns an array of values. + * @param int $symsize symbol size, bits + * @param int $gfpoly Field generator polynomial coefficients + * @param int $fcr first root of RS code generator polynomial, index form + * @param int $prim primitive element to generate polynomial roots + * @param int $nroots RS code generator polynomial degree (number of roots) + * @param int $pad padding bytes at front of shortened block + * @return array Array of RS values:
  • mm = Bits per symbol;
  • nn = Symbols per block;
  • alpha_to = log lookup table array;
  • index_of = Antilog lookup table array;
  • genpoly = Generator polynomial array;
  • nroots = Number of generator;
  • roots = number of parity symbols;
  • fcr = First consecutive root, index form;
  • prim = Primitive element, index form;
  • iprim = prim-th root of 1, index form;
  • pad = Padding bytes in shortened block;
  • gfpoly
. + */ + protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { + // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2) + $rs = null; + // Check parameter ranges + if (($symsize < 0) OR ($symsize > 8)) { + return $rs; + } + if (($fcr < 0) OR ($fcr >= (1<<$symsize))) { + return $rs; + } + if (($prim <= 0) OR ($prim >= (1<<$symsize))) { + return $rs; + } + if (($nroots < 0) OR ($nroots >= (1<<$symsize))) { + return $rs; + } + if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) { + return $rs; + } + $rs = array(); + $rs['mm'] = $symsize; + $rs['nn'] = (1 << $symsize) - 1; + $rs['pad'] = $pad; + $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0); + $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0); + // PHP style macro replacement ;) + $NN =& $rs['nn']; + $A0 =& $NN; + // Generate Galois field lookup tables + $rs['index_of'][0] = $A0; // log(zero) = -inf + $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0 + $sr = 1; + for ($i=0; $i<$rs['nn']; ++$i) { + $rs['index_of'][$sr] = $i; + $rs['alpha_to'][$i] = $sr; + $sr <<= 1; + if ($sr & (1 << $symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs['nn']; + } + if ($sr != 1) { + // field generator polynomial is not primitive! + return NULL; + } + // Form RS code generator polynomial from its roots + $rs['genpoly'] = array_fill(0, ($nroots + 1), 0); + $rs['fcr'] = $fcr; + $rs['prim'] = $prim; + $rs['nroots'] = $nroots; + $rs['gfpoly'] = $gfpoly; + // Find prim-th root of 1, used in decoding + for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) { + ; // intentional empty-body loop! + } + $rs['iprim'] = (int)($iprim / $prim); + $rs['genpoly'][0] = 1; + + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs['genpoly'][$i+1] = 1; + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; --$j) { + if ($rs['genpoly'][$j] != 0) { + $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)]; + } else { + $rs['genpoly'][$j] = $rs['genpoly'][$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)]; + } + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; ++$i) { + $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]]; + } + return $rs; + } + + /** + * Encode a Reed-Solomon codec and returns the parity array + * @param array $rs RS values + * @param array $data data + * @param array $parity parity + * @return parity array + */ + protected function encode_rs_char($rs, $data, $parity) { + $MM =& $rs['mm']; // bits per symbol + $NN =& $rs['nn']; // the total number of symbols in a RS block + $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form + $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form + $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form + $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block + $FCR =& $rs['fcr']; // first consecutive root, index form + $PRIM =& $rs['prim']; // primitive element, index form + $IPRIM =& $rs['iprim']; // prim-th root of 1, index form + $PAD =& $rs['pad']; // the number of pad symbols in a block + $A0 =& $NN; + $parity = array_fill(0, $NROOTS, 0); + for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) { + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if ($feedback != $A0) { + // feedback term is non-zero + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback); + for ($j=1; $j < $NROOTS; ++$j) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])]; + } + } + // Shift + array_shift($parity); + if ($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + return $parity; + } + + } // end QRcode class + +} // END OF "class_exists QRcode" +?> diff --git a/assets/tools/qrcode-url/lib/cache/frame_1.dat b/assets/tools/qrcode-url/lib/cache/frame_1.dat new file mode 100755 index 0000000..be28fea --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_1.dat @@ -0,0 +1,2 @@ +xڝ E9u`"PńC牗T!0$ +EɲQmh۾9{kI" 9Ln)Ap־>^zmnŖ;mn \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_1.png b/assets/tools/qrcode-url/lib/cache/frame_1.png new file mode 100755 index 0000000000000000000000000000000000000000..86ce6e98d8cf7071291d5e5bb39bc3080511c8b8 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dx33?wJtG`|X@*aCb)T!Hle|NocXoPQU{GWK+F z45^rtobc!Hfq>uNnVVn7Gg`2HlysJm`1k++!4KjchA)1}^Yl3E66=VaXwbng!p`vB WU-#~W{*xdZ7(8A5T-G@yGywobm@6p& literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_10.dat b/assets/tools/qrcode-url/lib/cache/frame_10.dat new file mode 100755 index 0000000000000000000000000000000000000000..aff163f6882e1c842881c539160539ee97221e5b GIT binary patch literal 204 zcmV;-05ku1+U=K34ul{KMqP93Nm#TyxdGe+ZZ`bX2|6GY6RiCuCX1^|Hy)_wA3>UwXVkes{2iDcbZs(b-_ G?>v^)7G+HU literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_10.png b/assets/tools/qrcode-url/lib/cache/frame_10.png new file mode 100755 index 0000000000000000000000000000000000000000..dbfcd70b588c9cc508d210d761ca285c962e70c7 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^mLSZ?3?#Q*6Fdf_*aCb)T!Hle|NocXoPQU{s`qqp z45^rNcH&0P1_Kcn{i)eEQ&eWabo5TEo z<(=q;l{2~SNFHOk7+K+Z++>o}0+W;js(lQ_L5J;4XHRbpJ@7EKSbjtGxs>0TanIFf yTerS?Jf(G)Wt_o(rC4{V)qPjP^(|O~A28=0dj4ToPRUb}EH+ z?=;|LU8z+!qM$&p(|BcWyT^0wyzYLMW@>oYiN^Dsz8hTJ&2>O!x(G0znDxja{`YBp#zXm>E3^H?-L*y!rE y89Y|aZEw=D55}L{`-%PL$7vt8g(jF3$nUZA+WWV7Z-WicDGZ*jelF{r5}E)IO-=m( literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_12.dat b/assets/tools/qrcode-url/lib/cache/frame_12.dat new file mode 100755 index 0000000000000000000000000000000000000000..73228b3621ffadae4f60766395a1481ebb5ec8e0 GIT binary patch literal 222 zcmV<403rW)+U=M@4uv2LL|t?1pRjLqt$5hLLY|jw(O$c@esqcjU~XWxX2%DQ}j2 Ypk>~2FWzvVWdEB3>HkBaKPQDn?w1{Br2qf` literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_12.png b/assets/tools/qrcode-url/lib/cache/frame_12.png new file mode 100755 index 0000000000000000000000000000000000000000..8a23a480516888912059f9a7c5e6bb03745c029c GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^jv&m)3?#Q$MzaAawg8_HS0MfW|No^o=iddgx;$MR zLp07OC;Z`O`p;)zaHT2o|6@ssn1en08x5|_?@qWT|MUNU=7X>P-D6i`V>=dLP>_)D zgJ10T|NV^*^<88qe3j=qkQ8w3g4pi>{%_LN%!j{MZKyvjEwPU&^5g&i?aJMXS9o*( z&uiKI>EW7{{~y*h{}!LowjhzgQ(D0=e1}!|jyRUpV&{@tHZu4M{F6Jv-(d)J6@#a% KpUXO@geCx@E>=_k literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_13.dat b/assets/tools/qrcode-url/lib/cache/frame_13.dat new file mode 100755 index 0000000000000000000000000000000000000000..2256f0e34541826effd2df0bacb3ab30acefc512 GIT binary patch literal 223 zcmV<503iQ(+U=M@4#Xe`MZ5OalemCgy@B3DZ#HV_#3rMq=%xwZRYUoCg(gH&s)}}d zDnyJ&axy6vNn8LRQg(JJBqEmTQnM#q0FdnxiaIQ<%eXGVdmjd0M0KGax&8kMKA%p^ z{dyEh&snn0WMiwGeO{L=OESmfzD@7T!EMuc4o**_dv29=tg%zuR9}#CwLe ZF7lm6+oM%3(p}KSMZA}4^aZ5yN}69FYBT@< literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_13.png b/assets/tools/qrcode-url/lib/cache/frame_13.png new file mode 100755 index 0000000000000000000000000000000000000000..c33224b2c09fb324eb749bc8ef0b907527c894f3 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^t{}|F3?$W@cV+=8wg8_Hkl_FS|CipJe;3GV^mK6y z(Kvs1(nj6}10EK8QC;s;1{DEe17;JA(;Jyot(Q1nP)L4rB(bfgv}!;1ejfKlyb)99 zajY-dGShEqTSmUB`Dc?uyo=-%zP>oN*iy|as9)=A(uC^AP1+vp*PAA1KDqWU?&Q_$ zj_D#jYMZLpHow2VW%?KAH`M4w|A(xa#R2S literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_14.png b/assets/tools/qrcode-url/lib/cache/frame_14.png new file mode 100755 index 0000000000000000000000000000000000000000..efc36c034f1a851498e5afad249adcce3d9fb04a GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^o*>M~3?#kx&YTaV*aCb)T!Hle|NocXoPQU{>hg4P z45^rNchW}Q1_K_Jxm}Srn$(yB6x19;G$JQ*YGh^#@P1G+>r7-mB7W`V*G+#Woopx# zaXH*8JW=$>j6!jp4LdeJ%jrLRbWNrUPz|e%?4;ffl``SFGrY?`?QLBi&=CD)URb+W z;hsD0-;#Cz-B}wlN7VYo-djpFrLW5Bvr5*ct<9@=upq-IF3r5?k;t7x_kgZq@O1Ta JS?83{1OWKuRWASl literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_15.dat b/assets/tools/qrcode-url/lib/cache/frame_15.dat new file mode 100755 index 0000000000000000000000000000000000000000..18727818d76dba4873f5993f6c9ba948ca4646af GIT binary patch literal 242 zcmV zjE0Ef4oN1(k{KEk$4bexVm9YiXdC56v{3T$rBr2ZX>#9!_g z`B^`!y7Nq9&A4060Wo%qv*Ufsu{CCYT^E&9np3604Q_DzFE?pw^~|@kYVIa#&+I*` zl@Y;Kkq??`U*qt@M8@#wp?=9QD&F@s(Gu5We?xHWW={>BMTjUwEzGB literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_15.png b/assets/tools/qrcode-url/lib/cache/frame_15.png new file mode 100755 index 0000000000000000000000000000000000000000..fb54ffc8e2f3e7d0d29c4d679871fe89a1e5072e GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^z97uV3?y$Jul@|A*aCb)T!Hle|NocXoPQU{>i2YU z4AD5BobZRAv0g$VYvGyI@)9u%&#Y(4@cH(?{>guNQHGVe|Nnpg_kXv%goLxALQCUA z`;agH`P=pfY;|~6FTv1#XhyTo7iZfed*!tx_FZ?b`M9^~VfNquAO6=r{$KAZ=o)0L z^2h8`%^tynfBF)({d51p^w2zkui>Y}v{j9Z)^TiI$00mn##RnBzopr0N~?YBLDyZ literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_16.dat b/assets/tools/qrcode-url/lib/cache/frame_16.dat new file mode 100755 index 0000000..60af678 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_16.dat @@ -0,0 +1 @@ +xA E]sIX;n6`qW6`%A/3!!g̡1N) E|;>6⸏97$c]kkw1[mC͜cR>E,hʼnp#xFyWVWG3+˓S}Ğ#G8b^c^cpc&3YQ"vk9܇} ĿQL/ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_16.png b/assets/tools/qrcode-url/lib/cache/frame_16.png new file mode 100755 index 0000000000000000000000000000000000000000..6ac8fe890573bd9ec52af39a315ac3ab4ea2821f GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^fgsGt3?wHw-Y5l9YymzYu0Z<#|Nl#G&c6#}b$Gfs zhE&W+PWZ#m$}S<1weXDnM;@Ma0pIRB@R(Uk#Imf`XJ1(VT~b2AdEtS^#)tMHfByex zYuj(|)!|#c1w;4Yo6V7boNcfCeZ$Lh|MkLuTKNe-qW;_ev6oobrMz06=bb#S{I8Dh zN*l`;cPanr7UAppFZhu8w7WuKxXRac9?ujuXHUG*!(qm7^gY)#$(yb3fo@{(boFyt I=akR{0Keo@^#A|> literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_17.dat b/assets/tools/qrcode-url/lib/cache/frame_17.dat new file mode 100755 index 0000000000000000000000000000000000000000..87f0cf593bab1049b794e2cd5af31a03aed5ae4e GIT binary patch literal 237 zcmV??y z+zk`^4Hi`JDI!!RUucn1n-C-N9Fb z^_i|y`igmlD_r3USGeLnfcpUE6|QiFD_o!A%FM(h?MeyC;;xkP+jach+JBqBM9KYfaSc^$Z&>9G^P0tbL9Kb? literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_17.png b/assets/tools/qrcode-url/lib/cache/frame_17.png new file mode 100755 index 0000000000000000000000000000000000000000..7bcd1be17655408d3e5ce2c8ec506a3e549c50ad GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^p&-o23?!MXtt5dITYyi9E0F&G|NqjP^X~##ZJsWU zAsXkC6aMhChD%6fCBE4#FAYX!4B<7RpBbdF@a}WHcJZTFnHvrE$i7lj|1o;22WQ%mvv4F FO#lYzP&ohq literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_18.dat b/assets/tools/qrcode-url/lib/cache/frame_18.dat new file mode 100755 index 0000000..bb7138c --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_18.dat @@ -0,0 +1,2 @@ +xA +0E]օ,2;s&͚hO1&09OIv@DD &ىKXFv<dq9<%h Ys !(ds;~||b(Yůg#`KSĶsidߍLg:әt/gmkM3{4rTQes><әt3;H#љt3Y+oghٽlnF>i^#awm;g~pgNs{6zp' \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_18.png b/assets/tools/qrcode-url/lib/cache/frame_18.png new file mode 100755 index 0000000000000000000000000000000000000000..b27eaae90572426fe76d57843a8a5163fb8c32dd GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^ks!>-3?%c9O1%M6YymzYu0Z<#|Nl#G&c6#}P4{$h z46!)^(EB zRpTPFRu)IFuPj`^AD|b+oSbI4@mmmk@iLw@%~RIRi#jB2AbP){Q+Jur!_~75cQ>Ch zN#A~X*0M8GG|P9$&bs@|eed7ix?Pnn7V@(a)T_K%7QbJ;eCu2JfXE7InFZYwm~0sN X&+pw|oxd;y=tKrjS3j3^P6V|Iq-X*aCb)T!Hle|NocXoPQU{n&|1` z7-Dhy?UaqYhYUnq&Wo-sPned&kR)=)WnRlfiRM0!{Ttt?RfUw*&0t`>Zaa5fVSEGu|t>Dkk^tTZPh$@}uFhpVMe-)&UAdgtwx zC6hEI^#bnAy8Fz1@88&Zr(hcy+dCib?YY=cyw}#%_nouO&hmwC6Tb<_>|vM|C9d*4 SA>0AzI0jEwKbLh*2~7aaI9rPV literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_2.dat b/assets/tools/qrcode-url/lib/cache/frame_2.dat new file mode 100755 index 0000000..7e42f31 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_2.dat @@ -0,0 +1 @@ +x͒ F{v& &Y+?Z1S'y!a815&۴HٞclF1#6 f6O7C֏8gIfB\DԻ( \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_2.png b/assets/tools/qrcode-url/lib/cache/frame_2.png new file mode 100755 index 0000000000000000000000000000000000000000..9c150ebe3c6343f6eb7549ec855a85c65de7604d GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~;3?%=liz@&rwg8_HS0MfW|No^o=iddgTs>VJ zLn`JZC;X{zXk7U1e=Qr^_5b1%IX6fouV7|A3{)sB@vn(vQN$aEu-Zyy=Ewg(ur1JZ on5OM)8&Req;!^#!TfKm!>(UHx3vIVCg!03uy4-2eap literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_20.dat b/assets/tools/qrcode-url/lib/cache/frame_20.dat new file mode 100755 index 0000000000000000000000000000000000000000..d5ecc1d8a0be752c422607ca863710fb41e89f29 GIT binary patch literal 250 zcmb=p^>&so*I@;L*3I9pv5Fh-u3+BVd2h|XrM?Rygy#mlsE%yq{QN_rm3^kbraf_K zT{CJkWkNo9UY6CcnsV--^u zOJldbdLR|gckNx0zDb^tqE2c~fteS{QV^$$s-(VRP{&d+%}!k2n8hWL&;YFRNm@X@0pL0J~;%WB>pF literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_20.png b/assets/tools/qrcode-url/lib/cache/frame_20.png new file mode 100755 index 0000000000000000000000000000000000000000..be5126e44ce319c87a32367a0abad2b8ff62a859 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^i6G3#3?%=YhhpAQ z46!)kB?@cly=PptWGZd4sNV_HV_V7A;8Qx^(OLf=ga;W>UI0C;K(# ze{-D0{c*y&tG)An1hgDYu&LrSORo2N7-r-l!XCN)mNNJB!=bOBH Q3v?NSr>mdKI;Vst05l_EX#fBK literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_21.dat b/assets/tools/qrcode-url/lib/cache/frame_21.dat new file mode 100755 index 0000000..1974dd9 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_21.dat @@ -0,0 +1 @@ +xA E]sIX;n6Upв]٘< i-eW)ŕ…H\jvqHL\6ЅrILܹ%@Vv(P4|Xngɝ~]Du1Us S\,2N?DKF-:eJ]p_,a0` X` w,` X]5 Y4{2vJs9)u۹,]^_7$_ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_21.png b/assets/tools/qrcode-url/lib/cache/frame_21.png new file mode 100755 index 0000000000000000000000000000000000000000..f4000c4c425c1b45e59cbdf8ebf58de3e84d88bc GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^sUXbA3?%b5?e76nYymzYu0Z<#|Nl#G&c6#}&GvM0 z46!)Oa@O^KbLh*2~7appkz@1 literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_22.dat b/assets/tools/qrcode-url/lib/cache/frame_22.dat new file mode 100755 index 0000000..0f01802 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_22.dat @@ -0,0 +1,3 @@ +xA +0 E]{.]{{{ZBepwe@VERZ3"*2o4y)i#dbdF҅I"4WIu45x.ZS{8k={o.q[:帒qy +)t#N8dCj-OOG}:/:sz!)^&32ite~e#^+LRiYnGe^u zy!rp1m#1E^%JI(s6AU`tXJpwn$-ff(mztmOBd(vL_Y+&&`mg^F|356yrZekaqI}rm zhc;5@l+{&I19wgj-0A;+ahqtChtWTG&h#Zh5-P8|R$Ujpnqrctt2JG)m7Brqklc$J Tz9qdt=P`J?`njxgN@xNAJ(pG6 literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_23.dat b/assets/tools/qrcode-url/lib/cache/frame_23.dat new file mode 100755 index 0000000..ee3b370 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_23.dat @@ -0,0 +1,3 @@ +xA + Efo7ћU) %M!ΔYu(<sKT +&I\i+Ъ(mFQhv~n1o]s_ޟ3`_w2ȹlc[;c֟ˤN4p 7pmTri_pS=77p 7pÍ>IO- 7p 7$}>ɷ7p tssrs Vmҹ}R~7&?7ԦIbh{<Mi- \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_23.png b/assets/tools/qrcode-url/lib/cache/frame_23.png new file mode 100755 index 0000000000000000000000000000000000000000..fc1ee947ec2e272df35eedd0b2dc2047cc592af7 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^xggBQ3?wI-)rtZswg8_HS0MfW|No^o=iddgdOTem zLo7}wC;aJWh?kJanz$p}-e8APVL#V`g7Zx~YJC5nC>>?bY1_zo2TeKwhUHk8@z!Pb*ckx3TsdGRgCnY*? zXM5nzMgId2bD63%s@fM>C{MrV5E&k_cijrL#f8~{J9{)@7=*iL9A9tRBnfmEgQu&X J%Q~loCIHV*P!s?F literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_24.dat b/assets/tools/qrcode-url/lib/cache/frame_24.dat new file mode 100755 index 0000000..7b92e29 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_24.dat @@ -0,0 +1 @@ +xA EMX0;nVP4HSSxU3/O LiJ4V JC%6VR&DBHjDJ??BlcDZ'UXUޏ0ywįj똳3ścj{:GqGNv;笓J <]#8#8H'GqGtr:9#8#8ؓhNt_>teS^\gQe?vuo;>*wlm \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_24.png b/assets/tools/qrcode-url/lib/cache/frame_24.png new file mode 100755 index 0000000000000000000000000000000000000000..cab5714038afed8493bb587fe7d01b8bdec50dfa GIT binary patch literal 233 zcmV%iK~y-)?Uf-8!!Q&>9n@p&DkVL@z%;lM3>Q_&)dr`bg25?QD5**s zz0sdvKC+lSStd5H0!FWR/+uT廯 ӯ嗴u[Sa[kv5+5nJ%+VXbŊ߬u'SRtzZ++VXbŊٟٟٟ+VXb}Ŋ+VXVI+kq[toVZvoNVw}{r<ýR"R] Wr} \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_25.png b/assets/tools/qrcode-url/lib/cache/frame_25.png new file mode 100755 index 0000000000000000000000000000000000000000..caa09cd48d3bca80eb61d766030b85d43d4ae4b4 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^r6A163?#iy+587mYymzYu0Z<#|Nl#G&c6#}E%bD8 z46!)Lh9 za@rA%gfElWP8SE||GZYIH@E6XP9k&o3@hG%dj)Nr?>rwSY?;2nF7oKJlZP}{huryd z|BuP6y5K8Dv;IwAQMqK!0}lQf*X!oy|J_!5%Px0*{m>mۚ?vmg?ұηdCUIkE\Msfafa>[sӈ9쬩ެ8b]LgEo w1 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_26.png b/assets/tools/qrcode-url/lib/cache/frame_26.png new file mode 100755 index 0000000000000000000000000000000000000000..2af2728c636a32abbaec8231c72c4902b86ad3f1 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^l_1Q>3?$V}WIz&Z0X`wFK>Gjx|4VPqzYAn7@pN$v z@i_i=>PFr}4m_^^Lua{=- zcQjn_%%>@B9M^W2^d;<8*-&#ZanCcQSrE^@5yt1<<_=p00i_>zopr0F1t0JOBUy literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_27.dat b/assets/tools/qrcode-url/lib/cache/frame_27.dat new file mode 100755 index 0000000000000000000000000000000000000000..b4d9ffd4f12599ec1ff53e3c72826989978fc8aa GIT binary patch literal 284 zcmb=p_4c+SU$cTh>%(+id5E{n0v40R%_lqrDMPR_=K#Nbs1J=Z*FW%KHev5UH0bx zvhP3A?5`T{eKs|C?=(67e>XRlv;V$O{Jat(4^}wWvJV8GgET;O7Rx~3dn=g8x81kq zTBsYH(o>B~k(w6wdiUP<-~a4d_f^K|^b>jOg|*Ku{@y(>H?~&4sQTS6>xH+g>q>Tg S)BB(oTgzV+tiQ0S`YHfvkCqVt literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_27.png b/assets/tools/qrcode-url/lib/cache/frame_27.png new file mode 100755 index 0000000000000000000000000000000000000000..db2edd6d7822f692ce74f81cc0bdab033e0c97cf GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^wIIyM3?#Su{YwKBl@3WvH{{7UCf{Rv zV%wr?DYv_RrBxi*=GSvr`t9}T+i6?2owYEWCl_Pu@k4K4%z>?2#VfnsrA>da&gv`2 dB=&=i@~_y^^4Au4=mDL{;OXk;vd$@?2>^!SUbg@M literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_28.dat b/assets/tools/qrcode-url/lib/cache/frame_28.dat new file mode 100755 index 0000000000000000000000000000000000000000..8cbaa1961bed61c3d774192448857480eb49762f GIT binary patch literal 318 zcmb=p^>&UUU$cUMYi#vvHNCX5BIcc(ch)S(P&rt#xF_>o`BhIHdwqxJ`pXR0ab3O; zyhvzU>thM$uzdDevN_u7>@yw8*(S-Z(T=tZ`1|rey6L^W%k_%NF5F|Ui=6h%{9e%d zZ;qDSdF$l&FG(-^99&vHr#0ZpbjM5kK3J?R3cg=E!9=w8_VG%C;KB!IWDhW~88k5R zBz#a~TYLY*^54yi?c%-~`hWLu-)r%Km;K+Pv$J34CnoIU-@%{2z$^h(euDc6>nEnl zMr%QcZlKHrafo2K5)VwFf<8p>oeNCgzsZd&I##GMUwz`}E2+Yy_3mfghfV%>+;#2K w_7?4#@$=nu@tm|;Z8o*f=bqOl7=Ny{vgQCw$QP3iwsQrUC;l&6^t66w)h3yf zc}++DO;a|I{$#;?Q(&G=KIM$l bBz652vvy6;V13#KbR>hPtDnm{r-UW|W^G^e literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_29.dat b/assets/tools/qrcode-url/lib/cache/frame_29.dat new file mode 100755 index 0000000..5e4a711 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_29.dat @@ -0,0 +1,2 @@ +xA a޺ @n7+*4!?J 抮]STf)sI"Ȕb0|"Luٸ,E1\6*uQ?>aυR-rn.ꯋ\T:*)|) , ,x_}:^RUoɢu~މX`XЏЏЏЏ_`X`XЏЏЏ_`X`XЏЏЏЏwbX`PU)D"c{z3<}^?bm잃a.] +{Q6uT,9 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_29.png b/assets/tools/qrcode-url/lib/cache/frame_29.png new file mode 100755 index 0000000000000000000000000000000000000000..e17d94ff857612e594137a2c24e946859030c974 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^tsuP;BJn$?U}wS}0TXykDc5%F}Pb9F^HI>YU!D_xBYq^}BRWJ#p5u$@O~+U60g$ z^ZZ%%C&E6_>--Dp^Lw@H{+B%qvQk^Qjp5k3r)$sId8T^L{8KD*Wwpx3yDA4+gnbMS zvP`Zw$-FB!Z`b@c+Rxs&eZ4X_H(t}zN!in)_Pe(B-kBwv{Vn`0k`1A%fm#-_F9E_Q zHV6?QtI7cc&w)*Z5ts^pmI@a>n)4-LQd5VAxSF@+|0}%z9_8)t4X9Z8-TGsS+L_O` o3*N2iKjl*T?_}Zp7w1|m>#S{6FV2w-Q4O5Cykv#>|8j$;0GhIr$^ZZW literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_30.png b/assets/tools/qrcode-url/lib/cache/frame_30.png new file mode 100755 index 0000000000000000000000000000000000000000..da33510fb7fd4905cafa9dea26d075c61991e1cf GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^ogmD}3?!9ab#?(Mwg8_HS0MfW|No^o=iddg)_A%& zhIkx*J8dEFVFv-0?~YH5E_r!y8FZ{sn4XyO_v<9DAeV$EVm>;;`_&a*{O39JncICa z^X?}iCno7#nz4BA^mVOQt+vz$GW*X^zCCmAR5ytSyxA(gIg>^5D)oeRvM!r)pGi2? z=j3AhtV櫷:ñA8-+mTbllltM&]ll&]Ill&]y 6` 6`iuyXWi\tz>.zk t77wJϔ4w҈85 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_31.png b/assets/tools/qrcode-url/lib/cache/frame_31.png new file mode 100755 index 0000000000000000000000000000000000000000..ded1e0ab6843bf0baf267af7f5bb5ba2f1774ba4 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^y&%lU3?w&9$bJT-*aCb)T!Hle|NocXoPQU{TIuQH z7~*mK?KDL`CPM*+?OfIN4^00sG(C~L67x$Vu7Ii2C9Z$Hrw4iPmc||i;N;S zCWpzq%~2|DzZb|S8?{_tgKeAbn}o*SD#lM7Y7dHrRk#!`FY8k(5p&Jj-mUZ{cu7{u zwfkW_Z{IGSE_2K2rZ?9ThrI_R=S^t4mN5P9y{y}B*KUgpyS--q8rQ|M-8f@C%1c(< q`a6Bv-d|4_h0DvQwxspWagrC9lQ-4nCATTi(F~rhelF{r5}E*SOk)lJ literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_32.dat b/assets/tools/qrcode-url/lib/cache/frame_32.dat new file mode 100755 index 0000000..aaa0808 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_32.dat @@ -0,0 +1,2 @@ +x + ־. Dl, Mz6Ç gcJD;'.AIqމI,IrYFk%DOy|EDD(L_Y>*ߚ?aOkL_<[c>c˘uLI%#0#0#otѢ}4fv_)Eph5R881#0#0itZ#0#0#0itZ#0#0#0itZl0#09q"HܜHQ"L5}-Y׾k`>z鸳4&p!!`:5 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_32.png b/assets/tools/qrcode-url/lib/cache/frame_32.png new file mode 100755 index 0000000000000000000000000000000000000000..6e2f23b65a743dc29ec9d4e25155fb0a41b4d458 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^6G51f8A$#VJCOjS*aCb)T!Hle|NocXoPQU{+TiKp z7~*mK?KDN9Lk>Kyn^zrwpk>OT(zG(Es%O=?cfJ3X&Y&Mo9EKkm79M0$0oLS2IHGhkmaBi8xn5giBhjTJX;pD((n{Nsx^u6)ZQI!&I#vkCwXi=tSpQ@l-)_q{ yEyd=~_i?^%{At~u^#Ag*8}?%Jd-=Sl)iSgt{AM_w!4MC0JA5b_w͟?\Rai+7W\wLUNL ++ ++jOkc\˩|%o} 8 ++ ++ ++ 3g ++ ++ ++3g@ ++ ++ ++:RXB9I=ko/Swؘٯ`gr_ٙYVSYzIefnmQoz > \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_33.png b/assets/tools/qrcode-url/lib/cache/frame_33.png new file mode 100755 index 0000000000000000000000000000000000000000..ccae1b0037c6e3d50ab22c7fbcc1ef5a65a596ea GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^Q$d)K8AxX5Xz>6kwg8_HS0MfW|No^o=iddg7JIrl zhIkx*J57;~$&ttPzs8%mE@=k~u4FY^rsoeCPS`RD#T(BQ%(2UJjTU0rWa=ANr*%uc z%PBa2LFBg}8QtjV`97^SZ{F@)FwyzM>wCKv&GDVfa7#wr%(`E=#B?L8PVxWqD`!+^ z92F?u9(b`e_5}BLvFD2_cRv53TI(5qY5JL^`ZIs4e&@KMn^4a7o!3U=%f21xCNzb)OE=JWTSu!=w6LqU*^gyy-W?Z;@;Fg>L`1=l-EkZ?iVvV?C0_X=i2_ zCW9G)ljhbgx7l(nwvgX`%e6^Q_5bh5(A^bzqxMK4)(Kt#i%i{@a^9b964fc@euQ;PW=~uiO$9&bh5{_tFHU!`RuOS%;Mm{OAGfbegQ-(&pRkY%(|(p|6QABb@3_l5OsZFJ zgSmxD+2(r^qygTh2XweY|A-_q!&2k4t`5 zdHt-uf3>=7$NxRcHpcK?YhPbowodr?x--Th*X`3@Jbts=sCI7N@2dT+b7tjn%l`^M?L^?B>}TrgGEWxv+gtv>&1 z^SpAXK9B(~H-km1?tx8$7`Ys%2q^kG_8{C6zxh|wzed(x`wSQ9yIX(x>6}yP9JAN? zaAi*~^7>i6``g|}l``+#Pxx*7Q>a$?+fMp@&Wq;Q9mQL}|JJ)V^U3dOv#MPg=?~>E Qwf>fGyj#QM-^sTe06Gf6oB#j- literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_35.png b/assets/tools/qrcode-url/lib/cache/frame_35.png new file mode 100755 index 0000000000000000000000000000000000000000..e6bfac70172b53cde3dc5e63270a60d9df021bee GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^b3vGq8Awif@nR~FVhivIaRt)<|NmclbN*c*YmTRj zV~EG`x6>8*4jTxtTwh@_|3&bhX0b2oih*|Gv(l%`cG2xzH+{pMTo1IyV(N`+m49Xz_kSZ@a~px${3xSh~>Wu?>T_@9!jEYuTuIduJ}3C2rEZK-aeE zl&-DVcKM=9ORP&je_A(tdb#B!5HkIraZhrO;SZx{9XG$+clkCi{@=YdIq9j(gDngq bIQ}p`ixDHtOI5|b@#Qg?H_pDw$;Z^XB}m*L@cxD_oki=_lM}=$=E<9G z-R?29c-FLpVq^dBT+!v^g&NTH_@wd)yXEcGyBzK-j`OqvsA7=ytvYW@9>9b z_WqKQLf0xI)<4~MTkdf{-#UAXb5bv_XIHKgJ-y+Ial~c2Rr$$h4+rJ0P5XKC?x8T> z8}0rlCMY_$@kss?KYU%i=k@&DYZIUS(0u#r`Qg$fYBKRcefj5YDxU=N96s;-dSNve zNU2c@M9){5FJQQ)9U&%Zbfx$L7;cb*sRL;UIPVCC2diGpI|Q*2B5lhKfv>@?fNH7t zol$&B)74DpqnE3hkLL7O>+2T(ei-}yr{??h8{VJ({BR!k#40|+{iXYjd3MGhD3d#O cr#P`%x8CVcM|J%hp|(5rsloS;^$2?d0KeI-=l}o! literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_36.png b/assets/tools/qrcode-url/lib/cache/frame_36.png new file mode 100755 index 0000000000000000000000000000000000000000..c6adf36b063e790ae8e9ec300a5cea4838b3a739 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^3qhEX8Awi@@B0-nrpudUd!k%j(n=Ibxpvo}FOllV?ZpSDp6DLW#cUaW1oeNz5~Et5?&f3dASXRmWpa=I7L`3#<}elF{r5}E*= Cmu+bP literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_37.dat b/assets/tools/qrcode-url/lib/cache/frame_37.dat new file mode 100755 index 0000000000000000000000000000000000000000..015c0f24b1fcf3596e1911371b84ea8f6d3ab4d7 GIT binary patch literal 376 zcmb=p_4clBUbBG!+l4hdOI5|b@#Qg?H_o0a-|WGf8=f-Z-UQzi!P+WAKO5=($3f12 zyTUY|C-RzyJvInGGR4wY^Lk0}sYs(Gsb0>W;+CoZ{7==byZrmTWaR#jx=*j}d9!=n z?jLue-7XczO-tXCTNhVr9_xF%CU42z`5zaC*qmOutsr!7Nc8d9(}S-rUG+8hGgqu? z>hF#zI+2@FPEJzwo~AQDvGQO3&(Hs_exLZN>iNf?wdd`Eg1#-+{C#?NzFg&`r^?Tk ze!Y~>4^#=)^407M7_OO)5CclC+`bSD6Zb-m25VS)uMGyjf-Qs@QzZ?7*Sz=JBAN4V zs?k%Ey^Est6oX4n+Z;cW+cNi&e)WmBGn&?4`2F$Yr!zA>_V(^buig{cW~=_xLjUnR b%i@}2^Cua-iuB0WJUmakbVYvd1M%+wXsyHf literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_37.png b/assets/tools/qrcode-url/lib/cache/frame_37.png new file mode 100755 index 0000000000000000000000000000000000000000..dea3c86117c439f0939e39768cc5df941eee66ab GIT binary patch literal 259 zcmV+e0sQ`nP)&lHKGapz;!#HO)ninvTh$?@5lZKuLV|u!9BiBr~kg65|PXSfLgP zXO)u(+NI0Tcjm*$by1?Uqk%DitBcJbijxDHtOI5|b@#Qg?H_jFnQdbgP@~WvsW^bbC&dz=Fbh`ibKL2SI zT-|A9x%8!2QQou6xhFC&&-ym4$aD9pW82OKdqz6mnsRx4=J8U#egE%mowI%0@84xI zZ4W<8zrSnRI_rgRZWpP2x%=6e@AT!byU*{w{_FTmgQ=a_yU*CBT#j3w|M=bQ)LTYp z-zJx@O!B(5Z`GEZo10QkPt%RwHa}ta_dLm$f4^*>CH-=s6v(7v&e*fR{ ztx~zGZ*4yp{T!$et^>&Eoe;)fc50TK5C1au;(Jh&pbBm$WPVLpzUJk@F9}r!=o)#a zk*D#WWv<`r;O<;6&F5D_CzowJTRZ36gVgy2`}e(i{XD+qP1dt!Yu@B<2_N6LRd3?0 je}Av+{;~a+3#!$wOf&lxJI6os@crUlGxJ^MEBXTf`CjAm literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_39.png b/assets/tools/qrcode-url/lib/cache/frame_39.png new file mode 100755 index 0000000000000000000000000000000000000000..5a262c89da5d363872be7464e19d23b8331628a3 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^YeATi8A$#}%mtDRYymzYu0Z<#|Nl#G&c6#}t@Lzp z4DmSrcDf>$v!Q^C`YN;Ozsz4OchB@W@v^F+YuEeLT-i=ZhpyC}U|Dr~U1Wugl2Ni) z<7XKMu?h*Z#`wTT{zu&6JhY#G?KtsdZqCy^s}$dSj$!1QE$h7JEZ?e^5>mVWZq7~p zm+zgC>bG3=$|31U?(^B1`uDz--1)}0>#gh;IQ{R|J=41EKTFp jRV!a^T3>L@!s8EX$P&33N>LB@gZ$y?>gTe~DWM4fZ=P!) literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_4.dat b/assets/tools/qrcode-url/lib/cache/frame_4.dat new file mode 100755 index 0000000..67b30e8 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_4.dat @@ -0,0 +1 @@ +x E=u pجQCOM'ˏ$ @3eF\FNXRyؾC{a8R Ńa2@qkH1(`cj~0ܨعnXGĀ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_4.png b/assets/tools/qrcode-url/lib/cache/frame_4.png new file mode 100755 index 0000000000000000000000000000000000000000..b72f9e70d374741d1d4ec4537b7a379088325669 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^iXhC$3?y^40(5{BTYyi9E0F&G|NqjP^X~##UY;(F zAr*6y6aM`F&%o^b_W%Fyk`gih|L^bcaylaE>?|uG@sHV&`Ea~}XRw*|gxLT4_cSuT v*!F>Kf^<]߳bZn^AQ}[9^]ynajM܇K̘1cƌ3f̘1{W5}{7lMޚxI<Kαyl3f̘1cƌ3f̘1ۻٻ={αyl3f̘1cƌ3f̘1ۻٻ={αyl3f̘1cƌ3f̘1ۻٻ={αyl3f̘1cƌ3f̘1ۻٻ={αyl3f̘1cƌ3f̘SʑӒ7HK޼g\u_r'4[-]qL8ƝY1q!/(% \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/frame_40.png b/assets/tools/qrcode-url/lib/cache/frame_40.png new file mode 100755 index 0000000000000000000000000000000000000000..f3dd6bef083548a9624345614ebabbc5e9d614fe GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^8$p*?Yc z5^?zL^o_iS90XXtD_?goSJ7)=5Zu+%zh-~gizcxcPCp&@^OKS`iYp1eQC07ClfN-p zhHL+F`-aGmoD!n(CiSrm6Jw+;Wv(%ud2;W>ubsbGrmUV}?C@}MYzMeR~Iq_(@=tBBY+fA9PE`S)vYmCt{7dEf6X@9pj`{~P~%d5gVpUHT>e wOVJD81>b$VX5stqicj|XKdbSpxcG;+_57u(&B0QtK!-DUy85}Sb4q9e07u_%mH+?% literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_5.dat b/assets/tools/qrcode-url/lib/cache/frame_5.dat new file mode 100755 index 0000000..d5dafe1 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/frame_5.dat @@ -0,0 +1 @@ +x1 Eu7ЛZ|ND B0@R$l,->VKZ[Io+o1yT37=P9COrj~W-G?9JF6VLpcd literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_6.png b/assets/tools/qrcode-url/lib/cache/frame_6.png new file mode 100755 index 0000000000000000000000000000000000000000..05ca358b0ebc0c3a0b76df7bc0411af2d596f586 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^njp-`3?wJ5o3s^3u?6^qxB}__|Nk$&IsYz@<>Tq% z7*a7OIpGgbjFGJ^N}+Uq<3Ul6SeNAsih33jb6-tP*oFY|>b2SQ8z)uR?vtd#dj@Cr|apornv1)El=m yfE)D&wC=s-ob2oKGnB!6a?|8|>$jotR__k)Tfb?1CbP75iyKQ(;+|ur1|Lo4=9^M0XYLiuS90INiM|3P! zl1w_Dw_=lP*>oFG#pgDRUYDi$t)1S^DCLO~UG_j|*#gebx3BZ+nH+yL4#Xe`MZ5Oaleo}by@B3DZ#Iau!Ks7Twck}KFFz0sl!D6kkmQ`t zEwPxAt7e4vK(tICs>9R+3CvUzZbGE0t`1I&>PRt0PIx4!4(e4n`AHE@7YTQ-GD-FT zU5Un`f|ct4S(0g==b;u6VVT$-+hayNZ>kV6cem$hSdySrt`hAq)&LF)(-K_0ARP&tIq1zdFuig-v-KQf|`xVm{I3hDX Dr=(<@ literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_8.png b/assets/tools/qrcode-url/lib/cache/frame_8.png new file mode 100755 index 0000000000000000000000000000000000000000..74094535f3ad8af5dcd17cbbf88ccb40e60f8f4a GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^h9Jzy3?w~+F2@5Ywg8_HS0MfW|No^o=iddg8a!Pb zLnJP5?c2!9WGKLLT`*K(`=?HBg$*40d6Z7Sd+>T;&-w$p6BLBxogY*O9&}%Pah}O? zh7BI9604^)yg$3syHoJy(x%eaK_@JqyE47LkkZ59%Wzr!{HJi)iQbo&M?JszW!<)- z|GziRzgll){#^8ZrMig{@<|KY%Zzopr08LC$ ACIA2c literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_9.dat b/assets/tools/qrcode-url/lib/cache/frame_9.dat new file mode 100755 index 0000000000000000000000000000000000000000..d79295ee0f93bf3b101c220b436cc0d302b3dd72 GIT binary patch literal 206 zcmV;<05Sh~+U=G>4ul{KMO}02Nm#TyxdGe+ZZ;LFff1oFD-%8|o4)*%Sp6YHdA;?7 z06sMb75pI)g+!%pq7Eks1(Ax~0~7*wDR<~T*G1Lma@N`!#dGl;n!P;E()p>G>kd7u z??pPBm5wsHKNm@}RC?UEAu(m9sO7c1-s)A`rDjb%?QOHhl&f?!YX5jm&9&Z*<@HW4 z${vU~>O~9yjCv75*xjqWU*~WAGqlU$A+xo=8}e*Zc!_gVK9@YR<##wsNwa7{iF0qJ IFSFt|>Yb-#$p8QV literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/frame_9.png b/assets/tools/qrcode-url/lib/cache/frame_9.png new file mode 100755 index 0000000000000000000000000000000000000000..67e4f8096519c6b2014d37116259a86c6b2b77bd GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^rXbA73?y%B7#ag9wg8_HS0MfW|No^o=iddgsy$sC zLnJQm?c2!PVj#eBePZx-2g7#{biE8ap9ZaXarpc^p$T&oJT3_Q5Reto3na_1xv!Y+4r>OnPsj|`Q{m&no|Ae-u+jS uJ(~-U{)_Hk{9SaH`|ZVd@9Vf-uVmzH@aST&FIo(A27{-opUXO@geCwYr%aOo literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_101_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_101_0.dat new file mode 100755 index 0000000000000000000000000000000000000000..51deabaef6a1432e6dcbfd3852f259f984ebdb95 GIT binary patch literal 157 zcmb=p_4bw_-vI@V)`xR1ANZ?({iIv)ZIh|T6YB3ooDf$vcyUi@lE1i`w$Np*=;*M` z`ns!cu5^{~@(#J<9e#`@|8>=xt5c>OY+~gW)7igeMcUJuTaR$o&p-O;5+hmJG|D H^z#4!b%aZc literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_105_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_105_0.dat new file mode 100755 index 0000000000000000000000000000000000000000..97e9e5dfff667572d9451add45a3a5e05c157625 GIT binary patch literal 162 zcmb=p_4bw{SAzlr%YohNFaEDz7aTYx-~rdw7iUi!E!oMQ9qZ10=B~!Y1!Xh8FbC`Z zyZK8u`25eDzn4VhGJ|J-om&>Dy5;$~&1-gk)KCM0Wh*o*?Q>r*t&Z>8Q#|w7j5+Ec zQ8l$%fAdS<5uE#%zyDF50RnO9r|hm-%}`_g>f0!1_?Y+V!H}75vy!UUpR@9hH`4Vh H(~brJDN;^O literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_109_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_109_0.dat new file mode 100755 index 0000000..eadf83a --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_109_0.dat @@ -0,0 +1,2 @@ +x= +0 нi9'b$t^#ii?bK[AUF徝Ƶijx]m]2-ĖK~ Vw}X&Oɓ666666yR'%lllll/hlm dl3+mͫ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_113_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_113_0.dat new file mode 100755 index 0000000..5eb7f5d --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_113_0.dat @@ -0,0 +1,2 @@ +x; +0>I9+Es=ϤL1̄[FZU4?i<;7;P#W-[ݯ6ddddddc",;"sk摑Q&erw######L.摑Иy1^˲\3 v \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_117_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_117_0.dat new file mode 100755 index 0000000..781c7f8 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_117_0.dat @@ -0,0 +1,2 @@ +xA +0 }OrR,#3,o5Cq:;;wvNJZG=m} ѱ2iRkj_YYYYYYYYe_/WVVVVVVkd-Ϻ,#OZc]|{ž$ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_121_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_121_0.dat new file mode 100755 index 0000000..68810c3 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_121_0.dat @@ -0,0 +1 @@ +x1 О/w YMS8>2SFOEcW\ۼ{cpKGBКmxhfffffff/s22W|*d1*5̬RWas\xm~8߮r0wjsdm&y \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_125_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_125_0.dat new file mode 100755 index 0000000..2c73ef1 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_125_0.dat @@ -0,0 +1,2 @@ +xA + н_TH`3AOL4 k(ewGW. #2} \Ygggggggggg_d>j^s;;;;;;;;;;'q;;;;;;;;;'˰qu_PYw{e=dG/ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_129_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_129_0.dat new file mode 100755 index 0000000..812ee8a --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_129_0.dat @@ -0,0 +1,2 @@ +x1 + /*DE'hgt-}_pV \"b=s[J=8Dho۞' 0X ۴e0`  j" 0`Wf`^P0`2Ȁ  d07(Y/XLGby"pT \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_137_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_137_0.dat new file mode 100755 index 0000000..f6d993b --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_137_0.dat @@ -0,0 +1 @@ +x1 О/+FZ?J L7Ժ*Ba%L~˻ʓCJYIWJ .K]R0a„ $INTwlLaL0a„ &Ld@PO0a„ &L0e@P?a„ &L0aDe@ &L0aMIlL&)dlgacR<$v,ɺ?U2] \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_141_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_141_0.dat new file mode 100755 index 0000000..8c685c8 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_141_0.dat @@ -0,0 +1,2 @@ +x= +0 нi9'EDx͘%I9+E{$m^&uS"D6ڟ]98UMbҾY[2拉Ĉ#F1bĈ%iRN潝ѳ#;#F1bĈN1i#F1bĈ#FtZ}Nk1bĈ#F1bktZ;#F1bFV-u"IoD-*7uj>bMV+ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_149_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_149_0.dat new file mode 100755 index 0000000..d258350 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_149_0.dat @@ -0,0 +1,3 @@ +xA + н_MEQXP৞.|94e{JLv#^n[ ?; +ZIV-*w˒1*+VXbŊXgwqX}JRYbŊ+VXbeΠwfeΠ^bŊ+VXbʜAʜAbŊ+VXbŊ9ٜAbŊ+VXbŊl0*0Tj`?Ϊ;X=zZr* \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_153_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_153_0.dat new file mode 100755 index 0000000..fc79e9e --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_153_0.dat @@ -0,0 +1 @@ +x1 Н/礑h&F`Ҽ@I;PZ^X͌mf.=5 [if-R+!wr˜g\j̘1cƌ3f̘1cfo.2?1z `ƌ3f̘1cƌzƌ3f̘1cƌ3fztf3f̘1cƌ3f̘kk030cƌ3f̘1c9;Ď`vf͚̆ZϘW9 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_157_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_157_0.dat new file mode 100755 index 0000000..ad749f3 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_157_0.dat @@ -0,0 +1,2 @@ +xA + н_QRY k*q͵=j7~nN.p%ڵsi.رcǎ;vر{.-W2={mgy+رcǎ;vɳ2;yּcǎ;vرcNɳ;vرcǎ;v2xI3`FaC~S7rJnYfY8T-%e~DHFIIc5zv^p@ZbtcP7qJ_1+9^La zKHT%7-Y-t#T{NC)k=gd2o zjNY~Ld^ftnUmGj|mU3?60jkj`HqbYoV)>#S!~tpmi%zkeFHURTr~Ks{-QatqS5&9ib(yR@{gMnQ+Lcye6Ty_ Q@^8h%UuzjeUK>3D05K(RC;$Ke literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_165_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_165_0.dat new file mode 100755 index 0000000..3a17a05 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_165_0.dat @@ -0,0 +1,2 @@ +x; +0>I9+DyI4ˠ5:Wvdqߜܴ<d2x%[U%2]&K,Ydɒ%ˡ,S՗r2yd=,k_{Xdɒ%K,Yd)0m,Ydɒ%K,Yd)0m,Ydɒ%K,Yme,e%K,Ydɒ%K,eq Ò%K,Ydɒe:I9EQ=Ls I{ZtR}Sn:|R[?_*SL2eʔ)SL&ϦI O2O2eʔ)SL2e*C1PPSL2eʔ)SLP22)SL2eʔ)SLe(}2)SL2eʔ)SLe(}2)SL2eʔ)Sic7;"ޙFͦސٙvL ^2}oO'r \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_173_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_173_0.dat new file mode 100755 index 0000000..5ef85e7 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_173_0.dat @@ -0,0 +1 @@ +x10ޯT [4v2ƽok݇;Ӳ]f֞dljlG0n+߻mG˖-[lٲe"Y}oV[lٲe˖-[lٲeհՃ[2lٲe˖-[lٲeհՃ[2lٲe˖-[lٲeհՃ[lٲe˖-[lٲeValٲe˖-[lٲef[BmаE;N-ۜT/rl?* \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_177_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_177_0.dat new file mode 100755 index 0000000..78a26a7 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_177_0.dat @@ -0,0 +1,2 @@ +x1 +0>I9+?߁iև d̹xֈxN/է|{ظ8d0h=cFf̘1cƌ3f̘qq=w6;l4cƕ<nj3f̘1cƌ3fXһ1ֻcƌ3f̘1cƌ3fXbwnj3f̘1cƌ3f̘M'X&1cƌ3f̘1cƌ3ֻnn1cƌ3f̘1cƌÍ3U< \7+(<OƌΊnj4@ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_21_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_21_0.dat new file mode 100755 index 0000000000000000000000000000000000000000..368c9941fd09f695d58934eb0de062a54fd74c02 GIT binary patch literal 48 zcmb=pWo*#E=&aDfq?gm=vB)I2o5jQUx&ZeRqn1^Uf@;3Hn^Ft5vfXH5Z;oPEP!;?T E0GJaIuK)l5 literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_25_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_25_0.dat new file mode 100755 index 0000000000000000000000000000000000000000..e4a5b6d8afc4516779d7d246ebfcf7ced36029d4 GIT binary patch literal 57 zcmV-90LK4#+A}bK0YfN+0xnzV>=60G~7^dI6e8pX8D%7wG^1 literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_33_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_33_0.dat new file mode 100755 index 0000000000000000000000000000000000000000..2ec712a7adcd6edf1ce2c785adf00e3ca7c5b729 GIT binary patch literal 62 zcmV-E0Kxxw+A}bK0Yfwh1zdy_AgLHMX5awSafcxR$OTi6Q^}|q!_EwNn!%sOz-Hh| UV{|eD?iT|>N~mE50E^|%1m89on*aa+ literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_37_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_37_0.dat new file mode 100755 index 0000000000000000000000000000000000000000..1588cfce1318608538dbde89fa7f04d05ff574e4 GIT binary patch literal 65 zcmV-H0KWft+A}bK0YfYh3b=?-grsWFnuP~Y*IkB0KrWabyvjz+8Z~Q>n+4Agg!2&C XEPQ!r0L+5>(SR6b)HDkKY5W93c-0$f literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_41_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_41_0.dat new file mode 100755 index 0000000000000000000000000000000000000000..e369027e3831ce2d9ac858eaa2cdfa5e5498df07 GIT binary patch literal 68 zcmV-K0K5Nq+A}bK0Ye-R3b=?>h@^7Jm`MQ8#+`;lLN1s-f=Wlt95r*)%t2))yeuHD a3;~--s0 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_53_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_53_0.dat new file mode 100755 index 0000000..572d279 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_53_0.dat @@ -0,0 +1,2 @@ +xK +@!йoQϺ:(m&s-6Z{m4YX.F٭XZij=:έ֋b忑VH 8 #[Y^Xe \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_57_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_57_0.dat new file mode 100755 index 0000000..ea81e6d --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_57_0.dat @@ -0,0 +1,4 @@ +xA + {^s=YL՚ ( +ouj)  +Z7yv,ԴwVQ iGiҤDfەwo4ѤoLLȼ}4 h \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_61_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_61_0.dat new file mode 100755 index 0000000000000000000000000000000000000000..93d2444d8249bf3c534223bc1bb339d54f7af957 GIT binary patch literal 119 zcmV--0Eqv1+U?dk3IHJt1<*dHN$!6+E5(hNrI=BE>;m7%=n!PCCC1eixx=ze|IFU^ z&9=7bWCto@OXj<~I62OGT~zl9#bLvS4O_9jbFKC1I6Jle?Kb{3*sx(Qw*P@W*om-i Z8|GT{jXc==mTf+B&fNDGb^()u!gb2GK0EGW|+U?gt4!|G?1i(A5f&YK5CmXS?mE~YV7mp;Hi4u*ftt_y*5-7lK6FzHr z>I4k)=)nLMYOw4+bP*CfgX@x(2S?CA0}V9%z<}J֞!Ŋ+V嬪.2XbŊ+VX.kBzwձ̀gkYZ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_89_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_89_0.dat new file mode 100755 index 0000000..aaa4c52 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_89_0.dat @@ -0,0 +1 @@ +x1 ὧi9'Hl?L^"&M?bq?˸,9!z]VScƌ3_c!`n3f̘1č 3f̘1/f>.Uc˻; 2;Y+7 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_93_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_93_0.dat new file mode 100755 index 0000000..e218fa0 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_0/mask_93_0.dat @@ -0,0 +1,3 @@ +xK + EyV,OmޠrPH0{2bc{tQ] +{Q{{弬֒ǎ;v_ڳ}L}l߱cǎ;v̑̑̑رcǎ.Legw3qeѾ@i \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_0/mask_97_0.dat b/assets/tools/qrcode-url/lib/cache/mask_0/mask_97_0.dat new file mode 100755 index 0000000000000000000000000000000000000000..74ac719d06e7ba35f7b749e668c884f291daefb7 GIT binary patch literal 150 zcmb=p_4cMC*8v3{my5N2lkfa5ijADYwQUyT?SDJYDA|}8ET~@TVG}wt#i2yK=7z!b z>XaF;OL-RsNjlZ?U*+(wbH1LOIxmNXjYq;D;XuQ~?`*DdR@K|)ymqtY`Of=>87kg* z$16{D`=-laMU02Hv7J?~OBUdlkQVwh=~Mq+LyI<1=UdT5U+wnXEMO=-^wS0a*1ӘK}:!iY'*3]fsmb[JƶŖK9}cccccc'u.6Ʀs6666R[^g{/lٷ 7͂ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_113_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_113_1.dat new file mode 100755 index 0000000..1dd666d --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_113_1.dat @@ -0,0 +1 @@ +x1  -8fL(pBlDM9";-;?1p{\%-3:@ad4*Nadddddd########c]751xYu \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_117_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_117_1.dat new file mode 100755 index 0000000..8921f64 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_117_1.dat @@ -0,0 +1,2 @@ +xֻ >ӘK$^ 8YQSV'z8jzʇ^]סekXYYYYYYYjݵ# ++yeeeeeeee#WVVVVVVVV;"+yeeeeeeel'e;b&^9{/J$p \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_121_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_121_1.dat new file mode 100755 index 0000000..64bd8ba --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_121_1.dat @@ -0,0 +1,2 @@ +x1 + н\CPbїE$DdƩYtڅλ0$ήꝝga7yٯ痽Y??{{D \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_129_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_129_1.dat new file mode 100755 index 0000000000000000000000000000000000000000..62cd1c9a18c2367d1c2c4a125b0c7bfb7647cd07 GIT binary patch literal 164 zcmb=p_4c+Q*8v3{)(d-=d%mmRskg|fP}}X+^rc5NZJtc#aociguIS=*E7o0PY;Hez z>gn9i&b%cXe#-fTKV)dW7BEeenT946)3$`s uʮ>Wd )g'M{3\d6ubذaÆ 6lؼn]Nذ9FްaÆ 6lذa3a#oذaÆ 6lذذ5e16lذaÆ ]Sbk6lذaÆ mͤ;CcfIdsG \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_145_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_145_1.dat new file mode 100755 index 0000000..6a9950f --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_145_1.dat @@ -0,0 +1 @@ +x!0@k 4a)q2i.YCUO{35UZFn]fN>bdwtzJF}F1bĈ#F(F6r1bĈ#F1E1ilF1bĈ#FtF#F1bĈ#FtZ}##F1bĈleHGܣ@ٝ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_149_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_149_1.dat new file mode 100755 index 0000000..02a3cdc --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_149_1.dat @@ -0,0 +1 @@ +x1 Ӕ_΅qH_Xci#Gd̘Ք՛gLU^ݮVR>dKVXbŊ+VXeoXJ_bŊ+VXb;ݙ+}Ŋ+VXbŊ+VAVngŊ+VXbŊ}+ +VXbŊVj>hewf*`uTq \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_153_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_153_1.dat new file mode 100755 index 0000000..2abfca2 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_153_1.dat @@ -0,0 +1,2 @@ +x1 +0\9btEc'HH9efߞmffM#.̘1cƌ3f̘1cf73f̘g̘1cƌ3f̘1co2c]?3f̘1cƌ3f5Mf3f̘1cƌ3f̘17utf3f̘1cƌ3f̘=lj3>V \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_157_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_157_1.dat new file mode 100755 index 0000000..17344b8 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_157_1.dat @@ -0,0 +1,2 @@ +x1 + >94Sd/51V)SkJv7eGcǎ;vرc]Zٱc'رcǎ;vر+رg;vرcǎ;}V`N+رcǎ;v:;v;vرcǎ;;}Vޱcǎ;vص'vz#;]klwoA` \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_161_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_161_1.dat new file mode 100755 index 0000000..669ade1 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_161_1.dat @@ -0,0 +1 @@ +x10_΅Xš yi~Qbkvp7'M u=]([ 2dȐ +\' 2 2dȐ!C 2s0/3d() 2dȐ!C 241dh 2dȐ!C 2dhcȐSL2eʔ)SL2M SLSL2eʔ)SL2M}LSSL2eʔ)SLeSy)SŔ)SL2eʔ)S;ٔ)S;)SL2eʔ)Sv()Sv()SL2eʔ)SLdT6}a*3mljmzC' \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_173_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_173_1.dat new file mode 100755 index 0000000..436918c --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_173_1.dat @@ -0,0 +1 @@ +x1 Ӕ_Υ''@y]X1?"g:1犝fn˶˻mm.?lٲe˖-F>glٲ2lٲe˖-[lٲeO`˖e˖-[lٲe˖-[l lٲlٲe˖-[lٲeVO`˖e˖-[lٲe˖-[z0}[z0y˖-[lٲe˖-[Ee[hOVWö=t*| \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_177_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_177_1.dat new file mode 100755 index 0000000..12e2e52 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_177_1.dat @@ -0,0 +1 @@ +x1 Ep0X,a#r}6}nj~\8ƌ3f̘1cƌ7{3f,y3f̘1cƌ3fX_`X&3f̘1cƌ3f̘M_1cy̘1cƌ3f̘1cƌ+3f,y3f̘1cƌ3fX_bX&3f̘1cƌ3fx2dX'x[cy| 3 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_21_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_21_1.dat new file mode 100755 index 0000000000000000000000000000000000000000..f87e0a11227bb4e1e6f46a1dbb133ca9b1cc8109 GIT binary patch literal 42 ycmb=pWo*#E^%B$z4|g)+XrS~G>tDQj I0gJJp;@7?u-2eap literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_33_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_33_1.dat new file mode 100755 index 0000000000000000000000000000000000000000..318949df07745528a680a428ac74ea85f016c2aa GIT binary patch literal 53 zcmb=pWo*#E(KTk=YPW25x~DW1ZnK;yQ#k{?W*9i^mo(k2MWv7BXK JDEWV$2>`Yr5WxTd literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_37_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_37_1.dat new file mode 100755 index 0000000000000000000000000000000000000000..5bd9e3aa0d08230508938e61404749c9ae72e32d GIT binary patch literal 56 zcmb=pWo*#Ec0ARA$6JzFue`IJvZq{C68loc~P O{VIfV)fhyX>>B}kGZlIO literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_45_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_45_1.dat new file mode 100755 index 0000000000000000000000000000000000000000..b35c567dca6aa84fbd8758e1fba4ba2feb397de2 GIT binary patch literal 82 zcmV-Y0ImOc+A}bK0z+KD00FoRNC61dbTS*2PX)7SsT!xdk(^GV*-*`fM1fJW2ff*Z o(g~bDg3KOGC-gI$Q0Yx=v#FI%h$&--irG{SZ{o}b0N2uhd5F*?p8x;= literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_49_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_49_1.dat new file mode 100755 index 0000000000000000000000000000000000000000..d20d71710eecee1842e3fc1535a09df5a9bc8761 GIT binary patch literal 84 zcmV-a0IUCa+A}bK0z-Vj00FoRNCgNTbhiUtgi3bMLkC`eAbEuhJD>&_5)DS}7`1~) qJBUfUaFG#i$7s45S#}Up3)038>ZV;{>!_h=2TkIGcsl^2!^he0dm&5! literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_53_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_53_1.dat new file mode 100755 index 0000000000000000000000000000000000000000..a676d7dfa2092a94b7a81322980eb4def98fba74 GIT binary patch literal 87 zcmV-d0I2_X+A}bK0z*Q;00FoR$N>ml185hf7!~cJr!Ip2Lh>4!c0mm>Bngb#HEP!o tw~N^P1s5B&Ycw5>+BN9xBDS?bOS@>1zes5V31pqmJ6B4Gdk literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_57_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_57_1.dat new file mode 100755 index 0000000000000000000000000000000000000000..896ed43575bbcdf0ad49fbfabe490f0645a69df4 GIT binary patch literal 92 zcmV-i0HgnS+A}bK0z+be0RnItkP8qx2Zf#3M5%1&K=cx?F0b9ifGvGnJH}m literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_61_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_61_1.dat new file mode 100755 index 0000000..4165a4b --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_61_1.dat @@ -0,0 +1 @@ +x30CbpPi`@&H^nadQG{nF3s~{gDf@VF{6Pqb^n%N<(VOM!% z$k4$xhh-EO4838Mg8>5u3?CSjTRkcmt{T`$3>YwEH7H+JtRd!Bt3S?PhR}V`4GpQu FA{XR~DnI}L literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_69_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_69_1.dat new file mode 100755 index 0000000000000000000000000000000000000000..03bba657f6d0df2a65ab63bc13715660ffc4ba1b GIT binary patch literal 102 zcmV-s0Ga=I+U?gd3IHGoh2g!^*!?fpBGuB6Ru=tl734z%QACqxBP~f*q;+|~GOlg3 z+|*@yF5PGrS+r?(1q&7|Sg<^6vEHLv!?NAN?qb1$1ZaPm@r{VZ}QxyUc>an#ExUago&HU9mj+T)Arjuh3Vye^8R7`ZVIqZ Kep3TS=JO^`WH?p; literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_77_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_77_1.dat new file mode 100755 index 0000000000000000000000000000000000000000..0fe0b03e868a00c5cc8f97a40528a7873b189a78 GIT binary patch literal 110 zcmV-!0FnQA+U?je4ge4gh2h<4>i(Cr2nH6ODE>E!G+%@^VU`nTV>Q8)snssB^}WNL zdu^VpO`ltHbYfdB9wots4cnKt)&5pivAMDF7O-K%#>`?aFte~>!}hvu_4ni(Cr2nG^~hc@}&Xs9m@nlP)$C$XMn>hy{MjVt$j z{gE+3#iKqBt-N5Y8)R89V#J7X)2MhK+d4+qM(zwoj2JO8ubJ1(Ym68%VvJ~1{NnyH UdYUt;KT?e16B)r+06TKr<%ttFF8}}l literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_85_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_85_1.dat new file mode 100755 index 0000000..b8a20c7 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_85_1.dat @@ -0,0 +1,2 @@ +x1 + н\]4AA hM\QjsAkUjmun2RΚ5:k;jƲ[eo[o[kZ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_89_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_89_1.dat new file mode 100755 index 0000000..e9d226f --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_89_1.dat @@ -0,0 +1 @@ +x1 Ӕ_΅Nh}%@ iDOH*c"_.4Iy킎`)-5*(of[sm}6YM ;;;;;G{zطz1vw}=wuL%?"=~ei \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_1/mask_97_1.dat b/assets/tools/qrcode-url/lib/cache/mask_1/mask_97_1.dat new file mode 100755 index 0000000..24fa60f --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_1/mask_97_1.dat @@ -0,0 +1,2 @@ +x1 +0н1\tncKD"H$DH$D"Q&WerH$D"*x[(?/'nd \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_117_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_117_2.dat new file mode 100755 index 0000000..b4dcce4 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_117_2.dat @@ -0,0 +1,2 @@ +x1 + >94!m dOs\0X,la5#E>Z[ַRT*JR?Q-*T*JR?UW*JRTݟ+JRԤ~m5;S&+ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_121_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_121_2.dat new file mode 100755 index 0000000000000000000000000000000000000000..a2a0097b1fd803424ccf0a741277066f44b04dae GIT binary patch literal 127 zcmb=p_4c+Q7lR@X%YlD!!vFtUN&Z3X+ Wr*l6!Q#;$o?ELu?!b)#0qyqpqZ94e? literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_125_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_125_2.dat new file mode 100755 index 0000000..0ea40fd --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_125_2.dat @@ -0,0 +1 @@ +x! PӔ_@ U(kp@^Mڮ5-:VF_\t:NtyNqt:NtG;Nt:.8:NtzA}yNq;+n& \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_129_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_129_2.dat new file mode 100755 index 0000000..bf04839 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_129_2.dat @@ -0,0 +1,2 @@ +x1 +0н_KVڡ'.!w]A0X~  !࣠fK# xFy4 vey@^+  ~  L#veI \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_133_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_133_2.dat new file mode 100755 index 0000000..9e78b6d --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_133_2.dat @@ -0,0 +1,10 @@ +x1 + н&`LQ-g=Aqbʪl fƄȚ44& )OȚYF4444444444c4~9S:3ЌטpǮ> \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_145_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_145_2.dat new file mode 100755 index 0000000..9ff2bbf --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_145_2.dat @@ -0,0 +1,4 @@ +x1 + нr] +,tQ^&C~ +щj~mɾ.FgMDDDDDDDDDDDST׈DHdZL+ɴDDDDDDDDDDD2-'"""""""":BתEYDd \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_149_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_149_2.dat new file mode 100755 index 0000000..d52e048 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_149_2.dat @@ -0,0 +1 @@ +x;@/gcaGBXB'-ˆouէUQdRVOmT*ǫ;;j廝Ee2PQQQQQQQQQQQ TTTTTTTTTTTTr33R &Tskz_e2P=d \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_153_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_153_2.dat new file mode 100755 index 0000000..3b06041 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_153_2.dat @@ -0,0 +1,2 @@ +x1 +0 Ӥ8ZP!BZu賶"bu*)]MFFFFFFFFFFFF%= #ddddddddddddr ot2yFFFFFFFFFFFF& #k5L 2222222222(Y7"d@H \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_157_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_157_2.dat new file mode 100755 index 0000000..2baf535 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_157_2.dat @@ -0,0 +1,3 @@ +x1 +0>s6MqUH1X&U̘f/u-'.[KGGGGGGGGGGH|NG(ttttttttttNF;::::::::::}Nz$ +>n A#^AG(t =3{ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_161_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_161_2.dat new file mode 100755 index 0000000000000000000000000000000000000000..d2df7594eafccef2dacee35dfd7b2fa20d22e1dc GIT binary patch literal 190 zcmb=p_4bY;UxNV;Yry%;UBBb`j2ojEHvT!3{p!RC?nRON7i3-Yc;zkY`Xf0}_x!$! zFE2cT6SG?D4qx=zQRnO+ECdE-0&RD4IXDluF5^{1fQ4roCj>lm@IU~K;tl%3r)17J zJ0ZZ#=G-X(&k}A4K#T&Dr(`%dQ~6pDpuA;fz2pBjgY@glDn4Sf%vz*>v-~PkmIDA9 Cq)A-> literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_165_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_165_2.dat new file mode 100755 index 0000000..2e6cd7c --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_165_2.dat @@ -0,0 +1,2 @@ +x1 +0 Ӥ?BVUG%*+_fs MIIIIIIIII2d;l4()))))))))))eqJنIDIIIIIIIIIII)۠mPRRRRRRRRRRR6l JJJJJJJJJJJJن}RaQRRRRRRRRRRNeK?R퐔͔&W3U \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_169_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_169_2.dat new file mode 100755 index 0000000000000000000000000000000000000000..4052062b8db42699eecf910b9792afd64d0db84b GIT binary patch literal 196 zcmb=p_4ckI*8v3{)(d-=cYfa=BffC9bK#GR;+rC$JQO$)A7z^D@-5td;v_x$KZRRf zZ@YKti&y>Si-EiLS+DR!2HU-y%YuV0IWJizqKN=2d5((tdS!V{oP+?U0&*@cSz;s- xgbbohG*|MpPC)`8ZBAZV&W8R7OY$eT{eSz+A@fq6m)EU$prLMGxEX}SGyvz^RrCM= literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_173_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_173_2.dat new file mode 100755 index 0000000..0a30ba5 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_173_2.dat @@ -0,0 +1 @@ +x+@ Pift:>y &d U߬S[]5Z;a5V۞A[Z˴VՃI0ZZZZZZZZZZZZZZ=-Lhi`VFK?ݧhioJ0}o \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_177_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_177_2.dat new file mode 100755 index 0000000..d2c52f9 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_177_2.dat @@ -0,0 +1,2 @@ +x1 + E>Y4V$~ ,C&U;Ook5bϙGx9%&&&&&&&&&&&n$OL|v#&&&&&&&&&&&&&bbݍXw#&l7bbbbbbbbbbbbbbM"l7bbbbbbbbbbbbbbMa!&݈3)U0}qMK$nTp4?}1s?+4l5MclS literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_29_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_29_2.dat new file mode 100755 index 0000000000000000000000000000000000000000..5112d11eff0ce0631ba1000e8823e0592ee3230e GIT binary patch literal 45 zcmb=pWo*#EnW&mR* B5Pkpv literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_33_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_33_2.dat new file mode 100755 index 0000000000000000000000000000000000000000..5bac0c80d2fd997d753427178c6294dd3dd9184a GIT binary patch literal 47 zcmb=pWo*#E*F> \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_45_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_45_2.dat new file mode 100755 index 0000000000000000000000000000000000000000..ad44ff1885f2c4e0d2158824e4d2b5537e0e8eb5 GIT binary patch literal 68 zcmV-K0K5Nq+A}bK0z=#g4!8^kw`w#Iid7Q>h%(!dOx19XArWX)^>9~>HN_4))uS;# aNK_M3B2!g0&U7-YR1co;#)SYYI)8L$SQ+gA literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_49_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_49_2.dat new file mode 100755 index 0000000000000000000000000000000000000000..6e8edff24b9344b19623318f9e10802439cf2b40 GIT binary patch literal 70 zcmV-M0J;Bo+A}bK0zFeF c>OklqvR0#s4%}&Xxa%04@qrTo0MEO|#KK}86#xJL literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_53_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_53_2.dat new file mode 100755 index 0000000000000000000000000000000000000000..682cae2aa6532baf02d2aa3e0c1dd2ab5227a34e GIT binary patch literal 73 zcmV-P0Ji^l+A}bK0z*Ow32+$&77oAwesj8DyK(d{NRL}|M7?Oxab&l#B)j2eE;wiyK ib&jT?QJteYsi%|F)*Fp=5-1Z!bq=xk#E$^gB4-2t4I$0| literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_61_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_61_2.dat new file mode 100755 index 0000000000000000000000000000000000000000..77d3815eb51a7feb77ebf8fa7001e8428c252db7 GIT binary patch literal 78 zcmb=pWo*#E&42|mGA0{eU)ahq{&Zsci5AoT|sbCRL;^iky?c_QPW#8n#wmU scCwG!AOHf}SdL4%7jXKBFflomDSq>=(yS;mZJM;_nealU{J-+60Ag+8uB49o zCeM)i$;BWcAt6nrP(L9Zkl0KlBqVyA9!Ek#%9h06kgHO>pO7@^?R^TT0-T8OPY@d{ Aga7~l literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_77_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_77_2.dat new file mode 100755 index 0000000..903cba4 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_77_2.dat @@ -0,0 +1 @@ +x1 н_CM>Gt ѫe+FWZEm&gއFѶhF+t/FYvFj[*7a \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_81_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_81_2.dat new file mode 100755 index 0000000..17a9ac2 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_81_2.dat @@ -0,0 +1,2 @@ +x1 +0н_KҩVi!O\"A]:xbW1uȦ&_T ΋6H$U^D~bׯb=gX \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_85_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_85_2.dat new file mode 100755 index 0000000..72c74ff --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_85_2.dat @@ -0,0 +1,2 @@ +x1 +0=1\B7O$A0$8Wwjguu槊RT*uS֧JRTJRRޢN浘V \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_89_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_89_2.dat new file mode 100755 index 0000000..06c9a4f --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_89_2.dat @@ -0,0 +1 @@ +xٱ 0 >/&E*cQqŃ zf$rM6hu5#zF6@yLURBPN&o9dL&(sq|@niI{j|F;se@4&-NL5N8P;_ J=`Rs#W7tsZG`0W$ literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_2/mask_97_2.dat b/assets/tools/qrcode-url/lib/cache/mask_2/mask_97_2.dat new file mode 100755 index 0000000..38842b9 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_2/mask_97_2.dat @@ -0,0 +1,2 @@ +x1 +0н_KivH4 )_%s_d3KO1^aL,$H"$KzRPt[I&X9$H"$I$ysI$DI$ɓI$I$Dɍ%es!=LAZ5'̓IVrn/2oƅ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_113_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_113_3.dat new file mode 100755 index 0000000..023b273 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_113_3.dat @@ -0,0 +1,2 @@ +xA +0 D}NrnDFj2KCt?WݲZi.qoP %Smj7ަ:*N:@:***fW9d2*j*}S@`*j৪6Jlѿ}}էTUa24hnt \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_117_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_117_3.dat new file mode 100755 index 0000000..79cc04d --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_117_3.dat @@ -0,0 +1,4 @@ +x1 +0 ]Q.xIB$?~!-~Ih^HVEgKLuZlO;cUwJKHSx)|O2B zFzfxyYi|AgTNeL2=}VZ;Ev?R7P^rty{%*guOnUQ^gxskvcVQYX$3@&ONuIXHIa)Pv zd*)?`uy^M1DbmmD%Zo4AT@Sf`A^-TAmugk}r7i9rS@ZJQ!dsI6-_8j2Oj_vmiRt9J G3$_65-fl?% literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_125_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_125_3.dat new file mode 100755 index 0000000..e2febdb --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_125_3.dat @@ -0,0 +1,2 @@ +x1 + ~N3rۄ]BБ'?xFrjdA{$T!&?~Jee~GOn@z#E)RHZ@bl-)ݿ<ߧ*OUR"5&5*ie J]+ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_145_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_145_3.dat new file mode 100755 index 0000000..338b7e7 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_145_3.dat @@ -0,0 +1,3 @@ +x +@|:^ Jy̡yMj-' +9VS֦K9e)PyUwe-m jԨQF5jԨRi٫F4_wk}0+jRBRF5jԨQeOMBJHjԨQF5jwP״˪IH I5jԨQFͳc w5jԨQF:zS*2UZ_C*e_OZ%dIȯb \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_149_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_149_3.dat new file mode 100755 index 0000000..30bc5fa --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_149_3.dat @@ -0,0 +1 @@ +xA0}Oܠ⦐H頯'Z2{oV|Ι%>yR{!8ÂI+JpI|#f5κ[P A $H Q})&X{ט+Wb`I)5%d \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_153_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_153_3.dat new file mode 100755 index 0000000..89cdec0 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_153_3.dat @@ -0,0 +1,2 @@ +xA +0}Ns˹)7mJ,}8X=cW^GeNE;R(13DFEx15%o)(+gL2|3uiEv#I;;|4`apdpkS*^~xvLf_IwePW`Q`R8jLgJQhVasX}og%bb( literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_161_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_161_3.dat new file mode 100755 index 0000000..72a26a4 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_161_3.dat @@ -0,0 +1,3 @@ +xA +0}NrnFTk,N Zђf7J:ƒ^`WٔUnXڤǧM-#V+ߡ+9zҖY l)SLocʱO_C?ߩ%;*KlM2eʔ)SL2Ye][bSL2eʔ)SLyVYlWG[bSL2eʔ)SL +]g+$eʔ)SL2eʔ/qBbKlʔ)SL2eqʙ]£{A/~V9\%[P#' \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_165_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_165_3.dat new file mode 100755 index 0000000..870af8f --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_165_3.dat @@ -0,0 +1,2 @@ +xA +0}N3T #Z YuÏ:̛1ϱEUTT|S q)m-sG B.Cĉ'N8qğwv7['tg!.ե:qĉ'N8qv`_+.ե:qĉ'N8qv`R8qĉ'N8qΤ8"ե:qĉ'N8qĝIяہq&EKuĉ'N8q+9:}kFT?^ЏGo<0իCg/_ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_169_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_169_3.dat new file mode 100755 index 0000000..9431095 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_169_3.dat @@ -0,0 +1 @@ +xA0}O3rn񷾦 )}'31Eh]4P[ _]Kv<˙fp#y_l[geӧO>}o%uJV/{%O>}ӧO}K~O>}ӧO>Q=/ї>}ӧO>}u{ח>}ӧO>}u{蟪/%?}ӧO>}ׯ.N4჏VMmRt(1| \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_177_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_177_3.dat new file mode 100755 index 0000000000000000000000000000000000000000..9586979a1f9d74c4e115757feeeabb74819df45b GIT binary patch literal 312 zcmb=p_4ckK*C7KDmJ79hlkfa5%Jb^v=;WB?Q=`hguxbC(hf6kRuDyQoTio}+UFQXv zzYC}H-0`hx>pHl#M}PCVx?h`vgGKGt$xx|wRV!3 zfoMp8BP)#fxJc>g$uD7oUs9|>H)gE5sHrt=^#lc>7A~z73z`r_mvKnO#w`)M&Z=su zbg*n(k1PjN^&?s|N=H{r^nS3Sqe@3D+;oUNM?Y$9iHOp<`z#Ekc_EUqAPXMxfb>qw zEAHgtRC0WyjcRYJR@RjRYnSlaR2M&;SL^DVy)i4Q+x2LaXy<=XYjqD_?+J5e|6#~G HtjGiaa;}E0 literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_21_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_21_3.dat new file mode 100755 index 0000000000000000000000000000000000000000..bcb4eec4919b60e2c25c4e18ebb9c34423536b63 GIT binary patch literal 60 zcmb=pWo*#EQOIfiJ63sVS+xNu1fplLAA habXVvLtL={H4TR*l1wwiWg5b#xHRE54FHDyc9;xW9FqV5 literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_29_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_29_3.dat new file mode 100755 index 0000000000000000000000000000000000000000..6150ac1289809bad7646c662dd9cf836311f47f8 GIT binary patch literal 75 zcmV-R0JQ&j+A}bK0z)JO16&9u7I`jwl1Q?&GZ`D8$YeOr5DVhME(}Fn_#_QSO-42g hU)nIl9)oZ$?ieJ~WF$A^k;Gv#QfT0j2LK0SpN7|C8+8Bx literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_33_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_33_3.dat new file mode 100755 index 0000000000000000000000000000000000000000..6053b5e396ca957ae26193aceb85d08a43dacd9c GIT binary patch literal 79 zcmV-V0I>gf+A}bK0z(W00bB+MfK>sq3hWAyRM5v3T!1RJz`2Gv5EpJKDB>cdVAPhO lW(z#c;7?-^TkxkbL)`g=Dz?D=LP!BVTMUV{1pswi&V8ytAOipZ literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_37_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_37_3.dat new file mode 100755 index 0000000000000000000000000000000000000000..5dea5b9cbe14fcff482e0fe9a647359aca07547b GIT binary patch literal 83 zcmV-Z0IdIb+A}bK0z+&F3b+gq0H-2kRd@{JG8i};@d2vZ2XK(!(BO=uY7eM-(E6p3Zv0bsQxl5nw^V$$JC%}Bqlsj9DvDo{aE;P>E# hYO*WtyB%t`BNs_$5b6wWqgwwJ)C%Io3LZM{#-RD-KY#!L literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_53_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_53_3.dat new file mode 100755 index 0000000..8800bea --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_53_3.dat @@ -0,0 +1,2 @@ +xK +0Ds ! -(.Bp&|"-t&`qQ-"9_+)Be/H8D%a~}spKFN=,;;a^t4\FSN \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_57_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_57_3.dat new file mode 100755 index 0000000000000000000000000000000000000000..4e1e5da386a57dacaf76f93d05473ff922574488 GIT binary patch literal 126 zcmV-^0D=E_+U=Gx3cxT719!hh{{QE?gyNwnmS{-_8xJAm$PtVPuqu0fSCq8`R#F2C z`Jye^+}fgNtCnh;u5A$xa)x*4$m(#xu^rp7Rcwt+;I=%SqH*TgTz7#%(6RO)$6#_BUJmZJUz-cM|kVFF3Ae8Lopr+yDRo literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_61_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_61_3.dat new file mode 100755 index 0000000..bf1a3cc --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_61_3.dat @@ -0,0 +1,2 @@ +xA +0fz4-%*dp!yZܫu(~=&ۓ)R2"/"<9FΊ=rb"/rw"2B#3-0-KW \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_65_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_65_3.dat new file mode 100755 index 0000000..8589208 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_65_3.dat @@ -0,0 +1,2 @@ +xQ + D4\?R ,!O-Nv1:cZu "UMÕF ~jK-la[^q^Q\=o-laZpUB @IKJzɢ|1Í  \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_69_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_69_3.dat new file mode 100755 index 0000000..55318a8 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_69_3.dat @@ -0,0 +1,2 @@ +x +0 {&2'd l=,Fy;$쇤WE-R:%T,O2g"",Ȣ/DyĈɧ{O䮳",:NvEWN#(&,,]x؅ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_73_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_73_3.dat new file mode 100755 index 0000000..15be77f --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_73_3.dat @@ -0,0 +1,2 @@ +xQ +0 C{g;JJ?dԬK=RasJhTJ6exka\$nIE,-/XB*х=wee4t̒tLщtt߫b gFf qoddn-? \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_77_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_77_3.dat new file mode 100755 index 0000000..ec78280 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_77_3.dat @@ -0,0 +1,2 @@ +xA +0 &BiRaK"t`I@|fXyilE:Sza18GifK*?:YC1쌞졘(ቷJ*jl*TRIKR^ؙks)c)c)JZa \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_81_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_81_3.dat new file mode 100755 index 0000000..47bc0f7 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_81_3.dat @@ -0,0 +1,2 @@ +x1 + F=\,JGAġhj>#3X:kԹ\FM Jhu3>TZ{PSgP'kVjժU_ۯUV=P oO:Wҝj[Wxm 5 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_85_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_85_3.dat new file mode 100755 index 0000000000000000000000000000000000000000..02c4f8cdbbe43a99de71a77162d811d36ad4f51b GIT binary patch literal 160 zcmV;R0AK%j+U?m(3V<*SMbUXy^Sb}dIVrU|sn!>N+|q$Y2;pF8P^qqRd9N$FYg^Jj ztFhS7{Q{@rM+N5MyIOtAC{U6F+M{SU#kj+puI|W4iU0x#Ab>!sfcG@40`85I_KdmkG#TsrP@uMqv1rdge4##%ZWgv6J(FGUkB?1g^dV O%IE@ppbHjj!&bK*zf9i% literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_89_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_89_3.dat new file mode 100755 index 0000000..2b4cb59 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_89_3.dat @@ -0,0 +1,2 @@ +x1 ὧ) *.@U |eŵ6ۢw5*) oiK4nk>1}d>@ 4XYCo ۡ1<AhFt + 4@51Wr>7G}}x7|NgN \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_93_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_93_3.dat new file mode 100755 index 0000000..b4cc8a9 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_3/mask_93_3.dat @@ -0,0 +1,2 @@ +xA +0 D}NrnJɪQ~B06na<<ׇe6MRCP L̓i9M 2 LkŮdDv*"aXjBdAddZTdAdqY0exqeN&WVQvc \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_3/mask_97_3.dat b/assets/tools/qrcode-url/lib/cache/mask_3/mask_97_3.dat new file mode 100755 index 0000000000000000000000000000000000000000..7adc9ebaa77cfc3c6f7a54307a831fbeee0c87db GIT binary patch literal 175 zcmV;g08syU+U?rG3V&G`N=*G0-MD(Ga{FCK!(&5t$)O3EWmo!5xs*ixXZ zVA@1zxl+BnrYNa(r@cz9VNyyDD4l1cxytAa-_m)8y8uckp@b4jD53OrC10xSQX0*J zF=dt7h5IPcalDsMLJ1|5P(o>6B~s-^N^~6WC6rJ?2_=+%t0e0VeE$jDlr;7Ux}BHg dPL&$iL~p8;J5{b%n)WQo-EsPG#~oB@^PHSYS7`tM literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_101_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_101_4.dat new file mode 100755 index 0000000..1c97dc0 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_4/mask_101_4.dat @@ -0,0 +1,2 @@ +xA Fs^1bИ]4m+8+Ve^HR]\c +oWN#X+l HEcp \^.9qW9":.BB \0aPǨcp \ONqjpG}}$.˅ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_105_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_105_4.dat new file mode 100755 index 0000000..0211cdb --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_4/mask_105_4.dat @@ -0,0 +1,2 @@ +xK +0 D=Mr˹A TeEFL2 #鹢_I!딤Ѻ-իkmO]sS T6*'8 N$'NZ^XXh%Zrr$W}rU*G9r|c[cN[_=׫5^J 1*qv \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_117_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_117_4.dat new file mode 100755 index 0000000..3867259 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_4/mask_117_4.dat @@ -0,0 +1,2 @@ +x + н_s]4Dgn2Jj}ҾRsSWGRɧ)5Em#ܯk_"z3\rʕ+r Lk|/{;'jk^zGw=K_GJACF5KEX*@<$z}?p^YqOrD6l{pq{+`&l7JcHsOy z_GM@Ox_x?b=y>Jqe}Ao?uX%DM`IXJr{-ZaqKAvlH`*6wj&*7((AW$y+_m1`VYgIgEyrCkW+Vc literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_125_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_125_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..b98dc813afe773cdcd71a8779391ca295c0d3a51 GIT binary patch literal 213 zcmb=p_4c+S-ysD7)(f`F8-K^2;|+^RST%8G)>;-rsHGtPebu=wvE(Rqud?@Jdiv-z32@0r%Fa7(4|DUhVIr-8&`h2IF>D|wlymv&u|5gc>1uLtXBe(o`B(jjL zU;pLDUo3v_shtNkChn^3Ki;iZZS8BT4}Mgedi!xzR{!b=ahL8^+0UC-$jr|$aq=Dj DA0&Li literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_129_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_129_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..8ecfa250845e8ef1add89a66c88fc9f31250a436 GIT binary patch literal 220 zcmb=p_4c+kU$cP#%Y}Q(H@>gmX_E0-a3R;c&@UP>6Fhnzw0;$t`MGk<)@^G`dv2;9 zJa>BiGETqum$vWzzWVcDA(y^F$>O^;cE3bkZ7!_If6o7~R(2)#^;-&#|1=8@FtW=O zT)5zvG5y;kg&7OBX?Mm(S)NeKczodZftUvk%zPFg;tOl7WBdj2GpxmpM2j^4FA?}L o{bhTz9Ot|H{BduueXdPB_S/#\p\p># \p\p#>qp\p.$Iq dGR_4  \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_137_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_137_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..0c09c487c2e85488f8caf2dcc863e260cfd077d4 GIT binary patch literal 248 zcmb=p_4bYxEjs$#?!2-R}~*>9$YZ>m}P8_SPSlc>J(ZYVC8? zO1oo*K1q`<^UtZRwccRy_UiY^lc)4;t3SOfES@w`rW=l2^YbTRO$JKN#b*jQw`{%rV(;`b$vL{4 zXRQkQ#dOtY-ox+n-*;b@wS2d1)2vU1rN&=NV*fwfSo>q^jJZKc}*2a`@ScXA0|@PM!+Z)$&&j+uR`i+&96LlQothXU{Gd06E`pF literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_145_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_145_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..33fb211249fd13955f9481a5af91416b0850c79f GIT binary patch literal 255 zcmb=p_4bYjXH=f@| Kjo |SSWKZm׌j\Ъ2 W\qW\q"~ jvtv_\qW\qW\q%g3 }+++ r9ArW\qW\qŕA g3WA W\qW\qW]V~v{D3Ȝ!\W^Tڍ[S7vۜgq? +{peo383838{YXz,_OYfe3s38383\C!Ms38383r \C?37938383\C!07M8383q,mMrskWv3~W WB \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_157_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_157_4.dat new file mode 100755 index 0000000..ad5fcf6 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_4/mask_157_4.dat @@ -0,0 +1 @@ +x10ޯs4"FP=iRX¢X0멪u 4ftl}m➭S|юS P5<]rwqwq^QN6ÏZsߙ,wqwqǝ>Μ5g;;Y}Vgw,wqwqw>9wqwq>3gY;[ww?P3Ƙggt퐮;].3w4A \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_161_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_161_4.dat new file mode 100755 index 0000000..7604c45 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_4/mask_161_4.dat @@ -0,0 +1 @@ +xA@ fs!AL_|,4l)iml׉0' +E ]N\x#2/_{7g9쏼ٷ}2r!?}-#Te9C9C9~6Sʇ겺!r!r!ۘse9C9C94_Ɯ|.r!r!s/s0 2r!r8}DwrDXΡ|x|!2 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_165_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_165_4.dat new file mode 100755 index 0000000..d83d631 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_4/mask_165_4.dat @@ -0,0 +1,3 @@ +xA +1 }Or."*?fPLHIkΫZQ8 +Gyqk-n5+?|֎kKnEŹK.K.?2.|EJ{2<:.Ku\K.K.ǝmu)_8\r%\r%\Џ;'2!_8\r%\r%\Џ;'2!_\r%\r%\rinC?nn9 RK.K.;.HqY'ݽNF?K㕢,R| My*3 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_169_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_169_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..4aac95c1e3fc9ba5257f331564b211fab568c376 GIT binary patch literal 297 zcmb=p_4bw{7n30m>xEkX%lG~l?V3;+6CwFBVc+Mpz`!LezkNJB-=9zK3Cy|6dc7)c z$=5@7j?a{Q`J_AleCn>hU3Whz>;A1NtE#vC#=Q1!Zp)m1?|$5V9DCCK-|1Vc*mtaT zocL^x-SRm_r!-;2ueFy?#eVr#8L;Ge>5J}i?kE{?B4PtL69K8~&|}TJq5E>1FRHmwz3+$1r7q GdJ_PDBBetB literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_173_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_173_4.dat new file mode 100755 index 0000000..9df4d86 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_4/mask_173_4.dat @@ -0,0 +1,2 @@ +xK +1}Nrna ~ZY!Jt^5(/jkz[pj_?~v:|jwՖ_mXzo6?n%^4`7 P=;q=RrH8oyopw{-jJFsR literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_25_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_25_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..0c7c44bbb5bb50a1f060373ea3ca14d083fe686e GIT binary patch literal 76 zcmV-S0JHyi+A}af07FAV1c%Fjuna^PAxDf1Irg9fvh0EKpc;@!E_4AniAM&vX|%Qn i>NlJ|HN*%VIGY$5BJ4r(4;Eo;_F$1gmjnRDU3Su2%N^nX literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_29_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_29_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..c28dc20e8248d196503c88e3e58b9048de750a16 GIT binary patch literal 78 zcmV-U0I~mg+A}af07FAVI0*(^2E@r?NRc2*iM`kWMfO73Na9E&7dAmSNkA6A$s@yF k1DFWbSimBS8G{geiIFARUKIc0kiuy%rYtrE0Gke<<${17%K!iX literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_33_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_33_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..5834b6fb5672ddd54227a5229ad248efb56f9931 GIT binary patch literal 89 zcmV-f0H*(V+A}af07FAV1PK%5G9X?BinJkI0ZA&T;SOAYD(-+P$1ng+a^aGIlSHT> vY|E%S29rDBDF$Z>!lD9ODl{aRP7U#;Q^M{*2@gEd1l)nH0+%8HgW}HuoFyU1 literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_37_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_37_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..4bf2e26ed0238cb7f0fa88b4a2e8d9f607c6c465 GIT binary patch literal 86 zcmV-c0IC0Y+A}af07FAVG!hE93`kRjsRW^pR8`b;7d}8$cR_hr3_>Eg@JYf+B2^J* sQ04GUMNxbc& v?i_XJs5{AZrvXfsV99_*CH~R|;!aXkQtVEY@FYSRQSQW4Nk}mOMgc#BT0kV* literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_45_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_45_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..1b921f3009656cf429e67486e59237b8dd15ff5f GIT binary patch literal 120 zcmV-;0Ehp0+U=A<3IHJpMfaXY?|-@3gj12@{}N1#TnN<@9`Z@`Ei+qoFVPwup|*kU zpmqSgF*>cacXR`pI4*58TFBT1fxMG6XL7wac>{^GqK!9Q$bqGK7QU=)P)>BL}k8 eRu0aQtjeU@>+_-I`CuK_9H00P-1Gn#s>kM_-9E?w literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_53_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_53_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..7e88826dd67c8eed58a77ecc7bd6326cd996537c GIT binary patch literal 128 zcmV-`0Du2@+U=H03cxT31^1pt?|->=VN(l5e9snI(1i&h1DSjzs%My4l0%60s2sV1 zUFvoM>Q$%8k$LTH-z$uZ_X`^svLKUJCMj-(<27Edc$MCl9xf#1?;NQB?uAn=uepcg i^-r(*&mns8lo?t9xVoWK-RMw{czy1?FmMC1XBA^pK|VMD literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_57_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_57_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..84669c7d65c97c0b040497b32d3d3037c70d826e GIT binary patch literal 130 zcmV-|0Db>>+U=H04uCKSME9Hq?teKq4gQfCYGNWRShRhHSItD#wao0Xdx_S`3}%zb z)6ua+cp@ZJk!QRPPwS|R$7C*c-vtG{7f62E_H57pdBSPpo*a39C`!$ZCqdRc`@3z= k_I%kB_3cxT31n<5^|NpsON^2;!>e@qKa}XLb#Yw^v)q9v(qB=lyhR&g$ zouh+=UGEBA9-;T^egK`j*5&+4Z}?KB16>uQvCipDZ+dUw-O4os=_q+W=RtbJoA;dF m^rrXIyZXXjy>U8x$cKrH<+(z6K0*KBy}^0+esBPHn8I@q@JM_B literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_65_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_65_4.dat new file mode 100755 index 0000000..c24343d --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_4/mask_65_4.dat @@ -0,0 +1,2 @@ +xK DtXЙ.4E1^hvOxW0 JHŻz[^܈[v +yyZk=`vcǃ<ȃaCe \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_81_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_81_4.dat new file mode 100755 index 0000000..dd65216 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_4/mask_81_4.dat @@ -0,0 +1,3 @@ +xA +0 yMyXE m7"892ѸQ1ݳ+xx;t35DIY1x\:u}e/ #Th< +UBz<5G<5{G<5<饫>]Urxu \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_85_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_85_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..c8d5123e26909726dbd71694e1f6697cad51529e GIT binary patch literal 154 zcmV;L0A>Gp+U=P!3cw%?MR!k=-2ZZ2N*jmT*5nJN&mmxtH#~v~YIZJnPs9LfrlsbP zk*TK+4nE7TrIxLs*SC2W7zhg5zDpNC7h5Ilh$5=S0ABHmSG?ji)1NN$BI-+pH9Di \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_4/mask_97_4.dat b/assets/tools/qrcode-url/lib/cache/mask_4/mask_97_4.dat new file mode 100755 index 0000000000000000000000000000000000000000..5d848caade31141b6a6d238828e0513940b9aec8 GIT binary patch literal 176 zcmb=p^>&scSAzi$%llg2U;ocnYTk;AQoMQf@D~ArLUH5VhzlL*U+;ClQn_{Ld4Rh8 z>uTAu_q(T_ELu@IVU2P7<-3>5gi15Bf~CWkN@uS0RjmncZrXE$dhO>e3gqq;cwFbMH2i4?0P>DhOaK4? literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_101_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_101_5.dat new file mode 100755 index 0000000..c21869e --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_101_5.dat @@ -0,0 +1,2 @@ +x + E+%=M3Cbv ѬNkûgqkqq{%Oo,iKee3[|iVh]` ` 0ʕz˴T0Gu/q8F13:W>#ȕ0c0Q8E=F#+a X͞+cV%9W>Q]TkY-gLqD艋 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_105_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_105_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..bc8798c64015b6595105a07645625a572c839c0c GIT binary patch literal 224 zcmV<603ZK&+U=S_3dA4~1n<6P`v0HHC0WDb$gbEE0yT;RFVdN!?Sm0#$x+d(-M&MH zb#RhAbEHXz@r$NR=-U3QPci-P|L%XEWG%ZUmG!BgbTK0LXu8R?&L*=*eAagQlk8Qg zsjyG52YayhPWDE5FUx?-`>CeAIbz1%-fVQSH_Cfi23+1R)r9Zid)&FO2Yavwd*nUx z9(fPn!}qvzVGs6T5BA7=v+3UUic`wTHUd>xK aP2TVA&wEd3Dq=6}&i9BW^E?1$d?(3j3x3!D literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_109_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_109_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..25a394402fb8b1d0ebf02b85473522a21235736d GIT binary patch literal 211 zcmb=p^>&scSAzi$%lk^-Pyf$XZV2j*s`A*zF?pKO&MOlNBNgB2F4Ef5es`YjsdLA3 z1GmLzcQ4u+7wuKIGk@pLkJ~=o2#t=t|EsmEP`E4gbGg?&F(KW|<)*sao-4A2zw@dk z3W3o7Ln%e~oL=noQ``Tq@Y3g3w~o|0t6%gi0ZRhqKTiJP`A5a7)9;Xq4;a-6*>}!& z0V-}7~CRaH?+kXgI=m1Q4e>}I|^`+f56tjphW?I(xcpB?4RQpn(Z H=>0 0 0 Ofz3=>0 0 0.3Z$׷8\pw4:Zp:qX 7 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_121_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_121_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..9bb5c4158981760f99c1831c03ccf11a664e6053 GIT binary patch literal 256 zcmb=p^>%h3*AWFCm;c4Hp8T7ByMNb~P0`w->X-Iu1WibCj$>!PxYtGF(Dx08H@Bz! ziL_Mtn}1F*CX2(7=TOEDEbWKm# z7n3IwXBH>TO_bgSLC0^-+rs}kq59sv;^g0Fytmmr`w)|MuCvr_`^DT6m?EIk`)9ws z`TOnWP2bl(=@oqXJ10zcK~pjRkXgEU#Yr9g&b-C9Uzp__hM;esZ;0LBZFwcK^7XPb o>!)^ZQ#aoWuYBxxGe&=>)49shxbEDe|L3eseDs4sW73s<0HpnlZvX%Q literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_125_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_125_5.dat new file mode 100755 index 0000000..2161c50 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_125_5.dat @@ -0,0 +1,2 @@ +xA + E&fc;S$?؏Q4YahûyJ}9g==li.;nh_wz.qCWȧy uPk;<<<|*q, mkWqNl% yyyy^2䰅sX|aaaa3ϙ9lH<<<<̿웁[n`Tq8^vy \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_129_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_129_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..f0c1d65020884c517fcba84b94191eaac350aaa5 GIT binary patch literal 259 zcmb=p^>(%)-(dqD=JNe+fBrw;rBWIY;l}PP(iGgY;6uuWT>&yOg;TY((|V7;4|rHz z$aHnxR5q=ee-{;mpS}6Fjz8)5|GBsR+cqxEkvegY{WD8>{;97#wkaFeC|)-I_*?FJ zdDOO73mlv68dxKM=*5vkTKXxHkABpxay&a{NAkk7uziscPg`}IW$x!MWZc)F|A2b~ z0~9@B{lrw+xCbP5#sezq5T~F&LHq>w52k$wdRTBP%uhX7dcHJE;G5lvJnQRETQ@vs deIFa2`wqnRlbR99G23{{r2|{+4tV*M007v5c@F>p literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_133_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_133_5.dat new file mode 100755 index 0000000..46be8b0 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_133_5.dat @@ -0,0 +1,2 @@ +xA +0 DѽOcr]4%1mCTxΜ[Dv={FEϏq?ݿ9keѭ}'2^c4G:3=JK-F0`#Hw'#<{~Z4 :BG舻F0`G~:`#?#tw-`#?##t#F0r}Q}eR;M/k1mX=hsH"k M:3qOW}9ԖIH1G;- sڶ?[%M + v#;zg^3d}69Ψޙ@7҄#gv`;׳ީ\$wlv`v;ލ}7wߑa;vkA#gv`=N2wxgWӤ@n?c}SQ:Zd?+9vz)P \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_141_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_141_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..60c1a8e81acb9a104b1003fe8c362588b053abac GIT binary patch literal 297 zcmb=p_4dw1u0sYqtq*_O`hNbW|NLx;(ly@Fw~{rHnwy%g%&1?U=@uQmHZAgYPUWvV zSwa8P%uLts{p{|I6Ff?XUZ>?fOlh?Hu<*Lhj^j-g&%KHRklY zHSXJ%GR-^MUl+M`k&@0?^TfhtO`k-r;2DQRmi;?;$r6o)IJ{82> zzVP^R$E^#0m%8OX_%_jPZqDCVlYVV;i{Ag?{rvsKSBqQ(C$718!)g|LXx`R)LEA3< z-^TpyQqr?GFC*0AGYu!M2uzSo(E^bzLvI+;8@4U$WERT)%VrUu|y7`j4jj zp4qEF>;UTg{AOd_*}XaEC*vs]Ŝ_{W!zﶬ/)˙v V6V޻,f1Yb n^o>\O],,b,f1YyVgYYYb,f1+ʳ<˳<˳1YbŬ<+ʳ,,b,f1YyVgYYYb,fukys77}vmb=wsw)tW: \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_161_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_161_5.dat new file mode 100755 index 0000000..70d5fb0 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_161_5.dat @@ -0,0 +1,2 @@ +xI +@нDp@ o|m rHk㨤~co^Jzװ#5l¦S_92 [}ZÊ=T2ƀP2[cV衆CYf'-X9>v~usK5`e,2,2,2-///o_q}K\reYfeYf峖o+/,\feYfeYfٳexB.e2,2,̲g+l\r16,2,xKGoxt!_!?`Z2*Db#6mYclucZ_V= zotdf6-&SvZv*GR8D7h;;_}1^MuiAF~^{4Rr^~KwcM;_~Y5%sO3bm!TkuUAgq{`4tJ z=-blf&CknX*3G+da{|L^pSsAbX|zx+~B?%Xj;& z;1;Iu;j^AJCF&Z`Lw*|;|Nba-v0r}8=>>Iv>dx&vf52z;Q-;T)bDuoUlH3!|5cNl~ F6aZ#Wx#j=> literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_169_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_169_5.dat new file mode 100755 index 0000000..921a770 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_169_5.dat @@ -0,0 +1 @@ +xj0|/niK'.r:T-m&Zx9yq3rOgvOO_zׯu`]ȷitاtiloc13j9%_g|ԧ)>>ϰ=te&_4=tU}/>>>Or5/u>/g}g}gOsvO}/g}g}ٷGo-w{r_{g}g}g_n=n]4Nkβ_M8m?SF< \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_173_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_173_5.dat new file mode 100755 index 0000000..f9a6741 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_173_5.dat @@ -0,0 +1,4 @@ +x[ +0&G1gD)[CzeDѷц=RN6FJm JqP}x s_}GFy; +[;]ek[QbTmy&0 L`̄Y?رw؛ fcVN9&0 L`ׄZ}0=F=F9ANL`&0 L`BzYfI=F9AN&0 L`&0 fIsr ' L`&0 L`<i͒"9AN&0 L`VaBX",Um> +=wZgBΜP !8 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_177_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_177_5.dat new file mode 100755 index 0000000..b07c636 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_177_5.dat @@ -0,0 +1,11 @@ +xъ0~ܾح uO,"% :$Xui=ѶՃgƸ?Ώq.So~z׉W:=h1cq]Ƕi!r8Ɓ`+X +V jj;8ƁX+ +oV`+X +V?[1^h-ֳ5Z;rmS+ +oV`+X +V;Z,YMB+ +V`+X +VZeڦ}r\!W`+X +V`+3Km>SB+ +V`+X +Vc㊛{g;^Qq5ZUݮQL0+*&YDq*6 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_21_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_21_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..04f97ea6983c85e1cf6e68150ea02bffa30a4f4b GIT binary patch literal 74 zcmV-Q0JZ;k+MSL;3IHGo1n<6P=l`E8qQc53Ts_3F*hoFpjJL@ppoFxt|L%<{=GZy:DR \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_33_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_33_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..726d7fd75da51d6bd7737a41e0120162ad66f42d GIT binary patch literal 106 zcmV-w0G0oE+U-+G4gettyYm|Q|Ibavg*ZYTH6AU510hWtK(zoJYG1SgT>VVIrQ<*s zI~>0{7>;PQoL380wan9y;(obh5mL~qPG^u~gT@LOIlD;&&=vfsD8 MtZP z6Mwy=xtNYJP8P5*q$8GTpmRmFxG+$uUgBJr@iKnar8ktiR$tD;xa+0O#TdC4Bt{5~ JuLf_z1Mr1%Fq8lQ literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_41_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_41_5.dat new file mode 100755 index 0000000..e07c617 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_41_5.dat @@ -0,0 +1,2 @@ +xTA + 5?7XMtxҴx ?@7@~"N$Sɰ{+CA'r\Pp<ޏ- ͺ:S3sԉۻީz#qw > \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_45_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_45_5.dat new file mode 100755 index 0000000..5168a17 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_45_5.dat @@ -0,0 +1 @@ +xUA 5?U:N&Z":;4P1=bNvSGM1˛n'(κ J{Eѵs] ,sq \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_49_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_49_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..9f3f3cd7d60bcba44d9223f52747c1cc9a9feb52 GIT binary patch literal 146 zcmV;D0B!$x+U-_B3cw%?yZ1HC|3A0G94cx|E9_(x5y8cz*3P{E3|?W)+(E}-2WX#i zfHZ}}1&-ONsSXt<99&1;WS;^gJWwdf{AS1((&~d%`->c<{A($VpSL1s{ zRx%t39rs?{9Nck;b+FN)RKeb>Q2ppQ^!)JYKLg9b6OOo!Q?K^%$i!U415hQ$TboHr A)c^nh literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_53_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_53_5.dat new file mode 100755 index 0000000..449807b --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_53_5.dat @@ -0,0 +1 @@ +xVA " zYf5ƐJC A;l\,dR. \(e_ еaNi5\żaLP(;2שjN6O u+l{y6od^ C[%  \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_57_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_57_5.dat new file mode 100755 index 0000000..c7dd81f --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_57_5.dat @@ -0,0 +1,2 @@ +xVA + 5?NlZHAbBZ0a Md`1z'"<Ր19nvͨ. )bݻ~;9Z#tB~ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_65_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_65_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..ecd9380682523494a1f5577c6e22eff92571b446 GIT binary patch literal 163 zcmV;U09^lg+U-|C3IHJpy!#sG|DW4SODL(th;FD_Ol!+`ptx^N zLEU#+P+TP~hiEM?kDlMYCn2{Nokr`dh z=(A4`MyHt}6_aUUXNJM(G}onKt|Qlx8JUq8UCD^KPfsl&$;;O(L#`i%q&M<+dnDc& Vax;Tki-1v3l_b|f_yg_whE8s3Pu>6k literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_73_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_73_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..00001176d018bd72f9f2128f2f0bf775aab99aa8 GIT binary patch literal 184 zcmV;p07w6L+U;0d4uBvG``>BS`(MrYR@be?`f zXg4__uzEOkK6dEjx2oLg#9{`gm`?j=wt4_|87ivOHqbF%PAmBX8kw9Db&_}T?ycUn z`rYuGA*p6w>oim|H}6{gZul*glk!e^C-3Cl6W;y1W(Io8^nRzjQ{KtDFL+1JRVtmB msmjs2lzG8{6JIm^VkS0TGiPwh(`lA>@p#INaS{u_o$71/34Ϊz^'[FyglgM>OTL4ϔ{&3Wy*ʧb*`<3;Vo0/s6n0ya[mcE \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_81_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_81_5.dat new file mode 100755 index 0000000..71215e9 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_81_5.dat @@ -0,0 +1,3 @@ +x + C~M?tzU4" }tMX2|.ɋ˙F\~m4Xu +ٔ, w:EƄ>X̯=_]g>>zמ/)5ךkkkZsXXY{ܮ}~mt:S#&;U#) \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_85_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_85_5.dat new file mode 100755 index 0000000000000000000000000000000000000000..09cf0e28127934862f45b0f155ede22e48833cd2 GIT binary patch literal 186 zcmV;r07d_J+U=P^3V<*S1n+rG^8e3yuu_X!YO*T`o0cLu)Fn>SVBDKU)x4XXo;}Lz zW!EUrTdh$X>snv=m*blAkGsN*t+gK4zOfzOFOb9L?@mq&=-FzkwKE)0V`(MDRSbv$ zF(3xMXCUdfAl$J#15Y(!+RxHTimUQ~@_-l+17bi7s2)%~pgf>FAO^&M82AqZz<$9g ouBdLo$N>Dm_MjDe$NHpal&=TaS~+q3j)5w#tg{8Q4HYg~22k``-v9sr literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_89_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_89_5.dat new file mode 100755 index 0000000..5fff530 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_89_5.dat @@ -0,0 +1,2 @@ +x + 45enpQ Gcfl^^;;b5;`kU͹߮j`NsO=\[a6~nLD? !6uF%w*Ȭkf77SĆbÆXodw_—mbClNۙ ck&YVoܡ׷BעبAl6 Jjx \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_5/mask_93_5.dat b/assets/tools/qrcode-url/lib/cache/mask_5/mask_93_5.dat new file mode 100755 index 0000000..ec4240b --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_5/mask_93_5.dat @@ -0,0 +1,2 @@ +xK +0 D>&&  fP^8BY5s(imҮ=f3/wۧEyYQwf[} [90303ef̙3'3=,ͼwxDַ.,;s%g,,,=Rὓ7uKKTD<(n lYhV۹sޕyPEtyY]ns ;ss,!LkԅcbL12cX91Z#XEn#;svT~L~LR11vs.1111J1&؍Ń111J1&ƞg KLƪjlk{gڞ5K1/ǐ~,ac$ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_105_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_105_6.dat new file mode 100755 index 0000000..a58fec7 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_105_6.dat @@ -0,0 +1,3 @@ +xQ +@ DskBZ#o)Sd}Gܷl쯯^)G]S4S?#BZ:+{sHKNiI!me1 +RWe9!``Uyˀu:檞U=w-oԺwB}cMK蹰{{=y蹰{{=y蹰{wScaoi'fyO=CyO=Cy[{S޻=;|v4}ϯ20 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_109_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_109_6.dat new file mode 100755 index 0000000..be7b474 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_109_6.dat @@ -0,0 +1 @@ +xA0 ~ρDBHCHV20nuol쯯˻=ۢs9[l'?7R" &2:7QqX_n ]$՚EIY*Lq0 0 0{LJз(s\ɳwX-7^ItIII$~?N0 0 0O'Itg7L$L-Iuzrfr M^'}(O~R]1YLĞu9Qӕ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_113_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_113_6.dat new file mode 100755 index 0000000..397f527 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_113_6.dat @@ -0,0 +1,3 @@ +x E5NՉbF6on,m>gS9RWcǕ9&%1_cx= GR^w-z?dzv=,}ԥ?ǹژ:9m==@U䲉UXUXVe~by4Wi:e=+3}u4V%s*ZZGM&;I{^hb=04yIS((dxvZSQzT-ftM{l(nX+lN_8ODT@5*n+ z7_UD(asGDJ=LTuwGLL68OD>x%-!8VhX~z9)s_}nsM7#IRuTu5NlE1M}DE!~LqHV#? z>Qf#_+}0{yXSc>}`Oi7KFW*{qHhjb7t7W#OJ7->RxEgr--0aihQri-x!RWX2w$z_x z-{(K`{`B@#S%`O<>9f@NPe0F}o}Zti{rTɼÆ$<>Ov'Cytaaaa~|'9liΣ<<<<Iæ<:<<<ٕWDzy:.z= ݓʯ sVöE=ll_k0_#vίmj \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_129_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_129_6.dat new file mode 100755 index 0000000000000000000000000000000000000000..b4695c3ff0d8ebd6925d8af5e0b403d5974ed46b GIT binary patch literal 310 zcmV-60m=S&+U=Xs3d1l6Mc@4z{r{iaU`b3tw}-Y`#z{*Vj)K^nc<+O%V_D@=U$Xty z&tEmqAcJ?j?v86TK^YOR_hi^6CyeFRR#Fmw^kkN5f+OzB@3mz7YhU+_46fxbXrKqJ8dEWiRRzyf{&zkpxBFVGk0 z3uq)*fCX591z5l@;1}=<_yzg`eF2RG3$OqSumB7A1^fbj0lz?Bpf8}2U;!3j0T%w4 zg_beb0}DNqzB>!qv~!(b=$i3#ztA<~>3$)bcdqjbP4mv1Uw8})+SVD`X8*k}X!oJ` I0%mGk`PF`vEdT%j literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_133_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_133_6.dat new file mode 100755 index 0000000000000000000000000000000000000000..40911dc575dbbb17a4a057a46521c47b159138ca GIT binary patch literal 296 zcmb=p^>&UUU$X%Z%lo?CzyHr~4f5p772*@!y+W#4z-aoFvniX|)r-4>+}{b_t=?z1 za^B%Uo6C=?Bf5p+A4mDPRY%qZb+7;LH~IgZx!WufT|#LdH+*}lvf|jbWz$U;MJdj?+L60%T4~Y&jvfg5!>uf4f9dJsH`X7Hoj9}k^e4rC zS0C4C)Ev*0lXY~zAowlHfJqsIn&c1mKXCt`{DQ-(sSmClB=SSBgaxSfM)pCdp>-_w zAk_;%Y9X4Lls֪r666rҟ=vڲWy -' +Ο;q tQE>U϶f곭xN]Tc(s❮7tAw`v`v`v`kvwfwt;];;;;;!ޙ;ao];l;;;÷| ʷ(3}l.?"މr};\}S-Aw<9;EV'ם \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_141_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_141_6.dat new file mode 100755 index 0000000..0340409 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_141_6.dat @@ -0,0 +1,10 @@ +xa F4/c]زȐ[=[E럓sm,fn/|kj\j?g[q(NOZc5SGGP[oMVָfvL<)r%zGej;*ZC7u5PHroFXT;2T zErAz-@(#{w+P}?wqtMJ3uDW8^Zp>M}^Fr0Lpp6sHMCtS0T=zSWcURlGh1q8m6XBZP z)<+zU-@Sal+U99%rKBCNUob7{wNzPiPzs9vGH3tDF8^{p;9$q2z5quaE#u5AU!HIYpjb0cSa)^E8M?_KmSO6tj)==bYa lKD}5p(yFJjBc0i__3AFOq}<9%1{c=3R{)onxM=_Y literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_149_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_149_6.dat new file mode 100755 index 0000000..69e9883 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_149_6.dat @@ -0,0 +1,2 @@ +x +0 E5f478UD62zmpߞk8}GӕN}?}W:guWAˌ7 ~;)Ø{̪ǿ+WPOۢrE\jwG)y˖wAAAAM%2`2dl|p}eqP : e j想=lT5ɠ : G{ddAtDaaaaa&أ&w : 1-MRb0Wf uz5&YiIѺNрAPQSL}4 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_153_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_153_6.dat new file mode 100755 index 0000000000000000000000000000000000000000..3ab6130edd889298419b702ce1dcfddfda30cf2f GIT binary patch literal 367 zcmb=p_4ZC+-eCoSmWSnj%-{FNXq%daEZUK`+NjemCo*t?dCFURVYiCx+AY&AWaXz; z#Mw80;rtkb0d8YE*wD7uX)inq9ZVuZUFDP(T@8+N1 zd)6dxd%yYT`R@txHxIga-#%q{p=18$LjAv|)HMzi=qI9z_Q`c5T9@Wu3#VwUI?XqmF<#Ov^FVyZX znO%a=0o3e&KJ815aoXF1m16oYp6*fD?Jm?ru;I^wH)p;*n7!8a0qfl_O<0VW z=e+S-gZL9m5s=WóCaz6U~һ{`nݻdvVy~rZ"qk{>g$XKU}m\bjaGx,f1Yb]z̞^.5[?嬜r,f1YY>grVb,f1Y>g,rVmYb,f,|VY9Yb,f,|VY9+g1Ybً ̦M7>2{9z϶hm3l|9xټ#f#x6 -v%N' \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_161_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_161_6.dat new file mode 100755 index 0000000000000000000000000000000000000000..ecec68b1ac0f7ae45685bed5d752ef54a48f0f3e GIT binary patch literal 399 zcmb=p_4aOH-eCm+*NgRG%)jr)tiI;gamK_~Was)*2d9a$rlzvVFd(`Vxt}K4Lw&$1iobzS93uRn)?%d|f?w*sGT%NE> z{5IRU4qg|XWXaPJc9Wm(u=|#>w)ceHw=b*9PWtu#%$j?0UgYIfVgE|yed#NsPfj0ye)_BM^UK-)PTmj)Dk+(%2Qn6>@Mqw( zr>Eaf(4VdSY0^ghT|OXlU~(X3o3@I6N-cI>vvvVU=j&u7z0uK%@n+#iZgHXOO4Lz* zS5klalWD4FYUNJv>X3bV?!C6tj6Zkhb=|q?)qi3p?yJdny>uh|S+%y9&hsv>7uDKn Qv3e2bEbSR&we7b907^~O^#A|> literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_165_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_165_6.dat new file mode 100755 index 0000000000000000000000000000000000000000..d641dfa3dde2565c932c7234b4521d35c4a1af0d GIT binary patch literal 400 zcmb=p_4e+=tY!lV)(ihDXFd5FpVz$dq?^)Rf%2utrx}%SOWEwLn>i_J`_iSlTlG_a z?5xW@^>fafr_X<_`MyU#`bPG>>Gu53mUJ)QUoZ3jlYiaKTYL1ypC5hw`u4`@;aj#{ z65c&WV*jT2f7ha_kN&Vtzwen{t6%P~`!n?0+`iwtWbQAWZ<=}1xMrHJarBp;Hbut9$M7_G_mM zcbUq6j_Pl_yVJGrbfKl*aj-TBao%v9T>btkn@|5AAOFSPyYnPS{;9>|9^-RRg7etb z$M3`Xce6j+WoQnP+#v(96>7#EW6f8E-w#x%VH*A2r>p9Yt-(CciI0n7`gVuGb;wx~J!=SaTlS=q~KG>㵾+'{է_Vˊx-J<ӛܗr_>>i;rO}/g}g}ٿ}}xO}/g}g}ٷGo/{{r_>>o/z^#}g}ٿd'ʳ|QRNS3YڳZ'msEǷj5 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_173_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_173_6.dat new file mode 100755 index 0000000..95fa97c --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_173_6.dat @@ -0,0 +1 @@ +xa09MrM S*:a_-5hh_)uZ֭[loےsmKN{H?x`l#f9>ڟ[eЄώߓ ?^m*/Kmhy%v-nKlkKL`&& g5(gwxYܞa¬pVcZ[#O=SN9&0 L`DŽ 'tjj]QN9&0 L`sYRc@QN9 L`&0 L`"YRc\ ' r&0 L`EH9AN&0 L`& 7p6`|hms R5Ƙȉ k\X/ )g9 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_177_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_177_6.dat new file mode 100755 index 0000000..e9f0476 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_177_6.dat @@ -0,0 +1,14 @@ +xn {ڤ*4v۴u1{f{_,,K9o 4ǵ7lniJiggir<-MG + + + +xuV+zRCr9+Gq6QWb"Qe"WL+ + XXXXX/|~j,nmuMۤ+ + XXXXXYa,X;M+ + XXXXXe)oӘf|5H늚7/D \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_21_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_21_6.dat new file mode 100755 index 0000000..6bd505b --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_21_6.dat @@ -0,0 +1 @@ +xڝQ C9M{i]X1- C!D7 W ٜ&rD)~]<M 3(>{A aS \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_25_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_25_6.dat new file mode 100755 index 0000000..d45083a --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_25_6.dat @@ -0,0 +1 @@ +xڝQA 52)e+(XmZt*(ڹ;tJ<峂_ڤ3oڴ"̢azh}&qvSG֙,-J4}oS[}w \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_29_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_29_6.dat new file mode 100755 index 0000000..0408e22 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_29_6.dat @@ -0,0 +1,3 @@ +xRA +0 XcL(4EԈB +8Cܾ޳nM+lǝՆO1]&ڍ4UD-6-$:6dZ?ylf? 8?߲bTQ5IjGy*#_+5FlYF0i|O3{~#Ory&Utx49Pb}M!qqU eGB4z0Ua0$-m+;~$`<#o+3+E#9Qgs1fkI!%T**fq5 literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_37_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_37_6.dat new file mode 100755 index 0000000..b37ff0a --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_37_6.dat @@ -0,0 +1 @@ +xA &T `jB{{Ok%tdtlP>c!Jq2?sR|6OyXBED_#CJGJ|{4?o|# zWi31{IkRWty7H{19EeICVF#bFBLK`Sqohq!P3c{Hxke=hL*^psZ< literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_45_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_45_6.dat new file mode 100755 index 0000000000000000000000000000000000000000..a7da7ee0297b6371bd3ebf57467f009712e40cd6 GIT binary patch literal 189 zcmV;u07CzG+U-?A4#Xe`yz?6P|L3|%6(}8a+S4YxXiTkkisJyP!>lt6lk}|T(tQNG zKksqJ*w!?R9dPAm82jdF@w%LHYmk%ah`(8LQqB>(=edn(GCywV&RxRO?k3YHLkmWk z*aT+KWsqQ$<3Gg7PA4uT3C+}K0drYmWeGYb>)1(p7ta_qgP{3eCtn>q+w^_mWM3IF rC#dT5I$?6GuTnWSVh7coK6Z$@lVax;CrT-Ws>PubeR7!xL?VGyGa6i_ literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_49_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_49_6.dat new file mode 100755 index 0000000..64ded70 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_49_6.dat @@ -0,0 +1,2 @@ +xVQ i{K&YX؁0̦!=tn&fpWL +`/<ϓKVrU\1bGp@ӑ&fN/+ƽq`AWSRGp_5||zxν:J+WEm4h43tܭ.Ag`\ʤ*F \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_53_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_53_6.dat new file mode 100755 index 0000000000000000000000000000000000000000..9139e325901037a409a2a2d317141cbd9bb27807 GIT binary patch literal 195 zcmV;!06hPA+U=In4uBvCMc?@v`Tw7*ElsG)6&_ona}B4=6R_J_H(gnqCg!_cThR(n zojZKuSh^TEmcRQQKZxaCGEO}_fJWLvh7ncHkT}m%gO65*3_i=>Wv5I&JTu%XJ;$_U zq9afxnshi?de~<88-}PKQlCVXOM8jnene{dW{CPB^@+QK_CphY=i#p94>Qav8_#g2 xe}y4d8>?E5v<_ݏ`8G1`B`;+}&s]<iK'l'9%.7 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_65_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_65_6.dat new file mode 100755 index 0000000..550fc8f --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_65_6.dat @@ -0,0 +1 @@ +xWQ i{KNLk?e$Qik41{`+!ڮM ? 1b8 .^wsnFj5EaQX|=w@2v<ŋŞ|4w\UXBQz+TTcBz/48,5`ȱ OV$ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_69_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_69_6.dat new file mode 100755 index 0000000..a3e4fa0 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_69_6.dat @@ -0,0 +1 @@ +xK @dTh hLSSEq eY@<+*|窮 %>z*7e6QS`.>sE '%@[6@P0h aFxtpl2 Q-g1Nfeo^0FdT>N_OwG3ug {3<[Ժ b?'6^ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_73_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_73_6.dat new file mode 100755 index 0000000000000000000000000000000000000000..ab71b70ae59ccfb23e9c4185b1e919d531fb040f GIT binary patch literal 230 zcmV6w!~0Dh_U!#`ksFaQ7m literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_77_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_77_6.dat new file mode 100755 index 0000000..ad5a660 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_77_6.dat @@ -0,0 +1 @@ +x E۲iVa.FpSTY4q~z=:͒ 6m8:#0PضiDy:2Š'Zs&}滜\r0\ŚXw;iPȔL)Seԕ{hDu9LbJSS))gZ{e)qJdLw+#3-V0շljڠS-S 9=ݯ5PPq1M?g \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_81_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_81_6.dat new file mode 100755 index 0000000..28a6d07 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_6/mask_81_6.dat @@ -0,0 +1,3 @@ +xQ0D9 rRLvk`0 ;i6\|_cc1huio#2}x*.Yt& +ְq/K;3ve̢ȊAH?`]5Kw!}{Zû߲W +yⷾ^_ykk^Kתb-bYSڸ'֜Nu#MfHSQ?|]IAiMyyuW \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_6/mask_85_6.dat b/assets/tools/qrcode-url/lib/cache/mask_6/mask_85_6.dat new file mode 100755 index 0000000000000000000000000000000000000000..d5403e49a80cd825886b9cf067587297c22542b2 GIT binary patch literal 229 zcmVz+U=Q93IibwME~bB$^9?aLbYnE?lu`e3KJJuW7jbno{1 z6z!*@KIP;y_0^MY?(1Uq+xo)SueFNlpSwk~3kHJTZW;Jhe~*j0f6i>Ev*&T`9<+0j zJ6S`Ia)zC1@aibjTa>+X>cWZvF(3xSz)1!u`9P<`={Ia;V3iYwbtJu->xkU@m%8GB z;(!ntduS+U=Q93dA4`ME`S|1p|)V-|IyeM8#yz&a$P<5H8u1j zJvs=^zR6hA`VPFkrR{fvn^+GR9ksLtHTXo64YENt$i~~)fawi)LW)84hWko>3Nllc zx#paEz7d+7rFOyurM|GlguB4YENtj{*X=Ev^DF}ptAKX6@RpX4vjZjklMsHWS3nR)a*F|K!unUJMmO!Vn} zoTXx;{$pvl+nqFvSzoF-QmYM8VkABAis-2UASHPxZ{Wiz40ft)3ZUf;xjbgSiRJfEh3YX28r%%+%_c*_vLo*0<$@ z23~1k)EU$n%uQeh%zzm%^YhH4w^!eo$?ptXW}>e4xt^)$QRDw9atl$NB&!*=1='#`+bl]Z \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_101_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_101_7.dat new file mode 100755 index 0000000..1f6bc51 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_101_7.dat @@ -0,0 +1 @@ +xQ C}rm`fjT#54'tfaЇo$cmOJ23c<6Xn0F ) \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_105_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_105_7.dat new file mode 100755 index 0000000..6b0cacf --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_105_7.dat @@ -0,0 +1,2 @@ +xA +0EFaMҙNPx)pQ_~|ñ(bF$.aoWGNPUǖM%{oHQUlִL^>+m#{{eo&Y2soM)gncO9sZ3wo+{=f.zޣ{{=zGcskCQϞp^&{^NʷU e5}EwGn+o \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_109_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_109_7.dat new file mode 100755 index 0000000..9875cbe --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_109_7.dat @@ -0,0 +1,2 @@ +xA +0 D9Mr}* _x-d:"NJ-k"⨚d{ջגɬ|'rQ5+ s)c7-1nn햺qɔJtg^ʉw̘Ň-?*&Mm@ee5^ +c + +,b\13j4TZfŢo* + + +:Ut* + + +Xů0"%6ed 8rS NsUnk5XejުuVXg,l`u!hXZ\VlM|[ͬ0 0 0 #hF'c]i>Hataaa~<ÆzyqkO0 0 0 㪞Faaa)2˰fÒ%z8tO=3=3:cw +V$ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_121_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_121_7.dat new file mode 100755 index 0000000..d5d577f --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_121_7.dat @@ -0,0 +1,2 @@ +x[ + Edi;^az,#6ƞ^rh&^amY9_غ5Cr6t^^WlEز~ɿ|MmmS}( ۰ ۰ ۰}mQ]ZVq]vѲ"M1fG, qBmtaaazeF3cxIDmtaaamný$n۰ ۰ ۰ ۏa[}`[yޖ޻)n<4K/Oslnlm/G \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_125_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_125_7.dat new file mode 100755 index 0000000000000000000000000000000000000000..f9ec0887b05d63190cd6ebe1bb181252db240a5b GIT binary patch literal 288 zcmb=p^>(%+-(dwFmiND<{`^0`b*j_CTqezxZ{^rj;wKcm=?PmSu=Glz<7VlslV=Y- zO8>Uu%kQn~TjKuaTl~3{$o%&7)#h8}=22b&;klFIREslqHa`A!?#mmI&via`Hb+0Y z@=dof=(6k43w+wj81s{h(%)-(dv-mfy8!@BX(Jcim*@*T8k(?P5abBdPTV55E<2nWM}-KktRmgh+FK z(J5XM>l-trubloFW*NMH^}mg5a-3Y>F9fC9#l&wam?F3O`BH_m{d}fVk6)~v_I&Hz zHJ=+cdHrqItm^WLCC8c$D{tL(Yf{g&%x7Q9 zubFPXVwyI0pF{it{Ra~h7{x%SagRfsg8l^Y7u;W1ZG?0VFoDnn@e|xnSU)k2i@PJtN|E!a-ww)M{dF^|hGkUkCJ!|~{M9*8VnoW7a`o8vg bU+c{{(Mi0VI}n?>ZnFz5Vih(RRyE z|8~uM{F%Y??j(=+_U|&*MxD6{EXooGIou3B+4rdIt<3u>@m`ky)yCCP{twlzB)65{ zxt83x+o|t_pyi`jZivc5?msx>A1W8Q07ZMC+7Tk}qrk>B3EF|xO$4cfDymCT`D{~t z*yCE}H)iGgttY-t-17O&+Wsls{yaWkCr)~=oXRV&$sJJi`D}ZpWzpFaOJp>)b53$^ I_LZ6o0K%<<o[l +Ο +07։Vl;b7fMS;1LCvR|KMH +#Н(Sqd \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_141_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_141_7.dat new file mode 100755 index 0000000..98dffab --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_141_7.dat @@ -0,0 +1 @@ +xA E= rITY@Ä0!|1tbG0ԗѤs2Z/oa\qzOnҋMntX"KmeM}CpPL^S0S0S0SL )ǔژY߾%b,Sl?zC)tLLLLI2zRXh@)tLLLLI1zbϷB)~0S0S0S07)|B)))3ՖL% tfwM*:~hZsnc$1UTtJg8OYE \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_145_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_145_7.dat new file mode 100755 index 0000000..4aa2bac --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_145_7.dat @@ -0,0 +1,2 @@ +x + E5?W6Z-^2qbGX6(Ɖu"LbbGuμGk:HwA[jmHݞ3OkQ{l|TEm JfL?2"&)kRfc̉F,z=5X5X5X7F\pUs#5X5X5XFdYk!a ` ` `o8ct ]CC gM5[N%khZp?Iܣϲ^n$Y7AZP[ fȓ0 \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_149_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_149_7.dat new file mode 100755 index 0000000..809f005 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_149_7.dat @@ -0,0 +1 @@ +xn {? uچ2G$ncFKb3֪tPc ̥7[?9:['9'*Ӗ Gah_/z+6XB>2qYJ0黏Bfa 1 9c7G Ol,^꽓3A:H  1A b0X4%٫#d>&C  1A b+g嬜,f1Yb|Y>+g嬜,f1Ylio.\Ɲo=gϙ-yk_TA \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_161_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_161_7.dat new file mode 100755 index 0000000..35ba8ff --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_161_7.dat @@ -0,0 +1 @@ +xю y/皨E)Ʈ1~493,˵+ZT=ZeC.~iߏ&>,6e~,lW] 2\;׵2j"e,rXݵV(c쵵ZӖ18ީ/,'t.ee,cX2߱,_|yt|]t.cX2e,cy/ɗys.eLe,cX2lo|Z{+2]bl,cX2e{+֊[A2]X2e,c9CXxJ+6rf>h5o6qcIQd2nm=Y_6}PsM~AQyzW1wahnqx4i9#trl79 zGTt{n-#Tkq_|`@8b@BO^-&#lQzJI&bdA?QLEw|ZnT7O=OKRfSrJL~d`Aw9u`O=epcc%X?f~g1U{2P4x`u+VC z_4Xxs=ND}`cY4xm literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_173_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_173_7.dat new file mode 100755 index 0000000..3b51371 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_173_7.dat @@ -0,0 +1 @@ +xj0 {=M/ RbHrj\=,mcoZ8;mm0b_ߚt$~Wu5ǚNn'?df2(oG,L6_{z? 9wq9 S!ƌ9o2 L`pOEnv8Lv8L UY"d} Kr ' L`&0 L`B'f:O8TcTc\kr ' L`&0 L`BYgIkr ' L`&0 L`"YRc\ ' r&0 L`EڳH9AN&0 L`&'!;q+Yl*ܳ=؀9j[2 Ms¤Ԅ* \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_177_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_177_7.dat new file mode 100755 index 0000000000000000000000000000000000000000..068477c92af080afb53465a651dd7d1815d562c2 GIT binary patch literal 407 zcmb=p_4e+?tY!lS)(hWjd_VoS4`&P8oD}qI!Lz*MP5ODNZExOG1+MwJb8D;p-LO8! z?c3h{D>>rL|Ffpgd7A6Xc6+Psn~m@D{rRxH?)O~%;+lWWo2OpY#{~EVH=u6 z*CeoNM;zn|YxyENS5&k1Xxh;g$7WrP-Y%=Xxj1^=`WtIKUTA-NKSlcq*G{K(1-ys2 zkTw0`)@J(M6-dz@>7=A*us5M&v*{}_V zikH1R`f1L}yvxPQidw;HV6KBY)F%BE(1c~reV&3`GXd;yxF5O}ivA8Q?Gyc+m*}Yd zYKdyZw)H0}-4ng5+!L?o?u!;XT{?T~wJmv{XFN90&I($0Ldf#T-Q#!vG0tQ&@c{s0 CYRvKg literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_21_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_21_7.dat new file mode 100755 index 0000000..4f9f138 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_21_7.dat @@ -0,0 +1,4 @@ +xڝQ +0 B=r]-?]Rl2nc +[nA".j+i +~x3;QIQH8R҈G"z,&;'o97%P8%6oǽ;]NWn[f7v \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_29_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_29_7.dat new file mode 100755 index 0000000..e3d7391 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_29_7.dat @@ -0,0 +1,2 @@ +xR9 QpX$lŲf!I2pgSMZj"te0#ԛ`_1-cha~/Eh4"~ \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_37_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_37_7.dat new file mode 100755 index 0000000000000000000000000000000000000000..87d9a1a9d2c57b346aa4a8a2e03754a7f7668ab3 GIT binary patch literal 122 zcmV-=0EPc}+U-<34nQFY+c^!r|K-dh{-xmXMloTrDOS>|wt{nN$p8UIKT#gc;o<{l zE|1OO;;@B_*1sBYail&HAVaMSznZ$V?+Zst%JX#@k^|V&_%v=tL+(dx9wGsNg^L)? cH0CK`8l%kV8sp6AdyF;KJ?hQK0&cYgLugGq!2kdN literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_41_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_41_7.dat new file mode 100755 index 0000000..8acec04 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_41_7.dat @@ -0,0 +1 @@ +xTA 5[fDY(O^bR3/~t/L"7SQQ5j\Sib#Նȏ+ǣw#zx?㽧A-wu曑Y7$b.%A;wRoxG}? \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_45_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_45_7.dat new file mode 100755 index 0000000000000000000000000000000000000000..dbba31d0bfddcbed98ea5d7a9f6ee59f976e0421 GIT binary patch literal 173 zcmV;e08;;W+U-@*3cw%;e7~=;|Npr$DAUrsy$v=4K{1olOOYWhIYuypTZ?rVorcG` ziBe#%j*Q*dv)kOh(x@276Nxd&JP9U=2L~+ngMKq>jn}9{jK*jHRSM|5x5n%q5&j`e zsyWelhq7a3OJw7iYkdjosJYWIS!tZw|D3#JI49hv+1NkUa3?Dz bQL;xvA(=V?*)bSkL5FpXakG_S`^qkH-^P*%H1XEuNsLnfvAu` z`*BEI8A_NDBQX*qG5P?bYCW1Y9JBiGIs;FK@Oe8gF(1@>hQVmp28DF`j`Xh+BQX-A zPcoX-fMZmg?C*@cp*&oVxZ$(2Gpy+uA|bgw1Aot87`^rkIYy2Bj`)lr?t+Z`0Y=4# E+IH1p%m4rY literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_73_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_73_7.dat new file mode 100755 index 0000000000000000000000000000000000000000..f414e4a5877861bd45e439125a47c52b70a0ca12 GIT binary patch literal 221 zcmV<303!c*+U;1;4#OY_e7~=O|NpsVOKWw-svJ$a1xQMLKjmF z$Fo{kZk}5~sTj*XCvO!sEAx=sT{$)7Ae9TQEOc4^f@wQ)ea)wu7H%}{#MK=l@)ASD zb^%LDMOj|2h)%FTj!en)$C=J-W^O$fr&vx@-|THnt7dOwYNfBvQ>ukv o40T%96U5*sI{`_>S?}(:yTl{G&E\6}"AX XϬQSkr0$!s zmX(et@ z$j}>#8;TpsDPluxhz+rk$AtTL3lG`X3UJ4`446UdL}WW&@+vhnbfN!;F1qj9*+b^XNIk3 z`ZsZ(ai8(tWM<5anK3hF=1a_o^~_APRcC!GK5O7o1G~?-&v25BNzV0+I1 literal 0 HcmV?d00001 diff --git a/assets/tools/qrcode-url/lib/cache/mask_7/mask_97_7.dat b/assets/tools/qrcode-url/lib/cache/mask_7/mask_97_7.dat new file mode 100755 index 0000000..b277368 --- /dev/null +++ b/assets/tools/qrcode-url/lib/cache/mask_7/mask_97_7.dat @@ -0,0 +1,2 @@ +x0ܲD[V.KI`'sxy$xx"= O^&pbYʬ$Kݣ8K eÌ 3:$bI,%$Yb襶 +M)T %q綦EX}jlTTKbI,%,_e[%V]R];N,%$%V@`%pam(}_%%۸4='u)ai.;M> \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/index.php b/assets/tools/qrcode-url/lib/index.php new file mode 100755 index 0000000..862bb19 --- /dev/null +++ b/assets/tools/qrcode-url/lib/index.php @@ -0,0 +1,95 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +die(); + echo "

PHP QR Code


"; + + //set it to writable location, a place for temp generated PNG files + $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR; + + //html PNG location prefix + $PNG_WEB_DIR = 'temp/'; + + include "qrlib.php"; + + //ofcourse we need rights to create temp dir + if (!file_exists($PNG_TEMP_DIR)) + mkdir($PNG_TEMP_DIR); + + + $filename = $PNG_TEMP_DIR.'test.png'; + + //processing form input + //remember to sanitize user input in real-life solution !!! + $errorCorrectionLevel = 'L'; + if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L','M','Q','H'))) + $errorCorrectionLevel = $_REQUEST['level']; + + $matrixPointSize = 4; + if (isset($_REQUEST['size'])) + $matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10); + + + if (isset($_REQUEST['data'])) { + + //it's very important! + if (trim($_REQUEST['data']) == '') + die('data cannot be empty! back'); + + // user data + $filename = $PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png'; + QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 2); + + } else { + + //default data + echo 'You can provide data in GET parameter: like that
'; + QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2); + + } + + //display generated file + echo '
'; + + //config form + echo '
+ Data:   + ECC:   + Size:   +

'; + + // benchmark + QRtools::timeBenchmark(); + + diff --git a/assets/tools/qrcode-url/lib/phpqrcode.php b/assets/tools/qrcode-url/lib/phpqrcode.php new file mode 100755 index 0000000..13307b6 --- /dev/null +++ b/assets/tools/qrcode-url/lib/phpqrcode.php @@ -0,0 +1,3312 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +/* + * Version: 1.1.4 + * Build: 2010100721 + */ + + + +//---- qrconst.php ----------------------------- + + + + + +/* + * PHP QR Code encoder + * + * Common constants + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + // Encoding modes + + define('QR_MODE_NUL', -1); + define('QR_MODE_NUM', 0); + define('QR_MODE_AN', 1); + define('QR_MODE_8', 2); + define('QR_MODE_KANJI', 3); + define('QR_MODE_STRUCTURE', 4); + + // Levels of error correction. + + define('QR_ECLEVEL_L', 0); + define('QR_ECLEVEL_M', 1); + define('QR_ECLEVEL_Q', 2); + define('QR_ECLEVEL_H', 3); + + // Supported output formats + + define('QR_FORMAT_TEXT', 0); + define('QR_FORMAT_PNG', 1); + + class qrstr { + public static function set(&$srctab, $x, $y, $repl, $replLen = false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + } + } + + + +//---- merged_config.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Config file, tuned-up for merged verion + */ + + define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there + define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true + define('QR_LOG_DIR', false); // default error logs dir + + define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code + define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly + define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false + + define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images + + + + +//---- qrtools.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Toolset, handy and debug utilites. + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRtools { + + //---------------------------------------------------------------------- + public static function binarize($frame) + { + $len = count($frame); + foreach ($frame as &$frameLine) { + + for($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + + return $frame; + } + + //---------------------------------------------------------------------- + public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') + { + $barcode_array = array(); + + if (!is_array($mode)) + $mode = explode(',', $mode); + + $eccLevel = 'L'; + + if (count($mode) > 1) { + $eccLevel = $mode[1]; + } + + $qrTab = QRcode::text($code, false, $eccLevel); + $size = count($qrTab); + + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach(str_split($line) as $char) + $arrAdd[] = ($char=='1')?1:0; + $barcode_array['bcode'][] = $arrAdd; + } + + return $barcode_array; + } + + //---------------------------------------------------------------------- + public static function clearCache() + { + self::$frames = array(); + } + + //---------------------------------------------------------------------- + public static function buildCache() + { + QRtools::markTime('before_build_cache'); + + $mask = new QRmask(); + for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { + $frame = QRspec::newFrame($a); + if (QR_IMAGE) { + $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; + QRimage::png(self::binarize($frame), $fileName, 1, 0); + } + + $width = count($frame); + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($maskNo=0; $maskNo<8; $maskNo++) + $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); + } + + QRtools::markTime('after_build_cache'); + } + + //---------------------------------------------------------------------- + public static function log($outfile, $err) + { + if (QR_LOG_DIR !== false) { + if ($err != '') { + if ($outfile !== false) { + file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } else { + file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } + } + } + } + + //---------------------------------------------------------------------- + public static function dumpMask($frame) + { + $width = count($frame); + for($y=0;$y<$width;$y++) { + for($x=0;$x<$width;$x++) { + echo ord($frame[$y][$x]).','; + } + } + } + + //---------------------------------------------------------------------- + public static function markTime($markerId) + { + list($usec, $sec) = explode(" ", microtime()); + $time = ((float)$usec + (float)$sec); + + if (!isset($GLOBALS['qr_time_bench'])) + $GLOBALS['qr_time_bench'] = array(); + + $GLOBALS['qr_time_bench'][$markerId] = $time; + } + + //---------------------------------------------------------------------- + public static function timeBenchmark() + { + self::markTime('finish'); + + $lastTime = 0; + $startTime = 0; + $p = 0; + + echo ' + + '; + + foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { + if ($p > 0) { + echo ''; + } else { + $startTime = $thisTime; + } + + $p++; + $lastTime = $thisTime; + } + + echo ' + + +
BENCHMARK
till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
TOTAL: '.number_format($lastTime-$startTime, 6).'s
'; + } + + } + + //########################################################################## + + QRtools::markTime('start'); + + + + +//---- qrspec.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * QR Code specifications + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QRSPEC_VERSION_MAX', 40); + define('QRSPEC_WIDTH_MAX', 177); + + define('QRCAP_WIDTH', 0); + define('QRCAP_WORDS', 1); + define('QRCAP_REMINDER', 2); + define('QRCAP_EC', 3); + + class QRspec { + + public static $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), + array( 29, 70, 7, array( 15, 26, 36, 44)), + array( 33, 100, 7, array( 20, 36, 52, 64)), + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), + array( 45, 196, 0, array( 40, 72, 108, 130)), + array( 49, 242, 0, array( 48, 88, 132, 156)), + array( 53, 292, 0, array( 60, 110, 160, 192)), + array( 57, 346, 0, array( 72, 130, 192, 224)), //10 + array( 61, 404, 0, array( 80, 150, 224, 264)), + array( 65, 466, 0, array( 96, 176, 260, 308)), + array( 69, 532, 0, array( 104, 198, 288, 352)), + array( 73, 581, 3, array( 120, 216, 320, 384)), + array( 77, 655, 3, array( 132, 240, 360, 432)), //15 + array( 81, 733, 3, array( 144, 280, 408, 480)), + array( 85, 815, 3, array( 168, 308, 448, 532)), + array( 89, 901, 3, array( 180, 338, 504, 588)), + array( 93, 991, 3, array( 196, 364, 546, 650)), + array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 + array(101, 1156, 4, array( 224, 442, 644, 750)), + array(105, 1258, 4, array( 252, 476, 690, 816)), + array(109, 1364, 4, array( 270, 504, 750, 900)), + array(113, 1474, 4, array( 300, 560, 810, 960)), + array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), + array(125, 1828, 4, array( 360, 700, 1020, 1200)), + array(129, 1921, 3, array( 390, 728, 1050, 1260)), + array(133, 2051, 3, array( 420, 784, 1140, 1350)), + array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), + array(145, 2465, 3, array( 510, 924, 1350, 1620)), + array(149, 2611, 3, array( 540, 980, 1440, 1710)), + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 + ); + + //---------------------------------------------------------------------- + public static function getDataLength($version, $level) + { + return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getECCLength($version, $level) + { + return self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getWidth($version) + { + return self::$capacity[$version][QRCAP_WIDTH]; + } + + //---------------------------------------------------------------------- + public static function getRemainder($version) + { + return self::$capacity[$version][QRCAP_REMINDER]; + } + + //---------------------------------------------------------------------- + public static function getMinimumVersion($size, $level) + { + + for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { + $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; + if($words >= $size) + return $i; + } + + return -1; + } + + //###################################################################### + + public static $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + //---------------------------------------------------------------------- + public static function lengthIndicator($mode, $version) + { + if ($mode == QR_MODE_STRUCTURE) + return 0; + + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + return self::$lengthTableBits[$mode][$l]; + } + + //---------------------------------------------------------------------- + public static function maximumWords($mode, $version) + { + if($mode == QR_MODE_STRUCTURE) + return 3; + + if($version <= 9) { + $l = 0; + } else if($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + $bits = self::$lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + + if($mode == QR_MODE_KANJI) { + $words *= 2; // the number of bytes is required + } + + return $words; + } + + // Error correction code ----------------------------------------------- + // Table of the error correction code (Reed-Solomon block) + // See Table 12-16 (pp.30-36), JIS X0510:2004. + + public static $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 + ); + + //---------------------------------------------------------------------- + // CACHEABLE!!! + + public static function getEccSpec($version, $level, array &$spec) + { + if (count($spec) < 5) { + $spec = array(0,0,0,0,0); + } + + $b1 = self::$eccTable[$version][$level][0]; + $b2 = self::$eccTable[$version][$level][1]; + $data = self::getDataLength($version, $level); + $ecc = self::getECCLength($version, $level); + + if($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + } + + // Alignment pattern --------------------------------------------------- + + // Positions of alignment patterns. + // This array includes only the second and the third position of the + // alignment patterns. Rest of them can be calculated from the distance + // between them. + + // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + + public static $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 + ); + + + /** -------------------------------------------------------------------- + * Put an alignment marker. + * @param frame + * @param width + * @param ox,oy center coordinate of the pattern + */ + public static function putAlignmentMarker(array &$frame, $ox, $oy) + { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + + $yStart = $oy-2; + $xStart = $ox-2; + + for($y=0; $y<5; $y++) { + QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function putAlignmentPattern($version, &$frame, $width) + { + if($version < 2) + return; + + $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; + if($d < 0) { + $w = 2; + } else { + $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); + } + + if($w * $w - 3 == 1) { + $x = self::$alignmentPattern[$version][0]; + $y = self::$alignmentPattern[$version][0]; + self::putAlignmentMarker($frame, $x, $y); + return; + } + + $cx = self::$alignmentPattern[$version][0]; + for($x=1; $x<$w - 1; $x++) { + self::putAlignmentMarker($frame, 6, $cx); + self::putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + + $cy = self::$alignmentPattern[$version][0]; + for($y=0; $y<$w-1; $y++) { + $cx = self::$alignmentPattern[$version][0]; + for($x=0; $x<$w-1; $x++) { + self::putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + } + + // Version information pattern ----------------------------------------- + + // Version information pattern (BCH coded). + // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + + // size: [QRSPEC_VERSION_MAX - 6] + + public static $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, + 0x27541, 0x28c69 + ); + + //---------------------------------------------------------------------- + public static function getVersionPattern($version) + { + if($version < 7 || $version > QRSPEC_VERSION_MAX) + return 0; + + return self::$versionPattern[$version -7]; + } + + // Format information -------------------------------------------------- + // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) + + public static $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) + ); + + public static function getFormatInfo($mask, $level) + { + if($mask < 0 || $mask > 7) + return 0; + + if($level < 0 || $level > 3) + return 0; + + return self::$formatInfo[$level][$mask]; + } + + // Frame --------------------------------------------------------------- + // Cache of initial frames. + + public static $frames = array(); + + /** -------------------------------------------------------------------- + * Put a finder pattern. + * @param frame + * @param width + * @param ox,oy upper-left coordinate of the pattern + */ + public static function putFinderPattern(&$frame, $ox, $oy) + { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + + for($y=0; $y<7; $y++) { + QRstr::set($frame, $ox, $oy+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function createFrame($version) + { + $width = self::$capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + + // Finder pattern + self::putFinderPattern($frame, 0, 0); + self::putFinderPattern($frame, $width - 7, 0); + self::putFinderPattern($frame, 0, $width - 7); + + // Separator + $yOffset = $width - 7; + + for($y=0; $y<7; $y++) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + $yOffset++; + } + + $setPattern = str_repeat("\xc0", 8); + + QRstr::set($frame, 0, 7, $setPattern); + QRstr::set($frame, $width-8, 7, $setPattern); + QRstr::set($frame, 0, $width - 8, $setPattern); + + // Format info + $setPattern = str_repeat("\x84", 9); + QRstr::set($frame, 0, 8, $setPattern); + QRstr::set($frame, $width - 8, 8, $setPattern, 8); + + $yOffset = $width - 8; + + for($y=0; $y<8; $y++,$yOffset++) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + + // Timing pattern + + for($i=1; $i<$width-15; $i++) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + + // Alignment pattern + self::putAlignmentPattern($version, $frame, $width); + + // Version information + if($version >= 7) { + $vinf = self::getVersionPattern($version); + + $v = $vinf; + + for($x=0; $x<6; $x++) { + for($y=0; $y<3; $y++) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + + $v = $vinf; + for($y=0; $y<6; $y++) { + for($x=0; $x<3; $x++) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + + // and a little bit... + $frame[$width - 8][8] = "\x81"; + + return $frame; + } + + //---------------------------------------------------------------------- + public static function debug($frame, $binary_mode = false) + { + if ($binary_mode) { + + foreach ($frame as &$frameLine) { + $frameLine = join('  ', explode('0', $frameLine)); + $frameLine = join('██', explode('1', $frameLine)); + } + + ?> + +


        '; + echo join("
        ", $frame); + echo '






'; + + } else { + + foreach ($frame as &$frameLine) { + $frameLine = join(' ', explode("\xc0", $frameLine)); + $frameLine = join('', explode("\xc1", $frameLine)); + $frameLine = join(' ', explode("\xa0", $frameLine)); + $frameLine = join('', explode("\xa1", $frameLine)); + $frameLine = join('', explode("\x84", $frameLine)); //format 0 + $frameLine = join('', explode("\x85", $frameLine)); //format 1 + $frameLine = join('', explode("\x81", $frameLine)); //special bit + $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 + $frameLine = join('', explode("\x91", $frameLine)); //clock 1 + $frameLine = join(' ', explode("\x88", $frameLine)); //version + $frameLine = join('', explode("\x89", $frameLine)); //version + $frameLine = join('♦', explode("\x01", $frameLine)); + $frameLine = join('⋅', explode("\0", $frameLine)); + } + + ?> + + "; + echo join("
", $frame); + echo "
"; + + } + } + + //---------------------------------------------------------------------- + public static function serial($frame) + { + return gzcompress(join("\n", $frame), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + return explode("\n", gzuncompress($code)); + } + + //---------------------------------------------------------------------- + public static function newFrame($version) + { + if($version < 1 || $version > QRSPEC_VERSION_MAX) + return null; + + if(!isset(self::$frames[$version])) { + + $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + self::$frames[$version] = self::unserial(file_get_contents($fileName)); + } else { + self::$frames[$version] = self::createFrame($version); + file_put_contents($fileName, self::serial(self::$frames[$version])); + } + } else { + self::$frames[$version] = self::createFrame($version); + } + } + + if(is_null(self::$frames[$version])) + return null; + + return self::$frames[$version]; + } + + //---------------------------------------------------------------------- + public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } + public static function rsBlockNum1($spec) { return $spec[0]; } + public static function rsDataCodes1($spec) { return $spec[1]; } + public static function rsEccCodes1($spec) { return $spec[2]; } + public static function rsBlockNum2($spec) { return $spec[3]; } + public static function rsDataCodes2($spec) { return $spec[4]; } + public static function rsEccCodes2($spec) { return $spec[2]; } + public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } + public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } + + } + + + +//---- qrimage.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Image output of code using GD2 + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QR_IMAGE', true); + + class QRimage { + + //---------------------------------------------------------------------- + public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/png"); + ImagePng($image); + } else { + if($saveandprint===TRUE){ + ImagePng($image, $filename); + header("Content-type: image/png"); + ImagePng($image); + }else{ + ImagePng($image, $filename); + } + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/jpeg"); + ImageJpeg($image, null, $q); + } else { + ImageJpeg($image, $filename, $q); + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) + { + $h = count($frame); + $w = strlen($frame[0]); + + $imgW = $w + 2*$outerFrame; + $imgH = $h + 2*$outerFrame; + + $base_image =ImageCreate($imgW, $imgH); + + $col[0] = ImageColorAllocate($base_image,255,255,255); + $col[1] = ImageColorAllocate($base_image,0,0,0); + + imagefill($base_image, 0, 0, $col[0]); + + for($y=0; $y<$h; $y++) { + for($x=0; $x<$w; $x++) { + if ($frame[$y][$x] == '1') { + ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); + } + } + } + + $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); + ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); + ImageDestroy($base_image); + + return $target_image; + } + } + + + +//---- qrinput.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Input encoding class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('STRUCTURE_HEADER_BITS', 20); + define('MAX_STRUCTURED_SYMBOLS', 16); + + class QRinputItem { + + public $mode; + public $size; + public $data; + public $bstream; + + public function __construct($mode, $size, $data, $bstream = null) + { + $setData = array_slice($data, 0, $size); + + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); + } + + if(!QRinput::check($mode, $size, $setData)) { + throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); + return null; + } + + $this->mode = $mode; + $this->size = $size; + $this->data = $setData; + $this->bstream = $bstream; + } + + //---------------------------------------------------------------------- + public function encodeModeNum($version) + { + try { + + $words = (int)($this->size / 3); + $bs = new QRbitstream(); + + $val = 0x1; + $bs->appendNum(4, $val); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; + $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; + $val += (ord($this->data[$i*3+2]) - ord('0')); + $bs->appendNum(10, $val); + } + + if($this->size - $words * 3 == 1) { + $val = ord($this->data[$words*3]) - ord('0'); + $bs->appendNum(4, $val); + } else if($this->size - $words * 3 == 2) { + $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; + $val += (ord($this->data[$words*3+1]) - ord('0')); + $bs->appendNum(7, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeAn($version) + { + try { + $words = (int)($this->size / 2); + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x02); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; + $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); + + $bs->appendNum(11, $val); + } + + if($this->size & 1) { + $val = QRinput::lookAnTable(ord($this->data[$words * 2])); + $bs->appendNum(6, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeMode8($version) + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x4); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); + + for($i=0; $i<$this->size; $i++) { + $bs->appendNum(8, ord($this->data[$i])); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeKanji($version) + { + try { + + $bs = new QRbitrtream(); + + $bs->appendNum(4, 0x8); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); + + for($i=0; $i<$this->size; $i+=2) { + $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); + if($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + + $bs->appendNum(13, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeStructure() + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x03); + $bs->appendNum(4, ord($this->data[1]) - 1); + $bs->appendNum(4, ord($this->data[0]) - 1); + $bs->appendNum(8, ord($this->data[2])); + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function estimateBitStreamSizeOfEntry($version) + { + $bits = 0; + + if($version == 0) + $version = 1; + + switch($this->mode) { + case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; + case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; + case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; + case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; + case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; + default: + return 0; + } + + $l = QRspec::lengthIndicator($this->mode, $version); + $m = 1 << $l; + $num = (int)(($this->size + $m - 1) / $m); + + $bits += $num * (4 + $l); + + return $bits; + } + + //---------------------------------------------------------------------- + public function encodeBitStream($version) + { + try { + + unset($this->bstream); + $words = QRspec::maximumWords($this->mode, $version); + + if($this->size > $words) { + + $st1 = new QRinputItem($this->mode, $words, $this->data); + $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); + + $st1->encodeBitStream($version); + $st2->encodeBitStream($version); + + $this->bstream = new QRbitstream(); + $this->bstream->append($st1->bstream); + $this->bstream->append($st2->bstream); + + unset($st1); + unset($st2); + + } else { + + $ret = 0; + + switch($this->mode) { + case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; + case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; + case QR_MODE_8: $ret = $this->encodeMode8($version); break; + case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; + case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; + + default: + break; + } + + if($ret < 0) + return -1; + } + + return $this->bstream->size(); + + } catch (Exception $e) { + return -1; + } + } + }; + + //########################################################################## + + class QRinput { + + public $items; + + private $version; + private $level; + + //---------------------------------------------------------------------- + public function __construct($version = 0, $level = QR_ECLEVEL_L) + { + if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { + throw new Exception('Invalid version no'); + return NULL; + } + + $this->version = $version; + $this->level = $level; + } + + //---------------------------------------------------------------------- + public function getVersion() + { + return $this->version; + } + + //---------------------------------------------------------------------- + public function setVersion($version) + { + if($version < 0 || $version > QRSPEC_VERSION_MAX) { + throw new Exception('Invalid version no'); + return -1; + } + + $this->version = $version; + + return 0; + } + + //---------------------------------------------------------------------- + public function getErrorCorrectionLevel() + { + return $this->level; + } + + //---------------------------------------------------------------------- + public function setErrorCorrectionLevel($level) + { + if($level > QR_ECLEVEL_H) { + throw new Exception('Invalid ECLEVEL'); + return -1; + } + + $this->level = $level; + + return 0; + } + + //---------------------------------------------------------------------- + public function appendEntry(QRinputItem $entry) + { + $this->items[] = $entry; + } + + //---------------------------------------------------------------------- + public function append($mode, $size, $data) + { + try { + $entry = new QRinputItem($mode, $size, $data); + $this->items[] = $entry; + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + + public function insertStructuredAppendHeader($size, $index, $parity) + { + if( $size > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong size'); + } + + if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong index'); + } + + $buf = array($size, $index, $parity); + + try { + $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); + array_unshift($this->items, $entry); + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function calcParity() + { + $parity = 0; + + foreach($this->items as $item) { + if($item->mode != QR_MODE_STRUCTURE) { + for($i=$item->size-1; $i>=0; $i--) { + $parity ^= $item->data[$i]; + } + } + } + + return $parity; + } + + //---------------------------------------------------------------------- + public static function checkModeNum($size, $data) + { + for($i=0; $i<$size; $i++) { + if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeNum($size) + { + $w = (int)$size / 3; + $bits = $w * 10; + + switch($size - $w * 3) { + case 1: + $bits += 4; + break; + case 2: + $bits += 7; + break; + default: + break; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + ); + + //---------------------------------------------------------------------- + public static function lookAnTable($c) + { + return (($c > 127)?-1:self::$anTable[$c]); + } + + //---------------------------------------------------------------------- + public static function checkModeAn($size, $data) + { + for($i=0; $i<$size; $i++) { + if (self::lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeAn($size) + { + $w = (int)($size / 2); + $bits = $w * 11; + + if($size & 1) { + $bits += 6; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static function estimateBitsMode8($size) + { + return $size * 8; + } + + //---------------------------------------------------------------------- + public function estimateBitsModeKanji($size) + { + return (int)(($size / 2) * 13); + } + + //---------------------------------------------------------------------- + public static function checkModeKanji($size, $data) + { + if($size & 1) + return false; + + for($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if( $val < 0x8140 + || ($val > 0x9ffc && $val < 0xe040) + || $val > 0xebbf) { + return false; + } + } + + return true; + } + + /*********************************************************************** + * Validation + **********************************************************************/ + + public static function check($mode, $size, $data) + { + if($size <= 0) + return false; + + switch($mode) { + case QR_MODE_NUM: return self::checkModeNum($size, $data); break; + case QR_MODE_AN: return self::checkModeAn($size, $data); break; + case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; + case QR_MODE_8: return true; break; + case QR_MODE_STRUCTURE: return true; break; + + default: + break; + } + + return false; + } + + + //---------------------------------------------------------------------- + public function estimateBitStreamSize($version) + { + $bits = 0; + + foreach($this->items as $item) { + $bits += $item->estimateBitStreamSizeOfEntry($version); + } + + return $bits; + } + + //---------------------------------------------------------------------- + public function estimateVersion() + { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($prev); + $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + + return $version; + } + + //---------------------------------------------------------------------- + public static function lengthOfCode($mode, $version, $bits) + { + $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NUM: + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if($remain >= 7) { + $size += 2; + } else if($remain >= 4) { + $size += 1; + } + break; + case QR_MODE_AN: + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if($remain >= 6) + $size++; + break; + case QR_MODE_8: + $size = (int)($payload / 8); + break; + case QR_MODE_KANJI: + $size = (int)(($payload / 13) * 2); + break; + case QR_MODE_STRUCTURE: + $size = (int)($payload / 8); + break; + default: + $size = 0; + break; + } + + $maxsize = QRspec::maximumWords($mode, $version); + if($size < 0) $size = 0; + if($size > $maxsize) $size = $maxsize; + + return $size; + } + + //---------------------------------------------------------------------- + public function createBitStream() + { + $total = 0; + + foreach($this->items as $item) { + $bits = $item->encodeBitStream($this->version); + + if($bits < 0) + return -1; + + $total += $bits; + } + + return $total; + } + + //---------------------------------------------------------------------- + public function convertData() + { + $ver = $this->estimateVersion(); + if($ver > $this->getVersion()) { + $this->setVersion($ver); + } + + for(;;) { + $bits = $this->createBitStream(); + + if($bits < 0) + return -1; + + $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if($ver < 0) { + throw new Exception('WRONG VERSION'); + return -1; + } else if($ver > $this->getVersion()) { + $this->setVersion($ver); + } else { + break; + } + } + + return 0; + } + + //---------------------------------------------------------------------- + public function appendPaddingBit(&$bstream) + { + $bits = $bstream->size(); + $maxwords = QRspec::getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + + if ($maxbits == $bits) { + return 0; + } + + if ($maxbits - $bits < 5) { + return $bstream->appendNum($maxbits - $bits, 0); + } + + $bits += 4; + $words = (int)(($bits + 7) / 8); + + $padding = new QRbitstream(); + $ret = $padding->appendNum($words * 8 - $bits + 4, 0); + + if($ret < 0) + return $ret; + + $padlen = $maxwords - $words; + + if($padlen > 0) { + + $padbuf = array(); + for($i=0; $i<$padlen; $i++) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + + $ret = $padding->appendBytes($padlen, $padbuf); + + if($ret < 0) + return $ret; + + } + + $ret = $bstream->append($padding); + + return $ret; + } + + //---------------------------------------------------------------------- + public function mergeBitStream() + { + if($this->convertData() < 0) { + return null; + } + + $bstream = new QRbitstream(); + + foreach($this->items as $item) { + $ret = $bstream->append($item->bstream); + if($ret < 0) { + return null; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getBitStream() + { + + $bstream = $this->mergeBitStream(); + + if($bstream == null) { + return null; + } + + $ret = $this->appendPaddingBit($bstream); + if($ret < 0) { + return null; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getByteStream() + { + $bstream = $this->getBitStream(); + if($bstream == null) { + return null; + } + + return $bstream->toByte(); + } + } + + + + + + +//---- qrbitstream.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Bitstream class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRbitstream { + + public $data = array(); + + //---------------------------------------------------------------------- + public function size() + { + return count($this->data); + } + + //---------------------------------------------------------------------- + public function allocate($setLength) + { + $this->data = array_fill(0, $setLength, 0); + return 0; + } + + //---------------------------------------------------------------------- + public static function newFromNum($bits, $num) + { + $bstream = new QRbitstream(); + $bstream->allocate($bits); + + $mask = 1 << ($bits - 1); + for($i=0; $i<$bits; $i++) { + if($num & $mask) { + $bstream->data[$i] = 1; + } else { + $bstream->data[$i] = 0; + } + $mask = $mask >> 1; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public static function newFromBytes($size, $data) + { + $bstream = new QRbitstream(); + $bstream->allocate($size * 8); + $p=0; + + for($i=0; $i<$size; $i++) { + $mask = 0x80; + for($j=0; $j<8; $j++) { + if($data[$i] & $mask) { + $bstream->data[$p] = 1; + } else { + $bstream->data[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function append(QRbitstream $arg) + { + if (is_null($arg)) { + return -1; + } + + if($arg->size() == 0) { + return 0; + } + + if($this->size() == 0) { + $this->data = $arg->data; + return 0; + } + + $this->data = array_values(array_merge($this->data, $arg->data)); + + return 0; + } + + //---------------------------------------------------------------------- + public function appendNum($bits, $num) + { + if ($bits == 0) + return 0; + + $b = QRbitstream::newFromNum($bits, $num); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function appendBytes($size, $data) + { + if ($size == 0) + return 0; + + $b = QRbitstream::newFromBytes($size, $data); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function toByte() + { + + $size = $this->size(); + + if($size == 0) { + return array(); + } + + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + + $p = 0; + + for($i=0; $i<$bytes; $i++) { + $v = 0; + for($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$i] = $v; + } + + if($size & 7) { + $v = 0; + for($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$bytes] = $v; + } + + return $data; + } + + } + + + + +//---- qrsplit.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Input splitting classes + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + class QRsplit { + + public $dataStr = ''; + public $input; + public $modeHint; + + //---------------------------------------------------------------------- + public function __construct($dataStr, $input, $modeHint) + { + $this->dataStr = $dataStr; + $this->input = $input; + $this->modeHint = $modeHint; + } + + //---------------------------------------------------------------------- + public static function isdigitat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + //---------------------------------------------------------------------- + public static function isalnumat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return (QRinput::lookAnTable(ord($str[$pos])) >= 0); + } + + //---------------------------------------------------------------------- + public function identifyMode($pos) + { + if ($pos >= strlen($this->dataStr)) + return QR_MODE_NUL; + + $c = $this->dataStr[$pos]; + + if(self::isdigitat($this->dataStr, $pos)) { + return QR_MODE_NUM; + } else if(self::isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } else if($this->modeHint == QR_MODE_KANJI) { + + if ($pos+1 < strlen($this->dataStr)) + { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KANJI; + } + } + } + + return QR_MODE_8; + } + + //---------------------------------------------------------------------- + public function eatNum() + { + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + while(self::isdigitat($this->dataStr, $p)) { + $p++; + } + + $run = $p; + $mode = $this->identifyMode($p); + + if($mode == QR_MODE_8) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + if($mode == QR_MODE_AN) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsModeAn(1) // + 4 + la + - QRinput::estimateBitsModeAn($run + 1);// - 4 - la + if($dif > 0) { + return $this->eatAn(); + } + } + + $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatAn() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + + while(self::isalnumat($this->dataStr, $p)) { + if(self::isdigitat($this->dataStr, $p)) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + + $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsModeAn($q); // - 4 - la + + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + + if(!self::isalnumat($this->dataStr, $p)) { + $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + + $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatKanji() + { + $p = 0; + + while($this->identifyMode($p) == QR_MODE_KANJI) { + $p += 2; + } + + $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eat8() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 1; + $dataStrLen = strlen($this->dataStr); + + while($p < $dataStrLen) { + + $mode = $this->identifyMode($p); + if($mode == QR_MODE_KANJI) { + break; + } + if($mode == QR_MODE_NUM) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else if($mode == QR_MODE_AN) { + $q = $p; + while(self::isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeAn($q - $p) + 4 + $la + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); + + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function splitString() + { + while (strlen($this->dataStr) > 0) + { + if($this->dataStr == '') + return 0; + + $mode = $this->identifyMode(0); + + switch ($mode) { + case QR_MODE_NUM: $length = $this->eatNum(); break; + case QR_MODE_AN: $length = $this->eatAn(); break; + case QR_MODE_KANJI: + if ($hint == QR_MODE_KANJI) + $length = $this->eatKanji(); + else $length = $this->eat8(); + break; + default: $length = $this->eat8(); break; + + } + + if($length == 0) return 0; + if($length < 0) return -1; + + $this->dataStr = substr($this->dataStr, $length); + } + } + + //---------------------------------------------------------------------- + public function toUpper() + { + $stringLen = strlen($this->dataStr); + $p = 0; + + while ($p<$stringLen) { + $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); + if($mode == QR_MODE_KANJI) { + $p += 2; + } else { + if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + + return $this->dataStr; + } + + //---------------------------------------------------------------------- + public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) + { + if(is_null($string) || $string == '\0' || $string == '') { + throw new Exception('empty string!!!'); + } + + $split = new QRsplit($string, $input, $modeHint); + + if(!$casesensitive) + $split->toUpper(); + + return $split->splitString(); + } + } + + + +//---- qrrscode.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Reed-Solomon error correction support + * + * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q + * (libfec is released under the GNU Lesser General Public License.) + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsItem { + + public $mm; // Bits per symbol + public $nn; // Symbols per block (= (1<= $this->nn) { + $x -= $this->nn; + $x = ($x >> $this->mm) + ($x & $this->nn); + } + + return $x; + } + + //---------------------------------------------------------------------- + public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + // Common code for intializing a Reed-Solomon control block (char or int symbols) + // Copyright 2004 Phil Karn, KA9Q + // May be used under the terms of the GNU Lesser General Public License (LGPL) + + $rs = null; + + // Check parameter ranges + if($symsize < 0 || $symsize > 8) return $rs; + if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; + if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; + if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! + if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding + + $rs = new QRrsItem(); + $rs->mm = $symsize; + $rs->nn = (1<<$symsize)-1; + $rs->pad = $pad; + + $rs->alpha_to = array_fill(0, $rs->nn+1, 0); + $rs->index_of = array_fill(0, $rs->nn+1, 0); + + // PHP style macro replacement ;) + $NN =& $rs->nn; + $A0 =& $NN; + + // Generate Galois field lookup tables + $rs->index_of[0] = $A0; // log(zero) = -inf + $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 + $sr = 1; + + for($i=0; $i<$rs->nn; $i++) { + $rs->index_of[$sr] = $i; + $rs->alpha_to[$i] = $sr; + $sr <<= 1; + if($sr & (1<<$symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs->nn; + } + + if($sr != 1){ + // field generator polynomial is not primitive! + $rs = NULL; + return $rs; + } + + /* Form RS code generator polynomial from its roots */ + $rs->genpoly = array_fill(0, $nroots+1, 0); + + $rs->fcr = $fcr; + $rs->prim = $prim; + $rs->nroots = $nroots; + $rs->gfpoly = $gfpoly; + + /* Find prim-th root of 1, used in decoding */ + for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) + ; // intentional empty-body loop! + + $rs->iprim = (int)($iprim / $prim); + $rs->genpoly[0] = 1; + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs->genpoly[$i+1] = 1; + + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; $j--) { + if ($rs->genpoly[$j] != 0) { + $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; + } else { + $rs->genpoly[$j] = $rs->genpoly[$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; + } + + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; $i++) + $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; + + return $rs; + } + + //---------------------------------------------------------------------- + public function encode_rs_char($data, &$parity) + { + $MM =& $this->mm; + $NN =& $this->nn; + $ALPHA_TO =& $this->alpha_to; + $INDEX_OF =& $this->index_of; + $GENPOLY =& $this->genpoly; + $NROOTS =& $this->nroots; + $FCR =& $this->fcr; + $PRIM =& $this->prim; + $IPRIM =& $this->iprim; + $PAD =& $this->pad; + $A0 =& $NN; + + $parity = array_fill(0, $NROOTS, 0); + + for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { + + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if($feedback != $A0) { + // feedback term is non-zero + + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); + + for($j=1;$j<$NROOTS;$j++) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; + } + } + + // Shift + array_shift($parity); + if($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + } + } + + //########################################################################## + + class QRrs { + + public static $items = array(); + + //---------------------------------------------------------------------- + public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + foreach(self::$items as $rs) { + if($rs->pad != $pad) continue; + if($rs->nroots != $nroots) continue; + if($rs->mm != $symsize) continue; + if($rs->gfpoly != $gfpoly) continue; + if($rs->fcr != $fcr) continue; + if($rs->prim != $prim) continue; + + return $rs; + } + + $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift(self::$items, $rs); + + return $rs; + } + } + + + +//---- qrmask.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Masking + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('N1', 3); + define('N2', 3); + define('N3', 40); + define('N4', 10); + + class QRmask { + + public $runLength = array(); + + //---------------------------------------------------------------------- + public function __construct() + { + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + } + + //---------------------------------------------------------------------- + public function writeFormatInformation($width, &$frame, $mask, $level) + { + $blacks = 0; + $format = QRspec::getFormatInfo($mask, $level); + + for($i=0; $i<8; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[8][$width - 1 - $i] = chr($v); + if($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + + for($i=0; $i<7; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[$width - 7 + $i][8] = chr($v); + if($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + + $format = $format >> 1; + } + + return $blacks; + } + + //---------------------------------------------------------------------- + public function mask0($x, $y) { return ($x+$y)&1; } + public function mask1($x, $y) { return ($y&1); } + public function mask2($x, $y) { return ($x%3); } + public function mask3($x, $y) { return ($x+$y)%3; } + public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } + public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } + public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } + public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } + + //---------------------------------------------------------------------- + private function generateMaskNo($maskNo, $width, $frame) + { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if(ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + + } + } + + return $bitMask; + } + + //---------------------------------------------------------------------- + public static function serial($bitFrame) + { + $codeArr = array(); + + foreach ($bitFrame as $line) + $codeArr[] = join('', $line); + + return gzcompress(join("\n", $codeArr), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + $codeArr = array(); + + $codeLines = explode("\n", gzuncompress($code)); + foreach ($codeLines as $line) + $codeArr[] = str_split($line); + + return $codeArr; + } + + //---------------------------------------------------------------------- + public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) + { + $b = 0; + $bitMask = array(); + + $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + $bitMask = self::unserial(file_get_contents($fileName)); + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) + mkdir(QR_CACHE_DIR.'mask_'.$maskNo); + file_put_contents($fileName, self::serial($bitMask)); + } + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + } + + if ($maskGenOnly) + return; + + $d = $s; + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + + return $b; + } + + //---------------------------------------------------------------------- + public function makeMask($width, $frame, $maskNo, $level) + { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + + return $masked; + } + + //---------------------------------------------------------------------- + public function calcN1N3($length) + { + $demerit = 0; + + for($i=0; $i<$length; $i++) { + + if($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if($i & 1) { + if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if(($this->runLength[$i-2] == $fact) && + ($this->runLength[$i-1] == $fact) && + ($this->runLength[$i+1] == $fact) && + ($this->runLength[$i+2] == $fact)) { + if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + //---------------------------------------------------------------------- + public function evaluateSymbol($width, $frame) + { + $head = 0; + $demerit = 0; + + for($y=0; $y<$width; $y++) { + $head = 0; + $this->runLength[0] = 1; + + $frameY = $frame[$y]; + + if ($y>0) + $frameYM = $frame[$y-1]; + + for($x=0; $x<$width; $x++) { + if(($x > 0) && ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + + if(($b22 | ($w22 ^ 1))&1) { + $demerit += N2; + } + } + if(($x == 0) && (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($x > 0) { + if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + for($x=0; $x<$width; $x++) { + $head = 0; + $this->runLength[0] = 1; + + for($y=0; $y<$width; $y++) { + if($y == 0 && (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($y > 0) { + if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + return $demerit; + } + + + //---------------------------------------------------------------------- + public function mask($width, $frame, $level) + { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + + $checked_masks = array(0,1,2,3,4,5,6,7); + + if (QR_FIND_FROM_RANDOM !== false) { + + $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; $i++) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + + } + + $bestMask = $frame; + + foreach($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + + if($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + + return $bestMask; + } + + //---------------------------------------------------------------------- + } + + + + +//---- qrencode.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Main encoder classes. + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsblock { + public $dataLength; + public $data = array(); + public $eccLength; + public $ecc = array(); + + public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) + { + $rs->encode_rs_char($data, $ecc); + + $this->dataLength = $dl; + $this->data = $data; + $this->eccLength = $el; + $this->ecc = $ecc; + } + }; + + //########################################################################## + + class QRrawcode { + public $version; + public $datacode = array(); + public $ecccode = array(); + public $blocks; + public $rsblocks = array(); //of RSblock + public $count; + public $dataLength; + public $eccLength; + public $b1; + + //---------------------------------------------------------------------- + public function __construct(QRinput $input) + { + $spec = array(0,0,0,0,0); + + $this->datacode = $input->getByteStream(); + if(is_null($this->datacode)) { + throw new Exception('null imput string'); + } + + QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); + + $this->version = $input->getVersion(); + $this->b1 = QRspec::rsBlockNum1($spec); + $this->dataLength = QRspec::rsDataLength($spec); + $this->eccLength = QRspec::rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = QRspec::rsBlockNum($spec); + + $ret = $this->init($spec); + if($ret < 0) { + throw new Exception('block alloc error'); + return null; + } + + $this->count = 0; + } + + //---------------------------------------------------------------------- + public function init(array $spec) + { + $dl = QRspec::rsDataCodes1($spec); + $el = QRspec::rsEccCodes1($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + if(QRspec::rsBlockNum2($spec) == 0) + return 0; + + $dl = QRspec::rsDataCodes2($spec); + $el = QRspec::rsEccCodes2($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + if($rs == NULL) return -1; + + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + return 0; + } + + //---------------------------------------------------------------------- + public function getCode() + { + $ret; + + if($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if($col >= $this->rsblocks[0]->dataLength) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]->data[$col]; + } else if($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]->ecc[$col]; + } else { + return 0; + } + $this->count++; + + return $ret; + } + } + + //########################################################################## + + class QRcode { + + public $version; + public $width; + public $data; + + //---------------------------------------------------------------------- + public function encodeMask(QRinput $input, $mask) + { + if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { + throw new Exception('wrong version'); + } + if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { + throw new Exception('wrong level'); + } + + $raw = new QRrawcode($input); + + QRtools::markTime('after_raw'); + + $version = $raw->version; + $width = QRspec::getWidth($version); + $frame = QRspec::newFrame($version); + + $filler = new FrameFiller($width, $frame); + if(is_null($filler)) { + return NULL; + } + + // inteleaved data and ecc codes + for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { + $code = $raw->getCode(); + $bit = 0x80; + for($j=0; $j<8; $j++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + + QRtools::markTime('after_filler'); + + unset($raw); + + // remainder bits + $j = QRspec::getRemainder($version); + for($i=0; $i<$j; $i++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02); + } + + $frame = $filler->frame; + unset($filler); + + + // masking + $maskObj = new QRmask(); + if($mask < 0) { + + if (QR_FIND_BEST_MASK) { + $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); + } else { + $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); + } + } else { + $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); + } + + if($masked == NULL) { + return NULL; + } + + QRtools::markTime('after_mask'); + + $this->version = $version; + $this->width = $width; + $this->data = $masked; + + return $this; + } + + //---------------------------------------------------------------------- + public function encodeInput(QRinput $input) + { + return $this->encodeMask($input, -1); + } + + //---------------------------------------------------------------------- + public function encodeString8bit($string, $version, $level) + { + if(string == NULL) { + throw new Exception('empty string!'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); + if($ret < 0) { + unset($input); + return NULL; + } + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public function encodeString($string, $version, $level, $hint, $casesensitive) + { + + if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { + throw new Exception('bad hint'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); + if($ret < 0) { + return NULL; + } + + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodePNG($text, $outfile, $saveandprint=false); + } + + //---------------------------------------------------------------------- + public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encode($text, $outfile); + } + + //---------------------------------------------------------------------- + public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodeRAW($text, $outfile); + } + } + + //########################################################################## + + class FrameFiller { + + public $width; + public $frame; + public $x; + public $y; + public $dir; + public $bit; + + //---------------------------------------------------------------------- + public function __construct($width, &$frame) + { + $this->width = $width; + $this->frame = $frame; + $this->x = $width - 1; + $this->y = $width - 1; + $this->dir = -1; + $this->bit = -1; + } + + //---------------------------------------------------------------------- + public function setFrameAt($at, $val) + { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + //---------------------------------------------------------------------- + public function getFrameAt($at) + { + return ord($this->frame[$at['y']][$at['x']]); + } + + //---------------------------------------------------------------------- + public function next() + { + do { + + if($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + + $x = $this->x; + $y = $this->y; + $w = $this->width; + + if($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + + if($this->dir < 0) { + if($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if($x == 6) { + $x--; + $y = 9; + } + } + } else { + if($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if($x == 6) { + $x--; + $y -= 8; + } + } + } + if($x < 0 || $y < 0) return null; + + $this->x = $x; + $this->y = $y; + + } while(ord($this->frame[$y][$x]) & 0x80); + + return array('x'=>$x, 'y'=>$y); + } + + } ; + + //########################################################################## + + class QRencode { + + public $casesensitive = true; + public $eightbit = false; + + public $version = 0; + public $size = 3; + public $margin = 4; + + public $structured = 0; // not supported yet + + public $level = QR_ECLEVEL_L; + public $hint = QR_MODE_8; + + //---------------------------------------------------------------------- + public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = new QRencode(); + $enc->size = $size; + $enc->margin = $margin; + + switch ($level.'') { + case '0': + case '1': + case '2': + case '3': + $enc->level = $level; + break; + case 'l': + case 'L': + $enc->level = QR_ECLEVEL_L; + break; + case 'm': + case 'M': + $enc->level = QR_ECLEVEL_M; + break; + case 'q': + case 'Q': + $enc->level = QR_ECLEVEL_Q; + break; + case 'h': + case 'H': + $enc->level = QR_ECLEVEL_H; + break; + } + + return $enc; + } + + //---------------------------------------------------------------------- + public function encodeRAW($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + return $code->data; + } + + //---------------------------------------------------------------------- + public function encode($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + QRtools::markTime('after_encode'); + + if ($outfile!== false) { + file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); + } else { + return QRtools::binarize($code->data); + } + } + + //---------------------------------------------------------------------- + public function encodePNG($intext, $outfile = false,$saveandprint=false) + { + try { + + ob_start(); + $tab = $this->encode($intext); + $err = ob_get_contents(); + ob_end_clean(); + + if ($err != '') + QRtools::log($outfile, $err); + + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); + + QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); + + } catch (Exception $e) { + + QRtools::log($outfile, $e->getMessage()); + + } + } + } + + diff --git a/assets/tools/qrcode-url/lib/qrbitstream.php b/assets/tools/qrcode-url/lib/qrbitstream.php new file mode 100755 index 0000000..7d4ec4a --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrbitstream.php @@ -0,0 +1,180 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRbitstream { + + public $data = array(); + + //---------------------------------------------------------------------- + public function size() + { + return count($this->data); + } + + //---------------------------------------------------------------------- + public function allocate($setLength) + { + $this->data = array_fill(0, $setLength, 0); + return 0; + } + + //---------------------------------------------------------------------- + public static function newFromNum($bits, $num) + { + $bstream = new QRbitstream(); + $bstream->allocate($bits); + + $mask = 1 << ($bits - 1); + for($i=0; $i<$bits; $i++) { + if($num & $mask) { + $bstream->data[$i] = 1; + } else { + $bstream->data[$i] = 0; + } + $mask = $mask >> 1; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public static function newFromBytes($size, $data) + { + $bstream = new QRbitstream(); + $bstream->allocate($size * 8); + $p=0; + + for($i=0; $i<$size; $i++) { + $mask = 0x80; + for($j=0; $j<8; $j++) { + if($data[$i] & $mask) { + $bstream->data[$p] = 1; + } else { + $bstream->data[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function append(QRbitstream $arg) + { + if (is_null($arg)) { + return -1; + } + + if($arg->size() == 0) { + return 0; + } + + if($this->size() == 0) { + $this->data = $arg->data; + return 0; + } + + $this->data = array_values(array_merge($this->data, $arg->data)); + + return 0; + } + + //---------------------------------------------------------------------- + public function appendNum($bits, $num) + { + if ($bits == 0) + return 0; + + $b = QRbitstream::newFromNum($bits, $num); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function appendBytes($size, $data) + { + if ($size == 0) + return 0; + + $b = QRbitstream::newFromBytes($size, $data); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function toByte() + { + + $size = $this->size(); + + if($size == 0) { + return array(); + } + + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + + $p = 0; + + for($i=0; $i<$bytes; $i++) { + $v = 0; + for($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$i] = $v; + } + + if($size & 7) { + $v = 0; + for($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$bytes] = $v; + } + + return $data; + } + + } diff --git a/assets/tools/qrcode-url/lib/qrconfig.php b/assets/tools/qrcode-url/lib/qrconfig.php new file mode 100755 index 0000000..e53dff8 --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrconfig.php @@ -0,0 +1,17 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + // Encoding modes + + define('QR_MODE_NUL', -1); + define('QR_MODE_NUM', 0); + define('QR_MODE_AN', 1); + define('QR_MODE_8', 2); + define('QR_MODE_KANJI', 3); + define('QR_MODE_STRUCTURE', 4); + + // Levels of error correction. + + define('QR_ECLEVEL_L', 0); + define('QR_ECLEVEL_M', 1); + define('QR_ECLEVEL_Q', 2); + define('QR_ECLEVEL_H', 3); + + // Supported output formats + + define('QR_FORMAT_TEXT', 0); + define('QR_FORMAT_PNG', 1); + + class qrstr { + public static function set(&$srctab, $x, $y, $repl, $replLen = false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + } + } \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/qrencode.php b/assets/tools/qrcode-url/lib/qrencode.php new file mode 100755 index 0000000..4b77a5b --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrencode.php @@ -0,0 +1,502 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsblock { + public $dataLength; + public $data = array(); + public $eccLength; + public $ecc = array(); + + public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) + { + $rs->encode_rs_char($data, $ecc); + + $this->dataLength = $dl; + $this->data = $data; + $this->eccLength = $el; + $this->ecc = $ecc; + } + }; + + //########################################################################## + + class QRrawcode { + public $version; + public $datacode = array(); + public $ecccode = array(); + public $blocks; + public $rsblocks = array(); //of RSblock + public $count; + public $dataLength; + public $eccLength; + public $b1; + + //---------------------------------------------------------------------- + public function __construct(QRinput $input) + { + $spec = array(0,0,0,0,0); + + $this->datacode = $input->getByteStream(); + if(is_null($this->datacode)) { + throw new Exception('null imput string'); + } + + QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); + + $this->version = $input->getVersion(); + $this->b1 = QRspec::rsBlockNum1($spec); + $this->dataLength = QRspec::rsDataLength($spec); + $this->eccLength = QRspec::rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = QRspec::rsBlockNum($spec); + + $ret = $this->init($spec); + if($ret < 0) { + throw new Exception('block alloc error'); + return null; + } + + $this->count = 0; + } + + //---------------------------------------------------------------------- + public function init(array $spec) + { + $dl = QRspec::rsDataCodes1($spec); + $el = QRspec::rsEccCodes1($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + if(QRspec::rsBlockNum2($spec) == 0) + return 0; + + $dl = QRspec::rsDataCodes2($spec); + $el = QRspec::rsEccCodes2($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + if($rs == NULL) return -1; + + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + return 0; + } + + //---------------------------------------------------------------------- + public function getCode() + { + $ret; + + if($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if($col >= $this->rsblocks[0]->dataLength) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]->data[$col]; + } else if($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]->ecc[$col]; + } else { + return 0; + } + $this->count++; + + return $ret; + } + } + + //########################################################################## + + class QRcode { + + public $version; + public $width; + public $data; + + //---------------------------------------------------------------------- + public function encodeMask(QRinput $input, $mask) + { + if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { + throw new Exception('wrong version'); + } + if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { + throw new Exception('wrong level'); + } + + $raw = new QRrawcode($input); + + QRtools::markTime('after_raw'); + + $version = $raw->version; + $width = QRspec::getWidth($version); + $frame = QRspec::newFrame($version); + + $filler = new FrameFiller($width, $frame); + if(is_null($filler)) { + return NULL; + } + + // inteleaved data and ecc codes + for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { + $code = $raw->getCode(); + $bit = 0x80; + for($j=0; $j<8; $j++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + + QRtools::markTime('after_filler'); + + unset($raw); + + // remainder bits + $j = QRspec::getRemainder($version); + for($i=0; $i<$j; $i++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02); + } + + $frame = $filler->frame; + unset($filler); + + + // masking + $maskObj = new QRmask(); + if($mask < 0) { + + if (QR_FIND_BEST_MASK) { + $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); + } else { + $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); + } + } else { + $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); + } + + if($masked == NULL) { + return NULL; + } + + QRtools::markTime('after_mask'); + + $this->version = $version; + $this->width = $width; + $this->data = $masked; + + return $this; + } + + //---------------------------------------------------------------------- + public function encodeInput(QRinput $input) + { + return $this->encodeMask($input, -1); + } + + //---------------------------------------------------------------------- + public function encodeString8bit($string, $version, $level) + { + if(string == NULL) { + throw new Exception('empty string!'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); + if($ret < 0) { + unset($input); + return NULL; + } + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public function encodeString($string, $version, $level, $hint, $casesensitive) + { + + if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { + throw new Exception('bad hint'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); + if($ret < 0) { + return NULL; + } + + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodePNG($text, $outfile, $saveandprint=false); + } + + //---------------------------------------------------------------------- + public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encode($text, $outfile); + } + + //---------------------------------------------------------------------- + public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodeRAW($text, $outfile); + } + } + + //########################################################################## + + class FrameFiller { + + public $width; + public $frame; + public $x; + public $y; + public $dir; + public $bit; + + //---------------------------------------------------------------------- + public function __construct($width, &$frame) + { + $this->width = $width; + $this->frame = $frame; + $this->x = $width - 1; + $this->y = $width - 1; + $this->dir = -1; + $this->bit = -1; + } + + //---------------------------------------------------------------------- + public function setFrameAt($at, $val) + { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + //---------------------------------------------------------------------- + public function getFrameAt($at) + { + return ord($this->frame[$at['y']][$at['x']]); + } + + //---------------------------------------------------------------------- + public function next() + { + do { + + if($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + + $x = $this->x; + $y = $this->y; + $w = $this->width; + + if($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + + if($this->dir < 0) { + if($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if($x == 6) { + $x--; + $y = 9; + } + } + } else { + if($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if($x == 6) { + $x--; + $y -= 8; + } + } + } + if($x < 0 || $y < 0) return null; + + $this->x = $x; + $this->y = $y; + + } while(ord($this->frame[$y][$x]) & 0x80); + + return array('x'=>$x, 'y'=>$y); + } + + } ; + + //########################################################################## + + class QRencode { + + public $casesensitive = true; + public $eightbit = false; + + public $version = 0; + public $size = 3; + public $margin = 4; + + public $structured = 0; // not supported yet + + public $level = QR_ECLEVEL_L; + public $hint = QR_MODE_8; + + //---------------------------------------------------------------------- + public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = new QRencode(); + $enc->size = $size; + $enc->margin = $margin; + + switch ($level.'') { + case '0': + case '1': + case '2': + case '3': + $enc->level = $level; + break; + case 'l': + case 'L': + $enc->level = QR_ECLEVEL_L; + break; + case 'm': + case 'M': + $enc->level = QR_ECLEVEL_M; + break; + case 'q': + case 'Q': + $enc->level = QR_ECLEVEL_Q; + break; + case 'h': + case 'H': + $enc->level = QR_ECLEVEL_H; + break; + } + + return $enc; + } + + //---------------------------------------------------------------------- + public function encodeRAW($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + return $code->data; + } + + //---------------------------------------------------------------------- + public function encode($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + QRtools::markTime('after_encode'); + + if ($outfile!== false) { + file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); + } else { + return QRtools::binarize($code->data); + } + } + + //---------------------------------------------------------------------- + public function encodePNG($intext, $outfile = false,$saveandprint=false) + { + try { + + ob_start(); + $tab = $this->encode($intext); + $err = ob_get_contents(); + ob_end_clean(); + + if ($err != '') + QRtools::log($outfile, $err); + + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); + + QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); + + } catch (Exception $e) { + + QRtools::log($outfile, $e->getMessage()); + + } + } + } diff --git a/assets/tools/qrcode-url/lib/qrimage.php b/assets/tools/qrcode-url/lib/qrimage.php new file mode 100755 index 0000000..10b0a6e --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrimage.php @@ -0,0 +1,95 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QR_IMAGE', true); + + class QRimage { + + //---------------------------------------------------------------------- + public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/png"); + ImagePng($image); + } else { + if($saveandprint===TRUE){ + ImagePng($image, $filename); + header("Content-type: image/png"); + ImagePng($image); + }else{ + ImagePng($image, $filename); + } + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/jpeg"); + ImageJpeg($image, null, $q); + } else { + ImageJpeg($image, $filename, $q); + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) + { + $h = count($frame); + $w = strlen($frame[0]); + + $imgW = $w + 2*$outerFrame; + $imgH = $h + 2*$outerFrame; + + $base_image =ImageCreate($imgW, $imgH); + + $col[0] = ImageColorAllocate($base_image,255,255,255); + $col[1] = ImageColorAllocate($base_image,0,0,0); + + imagefill($base_image, 0, 0, $col[0]); + + for($y=0; $y<$h; $y++) { + for($x=0; $x<$w; $x++) { + if ($frame[$y][$x] == '1') { + ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); + } + } + } + + $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); + ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); + ImageDestroy($base_image); + + return $target_image; + } + } \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/qrinput.php b/assets/tools/qrcode-url/lib/qrinput.php new file mode 100755 index 0000000..0f6d7f9 --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrinput.php @@ -0,0 +1,729 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('STRUCTURE_HEADER_BITS', 20); + define('MAX_STRUCTURED_SYMBOLS', 16); + + class QRinputItem { + + public $mode; + public $size; + public $data; + public $bstream; + + public function __construct($mode, $size, $data, $bstream = null) + { + $setData = array_slice($data, 0, $size); + + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); + } + + if(!QRinput::check($mode, $size, $setData)) { + throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); + return null; + } + + $this->mode = $mode; + $this->size = $size; + $this->data = $setData; + $this->bstream = $bstream; + } + + //---------------------------------------------------------------------- + public function encodeModeNum($version) + { + try { + + $words = (int)($this->size / 3); + $bs = new QRbitstream(); + + $val = 0x1; + $bs->appendNum(4, $val); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; + $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; + $val += (ord($this->data[$i*3+2]) - ord('0')); + $bs->appendNum(10, $val); + } + + if($this->size - $words * 3 == 1) { + $val = ord($this->data[$words*3]) - ord('0'); + $bs->appendNum(4, $val); + } else if($this->size - $words * 3 == 2) { + $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; + $val += (ord($this->data[$words*3+1]) - ord('0')); + $bs->appendNum(7, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeAn($version) + { + try { + $words = (int)($this->size / 2); + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x02); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; + $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); + + $bs->appendNum(11, $val); + } + + if($this->size & 1) { + $val = QRinput::lookAnTable(ord($this->data[$words * 2])); + $bs->appendNum(6, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeMode8($version) + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x4); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); + + for($i=0; $i<$this->size; $i++) { + $bs->appendNum(8, ord($this->data[$i])); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeKanji($version) + { + try { + + $bs = new QRbitrtream(); + + $bs->appendNum(4, 0x8); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); + + for($i=0; $i<$this->size; $i+=2) { + $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); + if($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + + $bs->appendNum(13, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeStructure() + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x03); + $bs->appendNum(4, ord($this->data[1]) - 1); + $bs->appendNum(4, ord($this->data[0]) - 1); + $bs->appendNum(8, ord($this->data[2])); + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function estimateBitStreamSizeOfEntry($version) + { + $bits = 0; + + if($version == 0) + $version = 1; + + switch($this->mode) { + case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; + case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; + case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; + case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; + case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; + default: + return 0; + } + + $l = QRspec::lengthIndicator($this->mode, $version); + $m = 1 << $l; + $num = (int)(($this->size + $m - 1) / $m); + + $bits += $num * (4 + $l); + + return $bits; + } + + //---------------------------------------------------------------------- + public function encodeBitStream($version) + { + try { + + unset($this->bstream); + $words = QRspec::maximumWords($this->mode, $version); + + if($this->size > $words) { + + $st1 = new QRinputItem($this->mode, $words, $this->data); + $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); + + $st1->encodeBitStream($version); + $st2->encodeBitStream($version); + + $this->bstream = new QRbitstream(); + $this->bstream->append($st1->bstream); + $this->bstream->append($st2->bstream); + + unset($st1); + unset($st2); + + } else { + + $ret = 0; + + switch($this->mode) { + case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; + case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; + case QR_MODE_8: $ret = $this->encodeMode8($version); break; + case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; + case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; + + default: + break; + } + + if($ret < 0) + return -1; + } + + return $this->bstream->size(); + + } catch (Exception $e) { + return -1; + } + } + }; + + //########################################################################## + + class QRinput { + + public $items; + + private $version; + private $level; + + //---------------------------------------------------------------------- + public function __construct($version = 0, $level = QR_ECLEVEL_L) + { + if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { + throw new Exception('Invalid version no'); + return NULL; + } + + $this->version = $version; + $this->level = $level; + } + + //---------------------------------------------------------------------- + public function getVersion() + { + return $this->version; + } + + //---------------------------------------------------------------------- + public function setVersion($version) + { + if($version < 0 || $version > QRSPEC_VERSION_MAX) { + throw new Exception('Invalid version no'); + return -1; + } + + $this->version = $version; + + return 0; + } + + //---------------------------------------------------------------------- + public function getErrorCorrectionLevel() + { + return $this->level; + } + + //---------------------------------------------------------------------- + public function setErrorCorrectionLevel($level) + { + if($level > QR_ECLEVEL_H) { + throw new Exception('Invalid ECLEVEL'); + return -1; + } + + $this->level = $level; + + return 0; + } + + //---------------------------------------------------------------------- + public function appendEntry(QRinputItem $entry) + { + $this->items[] = $entry; + } + + //---------------------------------------------------------------------- + public function append($mode, $size, $data) + { + try { + $entry = new QRinputItem($mode, $size, $data); + $this->items[] = $entry; + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + + public function insertStructuredAppendHeader($size, $index, $parity) + { + if( $size > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong size'); + } + + if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong index'); + } + + $buf = array($size, $index, $parity); + + try { + $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); + array_unshift($this->items, $entry); + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function calcParity() + { + $parity = 0; + + foreach($this->items as $item) { + if($item->mode != QR_MODE_STRUCTURE) { + for($i=$item->size-1; $i>=0; $i--) { + $parity ^= $item->data[$i]; + } + } + } + + return $parity; + } + + //---------------------------------------------------------------------- + public static function checkModeNum($size, $data) + { + for($i=0; $i<$size; $i++) { + if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeNum($size) + { + $w = (int)$size / 3; + $bits = $w * 10; + + switch($size - $w * 3) { + case 1: + $bits += 4; + break; + case 2: + $bits += 7; + break; + default: + break; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + ); + + //---------------------------------------------------------------------- + public static function lookAnTable($c) + { + return (($c > 127)?-1:self::$anTable[$c]); + } + + //---------------------------------------------------------------------- + public static function checkModeAn($size, $data) + { + for($i=0; $i<$size; $i++) { + if (self::lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeAn($size) + { + $w = (int)($size / 2); + $bits = $w * 11; + + if($size & 1) { + $bits += 6; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static function estimateBitsMode8($size) + { + return $size * 8; + } + + //---------------------------------------------------------------------- + public function estimateBitsModeKanji($size) + { + return (int)(($size / 2) * 13); + } + + //---------------------------------------------------------------------- + public static function checkModeKanji($size, $data) + { + if($size & 1) + return false; + + for($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if( $val < 0x8140 + || ($val > 0x9ffc && $val < 0xe040) + || $val > 0xebbf) { + return false; + } + } + + return true; + } + + /*********************************************************************** + * Validation + **********************************************************************/ + + public static function check($mode, $size, $data) + { + if($size <= 0) + return false; + + switch($mode) { + case QR_MODE_NUM: return self::checkModeNum($size, $data); break; + case QR_MODE_AN: return self::checkModeAn($size, $data); break; + case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; + case QR_MODE_8: return true; break; + case QR_MODE_STRUCTURE: return true; break; + + default: + break; + } + + return false; + } + + + //---------------------------------------------------------------------- + public function estimateBitStreamSize($version) + { + $bits = 0; + + foreach($this->items as $item) { + $bits += $item->estimateBitStreamSizeOfEntry($version); + } + + return $bits; + } + + //---------------------------------------------------------------------- + public function estimateVersion() + { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($prev); + $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + + return $version; + } + + //---------------------------------------------------------------------- + public static function lengthOfCode($mode, $version, $bits) + { + $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NUM: + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if($remain >= 7) { + $size += 2; + } else if($remain >= 4) { + $size += 1; + } + break; + case QR_MODE_AN: + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if($remain >= 6) + $size++; + break; + case QR_MODE_8: + $size = (int)($payload / 8); + break; + case QR_MODE_KANJI: + $size = (int)(($payload / 13) * 2); + break; + case QR_MODE_STRUCTURE: + $size = (int)($payload / 8); + break; + default: + $size = 0; + break; + } + + $maxsize = QRspec::maximumWords($mode, $version); + if($size < 0) $size = 0; + if($size > $maxsize) $size = $maxsize; + + return $size; + } + + //---------------------------------------------------------------------- + public function createBitStream() + { + $total = 0; + + foreach($this->items as $item) { + $bits = $item->encodeBitStream($this->version); + + if($bits < 0) + return -1; + + $total += $bits; + } + + return $total; + } + + //---------------------------------------------------------------------- + public function convertData() + { + $ver = $this->estimateVersion(); + if($ver > $this->getVersion()) { + $this->setVersion($ver); + } + + for(;;) { + $bits = $this->createBitStream(); + + if($bits < 0) + return -1; + + $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if($ver < 0) { + throw new Exception('WRONG VERSION'); + return -1; + } else if($ver > $this->getVersion()) { + $this->setVersion($ver); + } else { + break; + } + } + + return 0; + } + + //---------------------------------------------------------------------- + public function appendPaddingBit(&$bstream) + { + $bits = $bstream->size(); + $maxwords = QRspec::getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + + if ($maxbits == $bits) { + return 0; + } + + if ($maxbits - $bits < 5) { + return $bstream->appendNum($maxbits - $bits, 0); + } + + $bits += 4; + $words = (int)(($bits + 7) / 8); + + $padding = new QRbitstream(); + $ret = $padding->appendNum($words * 8 - $bits + 4, 0); + + if($ret < 0) + return $ret; + + $padlen = $maxwords - $words; + + if($padlen > 0) { + + $padbuf = array(); + for($i=0; $i<$padlen; $i++) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + + $ret = $padding->appendBytes($padlen, $padbuf); + + if($ret < 0) + return $ret; + + } + + $ret = $bstream->append($padding); + + return $ret; + } + + //---------------------------------------------------------------------- + public function mergeBitStream() + { + if($this->convertData() < 0) { + return null; + } + + $bstream = new QRbitstream(); + + foreach($this->items as $item) { + $ret = $bstream->append($item->bstream); + if($ret < 0) { + return null; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getBitStream() + { + + $bstream = $this->mergeBitStream(); + + if($bstream == null) { + return null; + } + + $ret = $this->appendPaddingBit($bstream); + if($ret < 0) { + return null; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getByteStream() + { + $bstream = $this->getBitStream(); + if($bstream == null) { + return null; + } + + return $bstream->toByte(); + } + } + + + \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/qrlib.php b/assets/tools/qrcode-url/lib/qrlib.php new file mode 100755 index 0000000..d55c4af --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrlib.php @@ -0,0 +1,43 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; + + // Required libs + + include $QR_BASEDIR."qrconst.php"; + include $QR_BASEDIR."qrconfig.php"; + include $QR_BASEDIR."qrtools.php"; + include $QR_BASEDIR."qrspec.php"; + include $QR_BASEDIR."qrimage.php"; + include $QR_BASEDIR."qrinput.php"; + include $QR_BASEDIR."qrbitstream.php"; + include $QR_BASEDIR."qrsplit.php"; + include $QR_BASEDIR."qrrscode.php"; + include $QR_BASEDIR."qrmask.php"; + include $QR_BASEDIR."qrencode.php"; + diff --git a/assets/tools/qrcode-url/lib/qrmask.php b/assets/tools/qrcode-url/lib/qrmask.php new file mode 100755 index 0000000..b14d7ae --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrmask.php @@ -0,0 +1,328 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('N1', 3); + define('N2', 3); + define('N3', 40); + define('N4', 10); + + class QRmask { + + public $runLength = array(); + + //---------------------------------------------------------------------- + public function __construct() + { + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + } + + //---------------------------------------------------------------------- + public function writeFormatInformation($width, &$frame, $mask, $level) + { + $blacks = 0; + $format = QRspec::getFormatInfo($mask, $level); + + for($i=0; $i<8; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[8][$width - 1 - $i] = chr($v); + if($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + + for($i=0; $i<7; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[$width - 7 + $i][8] = chr($v); + if($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + + $format = $format >> 1; + } + + return $blacks; + } + + //---------------------------------------------------------------------- + public function mask0($x, $y) { return ($x+$y)&1; } + public function mask1($x, $y) { return ($y&1); } + public function mask2($x, $y) { return ($x%3); } + public function mask3($x, $y) { return ($x+$y)%3; } + public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } + public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } + public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } + public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } + + //---------------------------------------------------------------------- + private function generateMaskNo($maskNo, $width, $frame) + { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if(ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + + } + } + + return $bitMask; + } + + //---------------------------------------------------------------------- + public static function serial($bitFrame) + { + $codeArr = array(); + + foreach ($bitFrame as $line) + $codeArr[] = join('', $line); + + return gzcompress(join("\n", $codeArr), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + $codeArr = array(); + + $codeLines = explode("\n", gzuncompress($code)); + foreach ($codeLines as $line) + $codeArr[] = str_split($line); + + return $codeArr; + } + + //---------------------------------------------------------------------- + public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) + { + $b = 0; + $bitMask = array(); + + $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + $bitMask = self::unserial(file_get_contents($fileName)); + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) + mkdir(QR_CACHE_DIR.'mask_'.$maskNo); + file_put_contents($fileName, self::serial($bitMask)); + } + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + } + + if ($maskGenOnly) + return; + + $d = $s; + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + + return $b; + } + + //---------------------------------------------------------------------- + public function makeMask($width, $frame, $maskNo, $level) + { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + + return $masked; + } + + //---------------------------------------------------------------------- + public function calcN1N3($length) + { + $demerit = 0; + + for($i=0; $i<$length; $i++) { + + if($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if($i & 1) { + if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if(($this->runLength[$i-2] == $fact) && + ($this->runLength[$i-1] == $fact) && + ($this->runLength[$i+1] == $fact) && + ($this->runLength[$i+2] == $fact)) { + if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + //---------------------------------------------------------------------- + public function evaluateSymbol($width, $frame) + { + $head = 0; + $demerit = 0; + + for($y=0; $y<$width; $y++) { + $head = 0; + $this->runLength[0] = 1; + + $frameY = $frame[$y]; + + if ($y>0) + $frameYM = $frame[$y-1]; + + for($x=0; $x<$width; $x++) { + if(($x > 0) && ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + + if(($b22 | ($w22 ^ 1))&1) { + $demerit += N2; + } + } + if(($x == 0) && (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($x > 0) { + if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + for($x=0; $x<$width; $x++) { + $head = 0; + $this->runLength[0] = 1; + + for($y=0; $y<$width; $y++) { + if($y == 0 && (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($y > 0) { + if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + return $demerit; + } + + + //---------------------------------------------------------------------- + public function mask($width, $frame, $level) + { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + + $checked_masks = array(0,1,2,3,4,5,6,7); + + if (QR_FIND_FROM_RANDOM !== false) { + + $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; $i++) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + + } + + $bestMask = $frame; + + foreach($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + + if($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + + return $bestMask; + } + + //---------------------------------------------------------------------- + } diff --git a/assets/tools/qrcode-url/lib/qrrscode.php b/assets/tools/qrcode-url/lib/qrrscode.php new file mode 100755 index 0000000..591129a --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrrscode.php @@ -0,0 +1,210 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsItem { + + public $mm; // Bits per symbol + public $nn; // Symbols per block (= (1<= $this->nn) { + $x -= $this->nn; + $x = ($x >> $this->mm) + ($x & $this->nn); + } + + return $x; + } + + //---------------------------------------------------------------------- + public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + // Common code for intializing a Reed-Solomon control block (char or int symbols) + // Copyright 2004 Phil Karn, KA9Q + // May be used under the terms of the GNU Lesser General Public License (LGPL) + + $rs = null; + + // Check parameter ranges + if($symsize < 0 || $symsize > 8) return $rs; + if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; + if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; + if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! + if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding + + $rs = new QRrsItem(); + $rs->mm = $symsize; + $rs->nn = (1<<$symsize)-1; + $rs->pad = $pad; + + $rs->alpha_to = array_fill(0, $rs->nn+1, 0); + $rs->index_of = array_fill(0, $rs->nn+1, 0); + + // PHP style macro replacement ;) + $NN =& $rs->nn; + $A0 =& $NN; + + // Generate Galois field lookup tables + $rs->index_of[0] = $A0; // log(zero) = -inf + $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 + $sr = 1; + + for($i=0; $i<$rs->nn; $i++) { + $rs->index_of[$sr] = $i; + $rs->alpha_to[$i] = $sr; + $sr <<= 1; + if($sr & (1<<$symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs->nn; + } + + if($sr != 1){ + // field generator polynomial is not primitive! + $rs = NULL; + return $rs; + } + + /* Form RS code generator polynomial from its roots */ + $rs->genpoly = array_fill(0, $nroots+1, 0); + + $rs->fcr = $fcr; + $rs->prim = $prim; + $rs->nroots = $nroots; + $rs->gfpoly = $gfpoly; + + /* Find prim-th root of 1, used in decoding */ + for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) + ; // intentional empty-body loop! + + $rs->iprim = (int)($iprim / $prim); + $rs->genpoly[0] = 1; + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs->genpoly[$i+1] = 1; + + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; $j--) { + if ($rs->genpoly[$j] != 0) { + $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; + } else { + $rs->genpoly[$j] = $rs->genpoly[$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; + } + + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; $i++) + $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; + + return $rs; + } + + //---------------------------------------------------------------------- + public function encode_rs_char($data, &$parity) + { + $MM =& $this->mm; + $NN =& $this->nn; + $ALPHA_TO =& $this->alpha_to; + $INDEX_OF =& $this->index_of; + $GENPOLY =& $this->genpoly; + $NROOTS =& $this->nroots; + $FCR =& $this->fcr; + $PRIM =& $this->prim; + $IPRIM =& $this->iprim; + $PAD =& $this->pad; + $A0 =& $NN; + + $parity = array_fill(0, $NROOTS, 0); + + for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { + + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if($feedback != $A0) { + // feedback term is non-zero + + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); + + for($j=1;$j<$NROOTS;$j++) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; + } + } + + // Shift + array_shift($parity); + if($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + } + } + + //########################################################################## + + class QRrs { + + public static $items = array(); + + //---------------------------------------------------------------------- + public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + foreach(self::$items as $rs) { + if($rs->pad != $pad) continue; + if($rs->nroots != $nroots) continue; + if($rs->mm != $symsize) continue; + if($rs->gfpoly != $gfpoly) continue; + if($rs->fcr != $fcr) continue; + if($rs->prim != $prim) continue; + + return $rs; + } + + $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift(self::$items, $rs); + + return $rs; + } + } \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/qrspec.php b/assets/tools/qrcode-url/lib/qrspec.php new file mode 100755 index 0000000..92aea0c --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrspec.php @@ -0,0 +1,592 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QRSPEC_VERSION_MAX', 40); + define('QRSPEC_WIDTH_MAX', 177); + + define('QRCAP_WIDTH', 0); + define('QRCAP_WORDS', 1); + define('QRCAP_REMINDER', 2); + define('QRCAP_EC', 3); + + class QRspec { + + public static $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), + array( 29, 70, 7, array( 15, 26, 36, 44)), + array( 33, 100, 7, array( 20, 36, 52, 64)), + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), + array( 45, 196, 0, array( 40, 72, 108, 130)), + array( 49, 242, 0, array( 48, 88, 132, 156)), + array( 53, 292, 0, array( 60, 110, 160, 192)), + array( 57, 346, 0, array( 72, 130, 192, 224)), //10 + array( 61, 404, 0, array( 80, 150, 224, 264)), + array( 65, 466, 0, array( 96, 176, 260, 308)), + array( 69, 532, 0, array( 104, 198, 288, 352)), + array( 73, 581, 3, array( 120, 216, 320, 384)), + array( 77, 655, 3, array( 132, 240, 360, 432)), //15 + array( 81, 733, 3, array( 144, 280, 408, 480)), + array( 85, 815, 3, array( 168, 308, 448, 532)), + array( 89, 901, 3, array( 180, 338, 504, 588)), + array( 93, 991, 3, array( 196, 364, 546, 650)), + array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 + array(101, 1156, 4, array( 224, 442, 644, 750)), + array(105, 1258, 4, array( 252, 476, 690, 816)), + array(109, 1364, 4, array( 270, 504, 750, 900)), + array(113, 1474, 4, array( 300, 560, 810, 960)), + array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), + array(125, 1828, 4, array( 360, 700, 1020, 1200)), + array(129, 1921, 3, array( 390, 728, 1050, 1260)), + array(133, 2051, 3, array( 420, 784, 1140, 1350)), + array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), + array(145, 2465, 3, array( 510, 924, 1350, 1620)), + array(149, 2611, 3, array( 540, 980, 1440, 1710)), + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 + ); + + //---------------------------------------------------------------------- + public static function getDataLength($version, $level) + { + return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getECCLength($version, $level) + { + return self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getWidth($version) + { + return self::$capacity[$version][QRCAP_WIDTH]; + } + + //---------------------------------------------------------------------- + public static function getRemainder($version) + { + return self::$capacity[$version][QRCAP_REMINDER]; + } + + //---------------------------------------------------------------------- + public static function getMinimumVersion($size, $level) + { + + for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { + $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; + if($words >= $size) + return $i; + } + + return -1; + } + + //###################################################################### + + public static $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + //---------------------------------------------------------------------- + public static function lengthIndicator($mode, $version) + { + if ($mode == QR_MODE_STRUCTURE) + return 0; + + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + return self::$lengthTableBits[$mode][$l]; + } + + //---------------------------------------------------------------------- + public static function maximumWords($mode, $version) + { + if($mode == QR_MODE_STRUCTURE) + return 3; + + if($version <= 9) { + $l = 0; + } else if($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + $bits = self::$lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + + if($mode == QR_MODE_KANJI) { + $words *= 2; // the number of bytes is required + } + + return $words; + } + + // Error correction code ----------------------------------------------- + // Table of the error correction code (Reed-Solomon block) + // See Table 12-16 (pp.30-36), JIS X0510:2004. + + public static $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 + ); + + //---------------------------------------------------------------------- + // CACHEABLE!!! + + public static function getEccSpec($version, $level, array &$spec) + { + if (count($spec) < 5) { + $spec = array(0,0,0,0,0); + } + + $b1 = self::$eccTable[$version][$level][0]; + $b2 = self::$eccTable[$version][$level][1]; + $data = self::getDataLength($version, $level); + $ecc = self::getECCLength($version, $level); + + if($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + } + + // Alignment pattern --------------------------------------------------- + + // Positions of alignment patterns. + // This array includes only the second and the third position of the + // alignment patterns. Rest of them can be calculated from the distance + // between them. + + // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + + public static $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 + ); + + + /** -------------------------------------------------------------------- + * Put an alignment marker. + * @param frame + * @param width + * @param ox,oy center coordinate of the pattern + */ + public static function putAlignmentMarker(array &$frame, $ox, $oy) + { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + + $yStart = $oy-2; + $xStart = $ox-2; + + for($y=0; $y<5; $y++) { + QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function putAlignmentPattern($version, &$frame, $width) + { + if($version < 2) + return; + + $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; + if($d < 0) { + $w = 2; + } else { + $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); + } + + if($w * $w - 3 == 1) { + $x = self::$alignmentPattern[$version][0]; + $y = self::$alignmentPattern[$version][0]; + self::putAlignmentMarker($frame, $x, $y); + return; + } + + $cx = self::$alignmentPattern[$version][0]; + for($x=1; $x<$w - 1; $x++) { + self::putAlignmentMarker($frame, 6, $cx); + self::putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + + $cy = self::$alignmentPattern[$version][0]; + for($y=0; $y<$w-1; $y++) { + $cx = self::$alignmentPattern[$version][0]; + for($x=0; $x<$w-1; $x++) { + self::putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + } + + // Version information pattern ----------------------------------------- + + // Version information pattern (BCH coded). + // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + + // size: [QRSPEC_VERSION_MAX - 6] + + public static $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, + 0x27541, 0x28c69 + ); + + //---------------------------------------------------------------------- + public static function getVersionPattern($version) + { + if($version < 7 || $version > QRSPEC_VERSION_MAX) + return 0; + + return self::$versionPattern[$version -7]; + } + + // Format information -------------------------------------------------- + // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) + + public static $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) + ); + + public static function getFormatInfo($mask, $level) + { + if($mask < 0 || $mask > 7) + return 0; + + if($level < 0 || $level > 3) + return 0; + + return self::$formatInfo[$level][$mask]; + } + + // Frame --------------------------------------------------------------- + // Cache of initial frames. + + public static $frames = array(); + + /** -------------------------------------------------------------------- + * Put a finder pattern. + * @param frame + * @param width + * @param ox,oy upper-left coordinate of the pattern + */ + public static function putFinderPattern(&$frame, $ox, $oy) + { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + + for($y=0; $y<7; $y++) { + QRstr::set($frame, $ox, $oy+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function createFrame($version) + { + $width = self::$capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + + // Finder pattern + self::putFinderPattern($frame, 0, 0); + self::putFinderPattern($frame, $width - 7, 0); + self::putFinderPattern($frame, 0, $width - 7); + + // Separator + $yOffset = $width - 7; + + for($y=0; $y<7; $y++) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + $yOffset++; + } + + $setPattern = str_repeat("\xc0", 8); + + QRstr::set($frame, 0, 7, $setPattern); + QRstr::set($frame, $width-8, 7, $setPattern); + QRstr::set($frame, 0, $width - 8, $setPattern); + + // Format info + $setPattern = str_repeat("\x84", 9); + QRstr::set($frame, 0, 8, $setPattern); + QRstr::set($frame, $width - 8, 8, $setPattern, 8); + + $yOffset = $width - 8; + + for($y=0; $y<8; $y++,$yOffset++) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + + // Timing pattern + + for($i=1; $i<$width-15; $i++) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + + // Alignment pattern + self::putAlignmentPattern($version, $frame, $width); + + // Version information + if($version >= 7) { + $vinf = self::getVersionPattern($version); + + $v = $vinf; + + for($x=0; $x<6; $x++) { + for($y=0; $y<3; $y++) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + + $v = $vinf; + for($y=0; $y<6; $y++) { + for($x=0; $x<3; $x++) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + + // and a little bit... + $frame[$width - 8][8] = "\x81"; + + return $frame; + } + + //---------------------------------------------------------------------- + public static function debug($frame, $binary_mode = false) + { + if ($binary_mode) { + + foreach ($frame as &$frameLine) { + $frameLine = join('  ', explode('0', $frameLine)); + $frameLine = join('██', explode('1', $frameLine)); + } + + ?> + +


        '; + echo join("
        ", $frame); + echo '






'; + + } else { + + foreach ($frame as &$frameLine) { + $frameLine = join(' ', explode("\xc0", $frameLine)); + $frameLine = join('', explode("\xc1", $frameLine)); + $frameLine = join(' ', explode("\xa0", $frameLine)); + $frameLine = join('', explode("\xa1", $frameLine)); + $frameLine = join('', explode("\x84", $frameLine)); //format 0 + $frameLine = join('', explode("\x85", $frameLine)); //format 1 + $frameLine = join('', explode("\x81", $frameLine)); //special bit + $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 + $frameLine = join('', explode("\x91", $frameLine)); //clock 1 + $frameLine = join(' ', explode("\x88", $frameLine)); //version + $frameLine = join('', explode("\x89", $frameLine)); //version + $frameLine = join('♦', explode("\x01", $frameLine)); + $frameLine = join('⋅', explode("\0", $frameLine)); + } + + ?> + + "; + echo join("
", $frame); + echo "
"; + + } + } + + //---------------------------------------------------------------------- + public static function serial($frame) + { + return gzcompress(join("\n", $frame), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + return explode("\n", gzuncompress($code)); + } + + //---------------------------------------------------------------------- + public static function newFrame($version) + { + if($version < 1 || $version > QRSPEC_VERSION_MAX) + return null; + + if(!isset(self::$frames[$version])) { + + $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + self::$frames[$version] = self::unserial(file_get_contents($fileName)); + } else { + self::$frames[$version] = self::createFrame($version); + file_put_contents($fileName, self::serial(self::$frames[$version])); + } + } else { + self::$frames[$version] = self::createFrame($version); + } + } + + if(is_null(self::$frames[$version])) + return null; + + return self::$frames[$version]; + } + + //---------------------------------------------------------------------- + public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } + public static function rsBlockNum1($spec) { return $spec[0]; } + public static function rsDataCodes1($spec) { return $spec[1]; } + public static function rsEccCodes1($spec) { return $spec[2]; } + public static function rsBlockNum2($spec) { return $spec[3]; } + public static function rsDataCodes2($spec) { return $spec[4]; } + public static function rsEccCodes2($spec) { return $spec[2]; } + public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } + public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } + + } \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/qrsplit.php b/assets/tools/qrcode-url/lib/qrsplit.php new file mode 100755 index 0000000..d75b827 --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrsplit.php @@ -0,0 +1,311 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + class QRsplit { + + public $dataStr = ''; + public $input; + public $modeHint; + + //---------------------------------------------------------------------- + public function __construct($dataStr, $input, $modeHint) + { + $this->dataStr = $dataStr; + $this->input = $input; + $this->modeHint = $modeHint; + } + + //---------------------------------------------------------------------- + public static function isdigitat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + //---------------------------------------------------------------------- + public static function isalnumat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return (QRinput::lookAnTable(ord($str[$pos])) >= 0); + } + + //---------------------------------------------------------------------- + public function identifyMode($pos) + { + if ($pos >= strlen($this->dataStr)) + return QR_MODE_NUL; + + $c = $this->dataStr[$pos]; + + if(self::isdigitat($this->dataStr, $pos)) { + return QR_MODE_NUM; + } else if(self::isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } else if($this->modeHint == QR_MODE_KANJI) { + + if ($pos+1 < strlen($this->dataStr)) + { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KANJI; + } + } + } + + return QR_MODE_8; + } + + //---------------------------------------------------------------------- + public function eatNum() + { + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + while(self::isdigitat($this->dataStr, $p)) { + $p++; + } + + $run = $p; + $mode = $this->identifyMode($p); + + if($mode == QR_MODE_8) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + if($mode == QR_MODE_AN) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsModeAn(1) // + 4 + la + - QRinput::estimateBitsModeAn($run + 1);// - 4 - la + if($dif > 0) { + return $this->eatAn(); + } + } + + $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatAn() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + + while(self::isalnumat($this->dataStr, $p)) { + if(self::isdigitat($this->dataStr, $p)) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + + $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsModeAn($q); // - 4 - la + + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + + if(!self::isalnumat($this->dataStr, $p)) { + $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + + $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatKanji() + { + $p = 0; + + while($this->identifyMode($p) == QR_MODE_KANJI) { + $p += 2; + } + + $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eat8() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 1; + $dataStrLen = strlen($this->dataStr); + + while($p < $dataStrLen) { + + $mode = $this->identifyMode($p); + if($mode == QR_MODE_KANJI) { + break; + } + if($mode == QR_MODE_NUM) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else if($mode == QR_MODE_AN) { + $q = $p; + while(self::isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeAn($q - $p) + 4 + $la + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); + + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function splitString() + { + while (strlen($this->dataStr) > 0) + { + if($this->dataStr == '') + return 0; + + $mode = $this->identifyMode(0); + + switch ($mode) { + case QR_MODE_NUM: $length = $this->eatNum(); break; + case QR_MODE_AN: $length = $this->eatAn(); break; + case QR_MODE_KANJI: + if ($hint == QR_MODE_KANJI) + $length = $this->eatKanji(); + else $length = $this->eat8(); + break; + default: $length = $this->eat8(); break; + + } + + if($length == 0) return 0; + if($length < 0) return -1; + + $this->dataStr = substr($this->dataStr, $length); + } + } + + //---------------------------------------------------------------------- + public function toUpper() + { + $stringLen = strlen($this->dataStr); + $p = 0; + + while ($p<$stringLen) { + $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); + if($mode == QR_MODE_KANJI) { + $p += 2; + } else { + if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + + return $this->dataStr; + } + + //---------------------------------------------------------------------- + public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) + { + if(is_null($string) || $string == '\0' || $string == '') { + throw new Exception('empty string!!!'); + } + + $split = new QRsplit($string, $input, $modeHint); + + if(!$casesensitive) + $split->toUpper(); + + return $split->splitString(); + } + } \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/qrtools.php b/assets/tools/qrcode-url/lib/qrtools.php new file mode 100755 index 0000000..3012db4 --- /dev/null +++ b/assets/tools/qrcode-url/lib/qrtools.php @@ -0,0 +1,172 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRtools { + + //---------------------------------------------------------------------- + public static function binarize($frame) + { + $len = count($frame); + foreach ($frame as &$frameLine) { + + for($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + + return $frame; + } + + //---------------------------------------------------------------------- + public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') + { + $barcode_array = array(); + + if (!is_array($mode)) + $mode = explode(',', $mode); + + $eccLevel = 'L'; + + if (count($mode) > 1) { + $eccLevel = $mode[1]; + } + + $qrTab = QRcode::text($code, false, $eccLevel); + $size = count($qrTab); + + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach(str_split($line) as $char) + $arrAdd[] = ($char=='1')?1:0; + $barcode_array['bcode'][] = $arrAdd; + } + + return $barcode_array; + } + + //---------------------------------------------------------------------- + public static function clearCache() + { + self::$frames = array(); + } + + //---------------------------------------------------------------------- + public static function buildCache() + { + QRtools::markTime('before_build_cache'); + + $mask = new QRmask(); + for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { + $frame = QRspec::newFrame($a); + if (QR_IMAGE) { + $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; + QRimage::png(self::binarize($frame), $fileName, 1, 0); + } + + $width = count($frame); + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($maskNo=0; $maskNo<8; $maskNo++) + $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); + } + + QRtools::markTime('after_build_cache'); + } + + //---------------------------------------------------------------------- + public static function log($outfile, $err) + { + if (QR_LOG_DIR !== false) { + if ($err != '') { + if ($outfile !== false) { + file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } else { + file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } + } + } + } + + //---------------------------------------------------------------------- + public static function dumpMask($frame) + { + $width = count($frame); + for($y=0;$y<$width;$y++) { + for($x=0;$x<$width;$x++) { + echo ord($frame[$y][$x]).','; + } + } + } + + //---------------------------------------------------------------------- + public static function markTime($markerId) + { + list($usec, $sec) = explode(" ", microtime()); + $time = ((float)$usec + (float)$sec); + + if (!isset($GLOBALS['qr_time_bench'])) + $GLOBALS['qr_time_bench'] = array(); + + $GLOBALS['qr_time_bench'][$markerId] = $time; + } + + //---------------------------------------------------------------------- + public static function timeBenchmark() + { + self::markTime('finish'); + + $lastTime = 0; + $startTime = 0; + $p = 0; + + echo ' + + '; + + foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { + if ($p > 0) { + echo ''; + } else { + $startTime = $thisTime; + } + + $p++; + $lastTime = $thisTime; + } + + echo ' + + +
BENCHMARK
till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
TOTAL: '.number_format($lastTime-$startTime, 6).'s
'; + } + + } + + //########################################################################## + + QRtools::markTime('start'); + \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/tools/merge.bat b/assets/tools/qrcode-url/lib/tools/merge.bat new file mode 100755 index 0000000..b60a485 --- /dev/null +++ b/assets/tools/qrcode-url/lib/tools/merge.bat @@ -0,0 +1,2 @@ +php ./merge.php +pause \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/tools/merge.php b/assets/tools/qrcode-url/lib/tools/merge.php new file mode 100755 index 0000000..19d338b --- /dev/null +++ b/assets/tools/qrcode-url/lib/tools/merge.php @@ -0,0 +1,70 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR; + $QR_TOOLSDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; + + $outputFile = $QR_BASEDIR.'phpqrcode.php'; + + // Required libs + + $fileList = array( + $QR_BASEDIR.'qrconst.php', + $QR_TOOLSDIR.'merged_config.php', + $QR_BASEDIR.'qrtools.php', + $QR_BASEDIR.'qrspec.php', + $QR_BASEDIR.'qrimage.php', + $QR_BASEDIR.'qrinput.php', + $QR_BASEDIR.'qrbitstream.php', + $QR_BASEDIR.'qrsplit.php', + $QR_BASEDIR.'qrrscode.php', + $QR_BASEDIR.'qrmask.php', + $QR_BASEDIR.'qrencode.php' + ); + + $headerFile = $QR_TOOLSDIR.'merged_header.php'; + $versionFile = $QR_BASEDIR.'VERSION'; + + $outputCode = ''; + + foreach($fileList as $fileName) { + $outputCode .= "\n\n".'//---- '.basename($fileName).' -----------------------------'."\n\n"; + $anotherCode = file_get_contents($fileName); + $anotherCode = preg_replace ('/^<\?php/', '', $anotherCode); + $anotherCode = preg_replace ('/\?>\*$/', '', $anotherCode); + $outputCode .= "\n\n".$anotherCode."\n\n"; + } + + $versionDataEx = explode("\n", file_get_contents($versionFile)); + + $outputContents = file_get_contents($headerFile); + $outputContents .= "\n\n/*\n * Version: ".trim($versionDataEx[0])."\n * Build: ".trim($versionDataEx[1])."\n */\n\n"; + $outputContents .= $outputCode; + + file_put_contents($outputFile, $outputContents); + + \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/tools/merge.sh b/assets/tools/qrcode-url/lib/tools/merge.sh new file mode 100755 index 0000000..e4c2fbc --- /dev/null +++ b/assets/tools/qrcode-url/lib/tools/merge.sh @@ -0,0 +1,2 @@ +#!/bin/sh +php ./merge.php \ No newline at end of file diff --git a/assets/tools/qrcode-url/lib/tools/merged_config.php b/assets/tools/qrcode-url/lib/tools/merged_config.php new file mode 100755 index 0000000..55ddb45 --- /dev/null +++ b/assets/tools/qrcode-url/lib/tools/merged_config.php @@ -0,0 +1,17 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + \ No newline at end of file diff --git a/collabore_link.sql b/collabore_link.sql new file mode 100644 index 0000000..733271f --- /dev/null +++ b/collabore_link.sql @@ -0,0 +1,15 @@ +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + +CREATE TABLE `collabore_link` ( + `id` text NOT NULL, + `original` text NOT NULL, + `deleteId` text NOT NULL, + `time` text NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..934199aba59f0d22a66ff12496812bbc1ffc2182 GIT binary patch literal 1150 zcmb7^y>7xl49AV&0hrkMURa7mI>25Y03;Y;t}2FP%+@u@3(zrld5=b-&%vu0JILth z-9;gh`I0WjdPh1*5by~ z32LRW&;|0nN7q@mVztIJO)*IlEDEoNHD;5QnxZk9jD6#%;x1M+!Z5_edw@QTI@Z*1 zeM=Me=X}QHYU%6;_nCVobxi*@pW|k`!QFn3f0qkstnL~#FOsM79J4HYJWHHC^W|@e zhvV@{gP$dj$FG#~YAk}_Nh6Nq2m7kV$9iqCO*En?s-3?&4eqU`_2`*<=NgoL2+KW^ r8itpBWWB3;nyYFLd01x5J!p-?sPkW+b5CSYwgJ9d&R;`qkQrughxnx% literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100755 index 0000000..ed24183 --- /dev/null +++ b/index.php @@ -0,0 +1,170 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]; + try { + $pdo = new PDO($dsn, $mysql_username, $mysql_password, $options); + $pdo->exec("use " . $mysql_db); + } catch (PDOException $e) { + die($e->getMessage() . " " . (int) $e->getCode()); + } + $req = $pdo->prepare("select * from " . $mysql_table . " where id = ?"); + $req->execute([$argument[1]]); + $row = $req->fetch(); + if (isset($row["original"])) { + http_response_code(301); + header("Location: " . $row["original"]); + } else { + + http_response_code(404); + $pagename = + "The shortened link you wish to access does not exist or no longer exists"; + include_once $_SERVER["DOCUMENT_ROOT"] . "/assets/includes/header.php"; +?> +
+

+ + __("Oh no..."); ?> +

+

+ __( + "The shortened link you wish to access does not exist or no longer exists." + ); ?> +

+ + __("Return to the homepage"); ?> + + +
+ PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]; + try { + $pdo = new PDO($dsn, $mysql_username, $mysql_password, $options); + $pdo->exec("use " . $mysql_db); + } catch (PDOException $e) { + die($e->getMessage() . " " . (int) $e->getCode()); + } + $req = $pdo->prepare("select * from " . $mysql_table . " where deleteId = ?"); + $req->execute([$argument[2]]); + $row = $req->fetch(); + if (isset($row["deleteId"])) { + $req = $pdo->prepare( + "delete from " . $mysql_table . " where deleteId = ?" + ); + $req->execute([$argument[2]]); + $pagename = "Shortened link deleted"; + include_once $_SERVER["DOCUMENT_ROOT"] . "/assets/includes/header.php"; + ?> +
+

+ + __("Your shortened link has been deleted"); ?> +

+

+ __("Thank you for your trust."); ?> +

+ + __("Return to the homepage"); ?> + +
+ +
+

+ __("Oh no..."); ?> +

+

+ __( + "This deletion link does not exist." + ); ?>
__( + "Therefore, the deletion of the shortened link cannot be processed." + ); ?> +

+ + __("Return to the homepage"); ?> + +
+ +
+

+ __( + "Welcome to collabore link" + ); ?> +

+

+ __("Shorten all the links you want, efficiently, without any fuss."); ?> +

+
+
+ " aria-label="__( + "Original link" + ); ?>" aria-describedby="button-addon2" required autofocus> + +
+ +
+
+
+
+ \ No newline at end of file diff --git a/manifest.webmanifest b/manifest.webmanifest new file mode 100644 index 0000000..6b09788 --- /dev/null +++ b/manifest.webmanifest @@ -0,0 +1,45 @@ +{ + "name": "collabore link", + "short_name": "collabore link", + "start_url": "/", + "icons": [{ + "src": "/assets/img/android-chrome-36x36.png", + "sizes": "36x36", + "type": "image/png", + "density": 0.75 + }, + { + "src": "/assets/img/android-chrome-48x48.png", + "sizes": "48x48", + "type": "image/png", + "density": 1 + }, + { + "src": "/assets/img/android-chrome-72x72.png", + "sizes": "72x72", + "type": "image/png", + "density": 1.5 + }, + { + "src": "/assets/img/android-chrome-96x96.png", + "sizes": "96x96", + "type": "image/png", + "density": 2 + }, + { + "src": "/assets/img/android-chrome-144x144.png", + "sizes": "144x144", + "type": "image/png", + "density": 3 + }, + { + "src": "/assets/img/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png", + "density": 4 + } + ], + "theme_color": "#e1e0e2ff", + "background_color": "#1e1f1dff", + "display": "browser" +} \ No newline at end of file diff --git a/report.php b/report.php new file mode 100755 index 0000000..e35f0bd --- /dev/null +++ b/report.php @@ -0,0 +1,52 @@ + +
+

+ __( + "Report an illicit link" + ); ?> +

+

+ __( + "A shortened link from collabore link leads to illegal, disturbing or pornographic content?" + ); ?>
__( + "Report it below and we will take care of it as soon as possible." + ); ?> +

+
+ +
+
+ https:/// +
+ " aria-label="__( + "Link identifier" + ); ?>" aria-describedby="button-addon2" required autofocus> + +
+ + +
+
+ + __("Return to the homepage"); ?> + + +
+
+ \ No newline at end of file diff --git a/reported.php b/reported.php new file mode 100755 index 0000000..32374f4 --- /dev/null +++ b/reported.php @@ -0,0 +1,111 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]; + try { + $pdo = new PDO($dsn, $mysql_username, $mysql_password, $options); + $pdo->exec("use " . $mysql_db); + } catch (PDOException $e) { + die($e->getMessage() . " " . (int) $e->getCode()); + } + $req = $pdo->prepare("select * from " . $mysql_table . " where id = ?"); + $req->execute([$argument]); + $row = $req->fetch(); + if (isset($row["id"])) { + $deletionId = $row["deletionId"]; + $origin = $row["original"]; + include_once $_SERVER["DOCUMENT_ROOT"] . "/assets/includes/header.php"; + $to_email = "abuse@$url"; + $subject = "Report of a link from $name ($argument → $origin)"; + $message = "Hello,\n\nThe shortened link https://$url/$argument was reported by a user of the $name link shortener.\nIt targets the link $origin.\nIts deletion link is https://$url/d/$deletionId.\nPlease check whether or not this link complies with $name's terms of use.\n\nCordially,\nThe $name reporting page."; + $headers = "From: noreply@$url\n"; + $headers .= "Content-type: text/plain; charset=utf-8\n"; + mail($to_email, $subject, $message, $headers); + $pagename = "Report sent"; +?> +
+

+ + __("Thank you for your report"); ?> +

+

+ __( + "We will take care of your report as soon as possible" + ); ?> +

+
+ +
+

+ + __("Oh no..."); ?> +

+

+ __( + "The identifier of the link you wish to report does not exist." + ); ?>
__( + "Therefore, the report cannot be processed." + ); ?> +

+ + __("Return to the reporting page"); ?> + + +
+ \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100755 index 0000000..be91bcb --- /dev/null +++ b/robots.txt @@ -0,0 +1,3 @@ +Sitemap: https://link.collabore.fr/sitemap.xml +User-agent: * +Disallow: /assets/ diff --git a/shorten.php b/shorten.php new file mode 100755 index 0000000..1ebeabf --- /dev/null +++ b/shorten.php @@ -0,0 +1,239 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]; + try { + $pdo = new PDO($dsn, $mysql_username, $mysql_password, $options); + $pdo->exec("use " . $mysql_db); + } catch (PDOException $e) { + die($e->getMessage() . " " . (int) $e->getCode()); + } + while (true) { + $id = random_str($char_per_id); + $deleteId = random_str($char_per_deleteId); + while ( + $id == "index" || + $id == "shorten" || + $id == "delete" || + $id == "report" || + $id == "reported" + ) { + $id = random_str($char_per_id); + $deleteId = random_str($char_per_deleteId); + } + $req = $pdo->prepare( + "select * from " . $mysql_table . " where id = ?" + ); + $req->execute([$id]); + $getId = $req->fetch(); + $req = $pdo->prepare( + "select * from " . $mysql_table . " where deleteId = ?" + ); + $req->execute([$deleteId]); + $getdeleteId = $req->fetch(); + if ( + !isset($getId["original"]) || + !isset($getdeleteId["original"]) + ) { + break; + } + } + $req = $pdo->prepare( + "insert into " . + $mysql_table . + " (id, original, deleteId, time) values (?, ?, ?, ?)" + ); + $req->execute([$id, $link, $deleteId, time()]); + $req = $pdo->prepare("select * from " . $mysql_table . " where id = ?"); + $req->execute([$id]); + $row = $req->fetch(); + if (!isset($row["original"])) { + + $pagename = "An unknown error has occurred"; + include_once $_SERVER["DOCUMENT_ROOT"] . + "/assets/includes/header.php"; +?> +
+

+ + __("Oh no..."); ?> +

+

+ __("An unknown error has occurred."); ?> +

+ + __("Return to the homepage"); ?> + + +
+ +
+

+ + __("Your link has been successfully shortened"); ?> +

+

+ __("Thank you for your trust."); ?> +

+
+
+ __("Shortened link"); ?> +
+ + + " readonly> +
+ + +
+
+
+
+ __("Deletion link"); ?> +
+ " data-toggle="popover" data-placement="bottom" data-content="__("Keep this deletion link in case you want to delete your shortened link in the future.") ?>" data-trigger="hover" readonly> +
+ +
+
+ + __("Return to the homepage"); ?> + + +
+ +
+

+ + __("Oh no..."); ?> +

+

__( + "The link you want to shorten is invalid." + ); ?> +

+ + + + __("Return to the homepage"); ?> + + +
+ + + + https://link.collabore.fr/ + 2021-05-27T14:03:57+00:00 + 1.00 + + + https://link.collabore.fr/delete + 2021-05-27T14:03:57+00:00 + 0.80 + + + https://link.collabore.fr/report + 2021-05-27T14:03:57+00:00 + 0.80 + + \ No newline at end of file