From 7d5049661ef2d1e8ca18ae16424570e3ec55a066 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Wed, 26 Feb 2025 23:12:55 +0100 Subject: [PATCH] Support using ICC profiles in using qcms --- .prettierignore | 2 + eslint.config.mjs | 3 +- external/qcms/LICENSE_PDFJ_QCMS | 22 +++ external/qcms/LICENSE_QCMS | 21 ++ external/qcms/qcms.js | 256 +++++++++++++++++++++++++ external/qcms/qcms_bg.wasm | Bin 0 -> 109104 bytes external/qcms/qcms_pdf_js_bg.wasm | Bin 0 -> 109131 bytes gulpfile.mjs | 6 +- src/core/annotation.js | 8 +- src/core/catalog.js | 4 +- src/core/colorspace.js | 272 ++------------------------ src/core/colorspace_utils.js | 305 ++++++++++++++++++++++++++++++ src/core/default_appearance.js | 48 ++++- src/core/evaluator.js | 51 ++--- src/core/icc_colorspace.js | 151 +++++++++++++++ src/core/image.js | 3 +- src/core/pattern.js | 6 +- src/core/pdf_manager.js | 6 +- src/core/wasm_utils.js | 43 +++++ test/pdfs/issue2856.pdf.link | 1 + test/test_manifest.json | 8 + test/unit/colorspace_spec.js | 39 ++-- 22 files changed, 931 insertions(+), 324 deletions(-) create mode 100644 external/qcms/LICENSE_PDFJ_QCMS create mode 100644 external/qcms/LICENSE_QCMS create mode 100644 external/qcms/qcms.js create mode 100644 external/qcms/qcms_bg.wasm create mode 100644 external/qcms/qcms_pdf_js_bg.wasm create mode 100644 src/core/colorspace_utils.js create mode 100644 src/core/icc_colorspace.js create mode 100644 src/core/wasm_utils.js create mode 100644 test/pdfs/issue2856.pdf.link diff --git a/.prettierignore b/.prettierignore index 90371a11625bd..dded2e6c7d4bf 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,6 +5,8 @@ node_modules/ external/bcmaps/ external/builder/fixtures/ external/builder/fixtures_babel/ +external/openjpeg/ +external/qcms/ external/quickjs/ test/stats/results/ test/tmp/ diff --git a/eslint.config.mjs b/eslint.config.mjs index 954b23a050989..bb55f7581b42f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -33,8 +33,9 @@ export default [ "external/bcmaps/", "external/builder/fixtures/", "external/builder/fixtures_babel/", - "external/quickjs/", "external/openjpeg/", + "external/qcms/", + "external/quickjs/", "test/stats/results/", "test/tmp/", "test/pdfs/", diff --git a/external/qcms/LICENSE_PDFJ_QCMS b/external/qcms/LICENSE_PDFJ_QCMS new file mode 100644 index 0000000000000..7e1aeb34f9178 --- /dev/null +++ b/external/qcms/LICENSE_PDFJ_QCMS @@ -0,0 +1,22 @@ +Copyright (c) 2025, Mozilla Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/external/qcms/LICENSE_QCMS b/external/qcms/LICENSE_QCMS new file mode 100644 index 0000000000000..5822f338ce7d4 --- /dev/null +++ b/external/qcms/LICENSE_QCMS @@ -0,0 +1,21 @@ +qcms +Copyright (C) 2009-2024 Mozilla Corporation +Copyright (C) 1998-2007 Marti Maria + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/external/qcms/qcms.js b/external/qcms/qcms.js new file mode 100644 index 0000000000000..18a7ff959c34e --- /dev/null +++ b/external/qcms/qcms.js @@ -0,0 +1,256 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ + +import { copy_result, copy_rgb } from '../../src/core/wasm_utils.js'; + +let wasm; + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +let WASM_VECTOR_LEN = 0; + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} +/** + * # Safety + * + * This function is called directly from JavaScript. + * @param {number} transformer + * @param {Uint8Array} src + */ +export function qcms_convert_array(transformer, src) { + const ptr0 = passArray8ToWasm0(src, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.qcms_convert_array(transformer, ptr0, len0); +} + +/** + * # Safety + * + * This function is called directly from JavaScript. + * @param {number} transformer + * @param {number} src + */ +export function qcms_convert_one(transformer, src) { + wasm.qcms_convert_one(transformer, src); +} + +/** + * # Safety + * + * This function is called directly from JavaScript. + * @param {number} transformer + * @param {number} src1 + * @param {number} src2 + * @param {number} src3 + */ +export function qcms_convert_three(transformer, src1, src2, src3) { + wasm.qcms_convert_three(transformer, src1, src2, src3); +} + +/** + * # Safety + * + * This function is called directly from JavaScript. + * @param {number} transformer + * @param {number} src1 + * @param {number} src2 + * @param {number} src3 + * @param {number} src4 + */ +export function qcms_convert_four(transformer, src1, src2, src3, src4) { + wasm.qcms_convert_four(transformer, src1, src2, src3, src4); +} + +/** + * # Safety + * + * This function is called directly from JavaScript. + * @param {Uint8Array} mem + * @param {DataType} in_type + * @param {Intent} intent + * @returns {number} + */ +export function qcms_transformer_from_memory(mem, in_type, intent) { + const ptr0 = passArray8ToWasm0(mem, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.qcms_transformer_from_memory(ptr0, len0, in_type, intent); + return ret >>> 0; +} + +/** + * # Safety + * + * This function is called directly from JavaScript. + * @param {number} transformer + */ +export function qcms_drop_transformer(transformer) { + wasm.qcms_drop_transformer(transformer); +} + +/** + * @enum {0 | 1 | 2 | 3 | 4 | 5} + */ +export const DataType = Object.freeze({ + RGB8: 0, "0": "RGB8", + RGBA8: 1, "1": "RGBA8", + BGRA8: 2, "2": "BGRA8", + Gray8: 3, "3": "Gray8", + GrayA8: 4, "4": "GrayA8", + CMYK: 5, "5": "CMYK", +}); +/** + * @enum {0 | 1 | 2 | 3} + */ +export const Intent = Object.freeze({ + Perceptual: 0, "0": "Perceptual", + RelativeColorimetric: 1, "1": "RelativeColorimetric", + Saturation: 2, "2": "Saturation", + AbsoluteColorimetric: 3, "3": "AbsoluteColorimetric", +}); + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbg_copyresult_be31e0334e4cc708 = function(arg0, arg1) { + copy_result(arg0 >>> 0, arg1 >>> 0); + }; + imports.wbg.__wbg_copyrgb_20aa106cd5ad6259 = function(arg0) { + copy_rgb(arg0 >>> 0); + }; + imports.wbg.__wbindgen_init_externref_table = function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined') { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined') { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('qcms_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/external/qcms/qcms_bg.wasm b/external/qcms/qcms_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..91a618cb4519fdbea7cac11db9747bdfbdecc866 GIT binary patch literal 109104 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�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�TI}^G(LR$ntTp195EKSO(}|8K8S*fXg40SP`%psnHsTXp^zioLCL>jgYyLg?KB&SGxLivL^qg;FJoEpH6uAcN{k(wX-s>+1j!7 z5}EYY#%fFFAc?;%)6!dc$X?Va0N3V;Qu{t;cl&2eX-LJKy-ih`+jYJp>JS)%MUn(?>&_=6+@ z=CaC9UaxF?le2+THd%+FlWZf z6CP2PQ8(T2U=wObnH_5c*#l+Qu=5-}pHv$^!!t9+4IsM2D8tf z`SyjMwy|kiQ9;hSwyy!LiW){QUc&-v!&y#i8yL`chEb~xwKSiH7X=K%upRZYH+OUn zELoLl46lg0OJhi1E56>$zu^C4=@0UC76hBVkq4lVYRbwoMfyTf2J{vwueErAruMLx z{4T-(c~Yl8frb}eKQr@?&I_9Xe-Eo7JIpB~i#9r3>%DAm)wJxFnIdNUAjC!~GN~PL zjicB_(m*F)6meL84sq(3nvbz~*E4O}Y`{Jg*KPU7*LxBAP3lu#J;VZo)BXOU8!IdO zfo&LpDwBoTqVv(OdSM7%VLeSl${c4%K3XvEK&| z)7KCjd2Lm;7m8cmW>-=pNn4y==Z$IO4qmwcd%Oxt?;PL2s6JwwV6Zem&*bEU^(TEU z4>Z1Gb4bTlzv^1wN%~JGy{{zQY+`ApSaZE6ll*E_MPw^JEzX9Qj@|i7#~KC<>Z&Xq zyROU9F*|lh9lhZ?dh_eR2%_dIb@W`1I_i7-fd)aA1Sy|})DWyO++N4$JGWsym-L=; zwX(BMyZ%>Mw-lXMIO#w2)r3BMa_oP+^{@V$M|R(1rz2}f!@lc2?Wn+0-E(JLmy8*X zg5VxDJ#9`%g?lEWS_TC)=K-HtSpEoaBQtu!URHq};LZa&ot%H`baG%8oa}Tm;tye1 z)^+a$$MW4s_s^Q__82NcK!nyFJ|ZePl(e-s&D>xYD6Q+8*E){C0fIOLZ_Mz$Nk>T3 zCq~lrVem*|&E}B!1BFSNPNHo=kp3?xe@Qnmh0~QlR1MUMK&(;FwJl~Fr46elj;zL_ zGIFUp)B?|YEHle^Ogg~Sy2Xk$=?xWSZOW3NomGsMj=0c(vdE~2jIv0K-Dz|jz6TjF z<7r!*2|Id}p3}V(4Sx1BQw%4{d(3R8f~LM7f&!BC_12MT_!|fl=vp5Hdi|qy97H#d zA5A~~nMc}39OhioFgeXnvlQ;*StO;mU~i?B6^@N0{g`cSYLMKL6=A zTeR$dr_)c*)DNeF)|8v0bpq9BTW`` zrag&Dph9$1Q=~u!l5voooi1lN<|#-gCau<@LUO7~=&vRL?Wwfh{o7Wpd9seh56Qr_ zAK~Tz_yU7C4uDWoZ1|rLrVRSEZG?zRKon?O%wPxQI+bldr63_^WQY89|MX1g_h!Mp zcGtNgKqvbRuIJ1tBB;sGms`wVy&pb3Vs@j}Fz0MlI47in-6%g#Hq5l!!^PT_Vwna9 z!&T7=!)?2^7_O_8_P$1zxs`J<+4~fz6l=K_#UNXB^(>pLMb9~mGp(l(Rt0x{+Ub!) zxWF9a42us7W6{T9s{ciMHiuf>5phBEv+)Eh~I z9LdjQNWN@6#C$ZThX^F~@CmhKdv^*wmxaXKOB0zkjGxF9maJ5U7aw{wFEt;t!Mt|a zLs3gF7G><72^Vz#NmJfQn$JmC-xC=T*wi-8j?X}7BS$y#JuPN>o@T=-n@jODAN~NoV|o8xwMK3ey394QV|N(5Ge?+Up|!h^dHT7_OIs>A@yQ>xbFzlc5j4h{U%`E+M^#E@y?F^dA<@ z!)HB`q3lC)ALAFj0fpjCpqWPJ6XDN<7tT8a#ChIFE|T{V%S!`~W!?MZW>}a1F)C+W zDyRRaW_P4#9{Jr<4d6-N{KmOpdyvi62bB2GQF9sQ0%22gxjs1iJ-~0)Lki|9gKAA5 zJtq?2x-kvTjh|*<@Mct>F>uTviE&^+pO6Ad10PIe{2>vWs7WP8E!@jvni@X6Kq*`) zBqH?@HQPnfDqwmr=~;~M=wF*ObsX0fk+k$~@2qFoj=&xZcxsb3rCVr7s2a^~FwI4E zILoGw{sX`@W7-q>S3XofZl_IWzxT)NGy=KWX$azSbsALWoqi_oYWiIMrGa`RtaP~? zV_C;8G{`-bJ@8}pw>R8hh}y3(QEO23bXORBD;s2^mcRuXWQa|JEZxb^J1EB}!6-<+ zNIgv@ezW_(Ud(%%zFd6O)k%B9^Th_HkMwF-%y(%(n-(};A4!@M>{Q4wCqER&YD-?p zDEFbQ;vnCF7WkoK4+C#`fRVqK{c2g-p$yB2Y*~t1_K|o5lkS>Mq-({KhkU(?B2{P%`CU#?X=CCr=jZBjgmpSLoTDR zopDy8Am<5v$&{bs@H_%tIaWBc(>XcM<#ySb>fuCU4~KWvNM%xblVg_cZZ%56l{j z4J4EmNYCu*%iQS%rSIp6p;Fz|##S%~bUf?(T*j#pskPJ}EwywHu=L|{H^7RYy+sVv=>S%3!N&5f6BGFZFiWbnaa zGWcLV8UB5P$*{05$i*kaszPKSJTj4i@R%zybmyaq4@AaWH5qW(nL8QmiqtuiVU4o= zB$Hw7<(v#Z4h8zjAOalEIPp&=5q=yPGKsL@EZ~vkVR2B*0%f;(;7PycNuM8fT`!j$ zxD?WVOnQH`hv_#!O?Q6Jk}$d#8=olgNmI@Yf%g5i>ld=+(cUgAjvob{(`Hm}5Hk#Cfti-{p4C5}Zb!(Bop>U%N zHx+J{;g-U!JX~k)8F)I&>tqP9&A*bZ(37T7%QS8tIU zId*iB+Swt|YD(^$fT`^>8iQVN$K0<)V%j>A)a!c;!D0Z?Em(+%w6gJFbg+q7r=y|q z$g|scs7!%h#sjudh8Yj-5fxgs;Eat=rlexw#3q)Xpdfs6y2p<`r^0Fp~cuvmu}hy zb$WCwOwSRo%|QtuOZe0gGrG`F2Pq9=E|>j&lrx;2cyLK?>*L5YDMQ$GO-c z^Ve{do)qG`vyG_5+SS`IyPJcEs-~hn-te3Gqu%C%Yr;EmtLD{`zUv=OYln4ORtr?} z-mJTs72DJ8>pjuM^0UUPIo3CwtRQh2F80j(T7qMGpJQ8}zzKW6^E|`_yy(LZD`Ha- zl2wD1uB$a{TR--v$BIUE^z+AotSlOhBlAsxolVQ`&u3-kMtKvcjxXRWi{iQ}>CM6d z8!SMr#@SPtAWi~=4ku=jb@NHqIW;Mz#nsjdWLI0;r>>m#aR(r&B|O>el~`417uR*% z$SF(-OnUewlj&wSVGn#>_?QUq#EF zqiSGb%j|<+`dq%=Ji}M|Z-exS-yr6mp!=`t;fQFGL+~}6{7?dPW*DZcGs8&g>x0d% zb|Yu>CkYWb=6`zm-5+9~gJgv1r7t{nWO?C>xxsAU1TB(T9E_Fod7iV<+-WHtY}6oX z=+?Lb#W8tLiOK_*1K*r8Fhh}N5J0BO1SFNnfsIV29LX7`EI%~n59Y~ADFdf$Xk=&{ zlZ7U0es|e=Tf{LJ2-*8fAeeO}5IhotTagZ2WN*IdNH@4jC%q5^M+CC3-`3@7w} z_=&BzG06`lFtXz7L%Huuu!W1X<@Z>rg|nwXL@X3+t)L`LMc)W@kpb+(iAd&FSnDhAnLe>JqkR|FI&l4&NAxyNX@4r@wBukIb|lxvmB?Bx;JAbL4bAm`)!7Ip$o= z>V$%N){2uc`m)p2R6EdXR#__M{p<^#h~=MDelOeNtqkH>aUC(zD_UK?x09edGIc7Jx1v>CwqT1pngOa_e) zzvKBXLQA16YtL6wmdIZlBg+C!cH=g@wenC@gesZ2OwzMR#EGMy1i5^!%wv-LL2Zxq zGdjV(k?s#bX?Z-U*<(oNCXc~=M2{h{&=&{8=YE!N$&ph@jqCve!+s7-*oQV6#IMEv z{kjYWoId(Aw7TDfF$l%kULJ@Mbewx2W|qMKz$9KID9q>V2TxH@-h5Pu2Vg``#MgNb zixmnb%7Yy+;ifz!j@YMGvhm zOK^%}tgpbaZEJEJ$}f;Tyufk^GXTq_uv{*|Bj+xc0MAnuNHg9hrUHu-lv*xn1+5gn z7AzK%j%;%F)#A{&6i_al&!Zt_@xCqshk)`;Gb; zV`B0%Kn>+blP>ZTk{>C(di)G@SE6d+iUNJKlVvJ7o^Sx`<{iK)w<_iO&T{uS$Z2^b33!8SC=WYLsEOeY+qkd&D$S?D6W zy~z@*ne+tnhmWMnF+f^j*jWkm57S#^AIpuDMWz;;y*@j~jk7P#A!lDOuCFX% zj7hq|E0TZwm2(URQ%+PUoz6sF_irLbEZUR)`T0+#n%Ag|`#98l$l0+zLJ(MY8WW~| zZ|9%_PvcGx%*7fIv=|Ek903ijIqa{1A9655kYcM%K!J30ipw}{v+;;bxsvIWchDv6 zVNc`>^e}2VGDIbew-kJ4;gO?hWVTqMgh`E3COoCmtA!#H)o5Z2Wg=$qP5~s!i$m4y z*B#0V-58$`1!{h2=t48tg7(3*@e5W0OrQ!F@Dj>u+9K#P&}cQ2@LsM%lY@5({n|x< zjJv;A3q$jP-{Cz3z1H<<4Uv3Hq*fwv{UtgUw`+m8Jph?`e1_iRlfpMsFryGF_`U@S z;+H$W;K$UjoQ$amzt#Dfw2-T2!n1RJrkQX~u1CX#vOQMKCbBWlf(v?zey!sDiHFVw z^FC9_iwn;M^FEt!;>2DGk8e^fO3Wv&9i9*g%tjDL}BABRWlVyCe%-8At!R+Z|`Aq@;eNY1qw98HtoZ0P`Kb}OhyQ0lR z>M3-mfbQIzaEu80MnjXob)TfrBI@YLiNpTr<{nO9?j*Fg8Ry>U!C;f|) zShIjcT_jknBetfuvayDjvEs$RE@vjXk>|w$v*A`^J_)-2t`;^kQHupOGVT#dUpL(W zLn}ix<6SYCuXgAXS(9SToC%L!A1tHxFkNvxeO;lRg__5UWL=?xIkJrCr*#ohwTdFo zs|!}qPj%LHsD$om(eX$QhpN#u>c(&c(V$T^V(^e%bt4KI+^+a`td$YmS)yAOG!m}j zoFt{hy#3q~)v_w37G@{fhqGtJEdmaGlE^gR-|X-EHDW4}8Xl7^PV34R`eo}5ou$J7 zhU{au-8QF$m_4+@Uw@{W{tSxdElLY} z*+b~JD%Gsl^|D!C*|^3TRB3Xoq?@48#5K)5A63Ua9TB&JvwZ2F2Y$0&C)3ddYizVi z6k^OdL_L-P!;~JCc4s;MPKM_dokOtmK*?cn^(Y0bx?=rl1J`iPpC$pQuYA*phMvqpnOD>rGJj);(liX-EP z!1VP?X~^nlF9MnZgNQ3si>&|Y2z%^ z-$EBu!22p{J3=8mDNp%pTo`=gQW#A1QQYiBG0(16z+b3It24QIUc96)wvxR*id9@U zPhI#r5N4fL#QI^@Nz;oo-res-QJsr0yt-dE9t7{X4P0w-aWex~m)yZq@-k6tA2rhb z6^vVPY=RgjpIw&iwSPUMUiWJTTuPvOsK$)MTFY=`x3)(lM1B7Ft-V9;M!uRYA79mL z?VT*3!~Xeq@f3NdJnYY_;y&5GDlUF9aPrTP&JGmJa7|zNm!vO$6~@7R+4-Sg9ZCf> z*bdNhthRc4w#2@mHSbL(o?U#cY0mgkn{DuD+UGv_h>b@2|F?H8aCTMI{Xh5IJFnbK zGIYbbN>8(4F zO|8whhUarioT)WBnq=|;n@LnnKIEf0-$Zn{Pm%X%R*IHsn(D_02u_RRtleoMs>}`w zO@oB2)=4AsFwRrqt3($&w^Cj|JoBPCIA<2&Q?oO6az0=SgD-Dskw+(XDv*87_tS_KG%>?mCF0==1IrhN zIVFpR9_EY3SB*-s;|8D8F+5M;0a4Mu(ZUZ_-HXOkW47#@_qlKXWYxX$qjUf4Dd%3J zWlu%NM<0Cfd~~2{l8TPa%l=RMXvbflS9|`RY_94v81ADwEyb=(#;zP2yOO9c6ES<9 z#vP8V9@Xf6TyDIcTz#k1rra?AWd;=zZq|0_v)7@|C~n+`S1`+Sm7|B#=m zJyk4JL_?`5(a5To$17hZt1M@fFP_ZhU(O|eKPEZivv~=N9DyakBTXpD+3uy*qbwl8 zIvbIG7}(_#5`|KAE2EW!m-Do)pk0tXa8%=MVL(hq-@{}_Q+*3K9ZtB|T=M#G9h;RW zuOm`sr_IWc_7e{s_CnUCLNFpFl+B1DQb|lNo$7qFnD| zFO3ny8%sJn#=;iN@S&nXr@CR+&IC3ozgU51}dzDG=kaT zucr_|Qa3q?-xfhWyq$ki#xPHY86$Bt5eOuR*!;_A4p4tdmG#i-^gHrZtApDvm)fW5 zeuS3aL{qF5DoFeid(y+sY6H47p+6G~{bE&Q0Sk6QzZ8Qys%h%OI))+v6J?Si-;Iy_ zPdCN8Kv5LPG=VXp$@;*g|Bo*Dh85X(+}s$Ak`*7f3?&>95mIO zU(aZ@8JdDE@V(YF_Ptw`4ZYS%@fxKt-dO7HB=) znwAcbxrC{f5(O2UYGuv`4FfV2=PxwqwbfueRBnrHr7Q}3-~^o)PIL!lB@`kO*X=W6%C4)WG9%3CHP6iNFZ2e3LD9hzdt|u@6}8vXC%pH5~&%# zedU_zV}7KZ^~O_MW+2I=f_36}ku*q>k??*Ija(cv$+e$&(dlK8=8hL>ep#gY@gg;s zMLKu9NU)4CWm-F4r1fQyt{5-URf$O1yZ<|nJ&nr923-?@**?B z=B2y*6ibqmucu@@XR9Q*-D4z=pRDaclOCHiok;4~Nr2`;$rHZ7nA7A7Ob!MO4Pvrw5(Qohv~ z5+Qq#2+>4VkCISgH&C>jAKtdl$)gd1qpO07&jy+Od2c^dV@eO*G;+XcVzpr_NBqFq zcm97)YTMJ<_xgV7#*~Z_7@#F*BZ7Jv#5@MvW7s`*A+M&ie&c-kCn5Zi)=|A*9=)3% z?=>-yPias*x~D^Qdd&raf#*7K!v*Nvl=R#Lnk(Xz`miCJ4KbRt&T}AWa;WhA>_4QOX+TmrUr|)fv*wlcmhnRAjnK=>KS3pW z`Lq#r%G_tNc(sT=f+L^dJ1Feg-XBJzZKC@nrluEvl%C0n?$)M}=pJNB`g*x^^^^K~ ziSAO>qnzh45iOvuXmKS|KrY4HVN$TkqD7_sf3a%m7poeoyK$@L+p6T0SM6_7sVb>2 zlD$^iQgLlVSJ-}v`5d&(cl<8UEyeDM_fz7&;{#J(mD3Qr9&_6(sC;$h8MI~HXr(w)47M8VEZGqZp+B?+f9Fr z%6+ZW$EolL8@Q}%1n5=nM%aeYoBoi}wwk=q&mwGNEEC!`Fxc!+ofI%oKMT8AQ#`g= z!uOG<%T5^>80}U$ARKiO7>X4x;dB!6o>}Rg!Gj|rm=fDgFpmmb`>{#p5;1nMT)xWz zsL4nfXUH^*9!OiDt{P@jCHF@<2==ZNa=hP8vwN3fQNwf!DVb@F7UvjnJ5MxPC2M4( z^WTZ4%_Jc(%uX&;Q+2zuG7qBcsGeo2=FCQHMa!mlF<1+D)28VQ9D{bGaM>NMhn(Xn z(LpcFogS9K3`I;+NVD+Kxdr=x1Z7(+Dw`RHk%iXL3@%wLxh(2T3m!f=#+Zj)K_b}( z*IQGvU-fAu%AxJHUf3hgz8nO>&`Kv9W}9bcsv!Y@N6B%u7+cY$HQ%D?U9zTdv43b! z9BETR8~d95BS+fV-E={bV^A0)Et5xNRscG>M1QL5u2Y?S3NBD*S-_jnT%e7R#YC*h z2t0dZgxfj_A3dbSfzuM59kI_`C&)e2b%(DO1^@N=hyUM@{P!zZWDWnYBXqh55guF(vfVoonMtKW_ljBPP%$H5nm zW)he3)s8oC0w|Mik5)OJTQ6xx*uNo|<3f+!(SC1!_L`~FSAF@pPv5s{qgr_OnvqXm zoEv=RFIOF)QH!Yw-|)i;U;FVDKVbtg{o2*DJmA9pKIIyzIx;r+;?e`T4l1AH`A?;JU05=pTGO#-=bSL0RH9opT3*l zcLA>g)I`F6B8kgOUw;O;wgmngVEfp}ZGazo_s8#e`?tO#f~g1m^#hjG&jIJth?S_p zk^DIX8KBtaF*oNY$Ow6gf6lSw?!4|+=TcBrteSM;cjey^>U-E{=U;TJ$U)_zbakS$ zI$4(y-H`2h7T!1#pD}y!>2%%S|5u zY0!m1et&TK{`?sP4h^LOvRGU>-50T>Ue4pSX!o-AQxB! z9e&Nb2(oKC%SC{ygSjq(#5LFsvYH*1wN9zafj9i=-aCE+>wOdky!rzl{q2!^KfCA4 zkKNqre@X$z?*H-c{`Om=?>VoPy-MKs+hfS}vVob82FJUY_hh=n|tishX&$8FRd-%NxYwUDPvA==G( zBGsBcqU@kXdM7RGk#9yY4QDV7n(p}YjjvmEVmAe+AD}Zke)`ngR*hQMTEICSAGq?& z^G1WyKa-!=@wtm{e+;uE)N0QQ&kY~EWmRx?$78RbNrZVF$KLQAQl8T>r?&l&i$y1= zJKjI(=2d*Xvv3<~zjHb+JiD+8Go`aTvKO9xa8$Ss6Dz!(tvcMFa1(8#>T3JhN2uil zgGa2s&v~Ubxy?deNQAu4LVlD8xywRucpGsZ7NQIMD_YaLf{acVn`v4aA%P5!S%$bi zCHIB?T4&_JIBGvo9Jc1+UtgQ`has`hU#~xl^@l!P=&#YAdi^;UW)Lg#W{*|m%|20) z7qQlaP7b!;iR+E4PF{{z1pgJM82{y`7=QaI#((Z9#@}{|@vlF{_+Mn4ydw0uCS+Zh zW-diwkhoP{H? zhpuj|CyASo42~|u_1(9k#4U?`ca({2TKubFE^#H2RVWpot$#OZ{b!4h)0epD8xlvJ z)V5YUJ8NXclOoTSsl}q(X{PAg$%?+=r0riSJUy3e`pZ%Cf*Te0v+qQ!QnkGq5F)p7;?_9y=SW6v^o z)&on#-1puOe)h+}^Mh&*XS3kCJ>@JFL{LxvsS{sA|D*sK8H=wni(prJx0#EL(@m=+ ztC4sekLY>SgVqCCQ--6G%Vjtu%VOtg7xJ5kaETJOida}|bApQp%~DNku*;=0&g{#~ z_dE>B@V$VD9s6EDM>57|M1HCwV|6N8t_r5Ag>efyGU9IyA0HXHiLb@3F`3sy*;wwa zp)M>7l(r_8dy)SumUt5|i6z^Sk!L-Li`5)Fkv^8rLBp14J)&mG!mK2#!kG-U@GF0I z*kfO;%3jp*RL%TrWHH0$M8$lMV{|W7EeL0EI1}4!Km6HqfBb=}_15Y?Kk`>Utklh% ze)#hvPrVH<(dN+uNO3MC_Xx`~ za9gb)**94i$&~RWD32~`rtv0Rplm+%FJGv*NH0&k{d<{mbd$_)5X2L@SD_4YyD8XoQa!bKvE#g;uS)LmrEQOoBSF1x(}+xM)2L{k2ji1@o=npdXL5>re4NhLrjc~#wZ(ia z41QJ}z?fLtJ3XB5)XS>xESd`gLWVKiS{e@W)Eo8>GxVmrTB+I;m1(ln`ICceFh$nw zeA3Y6VFw#Hie^llCPdpH%uoV?1Dh?lK{H=RbkYQMl;56ao({N^k$Db_GAIkg+CmCn z_`?1Vn5RUzF(y%PPC}jED2vK=0|8KtIX&VdP7T!SddsUfFX5t&qB)wo7Yp^KZ`7%`KP=-i-T&*2@S+}^!8FLJ{lh{ zN!QY+RR@cuFslw0>GWxJu&@n|T^%fFW22=yn6Kll)xo?rM6T-K9GzLM4$kIq2-?31 zn${=4(qO%Kr(FyWDT-BTWGNG?q``^AD%}kXfN3Xi zxYy_&9%f##J+1KAB%KV;L$a4m0UM+lm?_NGaa1wBhi`rAUFLNnnCuwbTTF0(t${nU z<+57N+@FLYNi3~`J7&W#-uI1fSJqttzo&eg>;8xuBLkobC11rFr#w2J_M+vXvL`8# zaaA`3lnXX05!FENF2+_V28jt*EIn}OA)4d)BI%(r{KS#Ff5?3xY~9Kc*}hxe^#f)B zoo`OpRk-R5*InbPGmM)r3ibQpH!%f~@a;c9h)&62n6i+A99pcm?rN7sul!SupSMJR zI`p1M0ys%>nr2K}+l*)Hx|6i_El>T4_5SbG+UkhktF@!naIMWHGo{wv6}R>-89h>NUBEIuTVIlnZLP88(Ic@^Iev3y}3HI0jsyesQ*s zq?YX?kZd1;hGDo|wjEZ$WQyGp-u{ulP7uBXbr&DvI?veLA6vOF3nwKX&_Tgy%0V5o;=wD z<;j>1tD+*FkeXGIc4bi%;ocz3+47@CrtYX{;KsR&_0XMNJRT-&4RYq?5Aae3Wa^sMjzRx>3xjkD(12Nsa7`YuOOCxea;Cm@@J64`7CO3-s z(y4F5KWK7XK#uXyNYJ>BrIo1EEs~>Utf+KKM5T3(N}*F1Qi;bX(d{JB?WEA9`!CZi z#P^@3TUgP<;`CEqlUjcQ?M_63&eXL`#N8%dH$-?(s!dG|;^0RjIGCZikAEtF)CW%L z=H@R9E8&{xDG1lRI3<`8#n~!l192JJ7)x=dAM&h%rUp|L1MVv*+w#$VxoqD6zY!6x$S<%vfSNJPa?CNW>(%xh|iB)^u!ISJ|P=mnj)8t>Bvw#pMBw zPPb^cha)_q*@;zr3z?vJW#T0%bPS7SnofmJgISZYKkTM}he1RxSCfmm$DnXlszfey zdA;Iv$8nm+jnk|+8{#-^_g-VHyb7N4k5TPJ{c5wF9>hpz?HqQypi2!`c z%?sv5!0oC0{9t|ryf2ks5G;s*(Nun6urLDdO63;?iz48jRDN-=I0E*i@=Jmx0y3Hq z10INBbv&d2;eoDXE)R4i(|MpP;h00PM5LCHR%I3sv?|qF`-)`6d**U&do|V_4?P;)O4d)lmkzV4RZPp5%z}gyovUO(pP4 zn{0T-6Bf~IPC~F^26J;9Vv$AT8P7>XvuWo=qS>^QaSJt=9;_8LMFq<~c2r3&n|~BX znw7Lvoa{_LCu=={R>@Rc*Q_|>_k3Q|Z(kep>w_G99Ro{hR{O~Y z({u!AmI)#%GA7+EVATPT$*RRl&s-y~^lDXqIiXXYoR{HvKsZAeC8g_@1zue$+oq26 znLVHIE`(e}Fw`QtIM%MbO{*SqYOU6x25jwcU2OJizAJKc3WE>o9`MsXs0L(djCDEL z-Dl?NDglk5)+>g|vRoT3s;d`%%HrX1$Xwz3l#13Ag;7{cICvbj7+2w+Ki%qglUQdM z9$GEI=6&+dzt)0cm;DyhE>e>*dSW|@(Q5C=CcUA*GnW!aEroEau-md%{8AiR ztQdy_>xj82iBLw*DZ9Lnq%9fvJux~v5Z2MCNhQ$3i;I{7Zp;hW3Y$fH@I%GeZ%Y&lb8hWQ*gk`ezhB4`+h z#Qc@sG{soy;X#fzpSmUFNX6J;&>J?$ zkUCxFDE-I*5e<~CJu#8_vlftXaZ-$i6oI(7wc|F#(5bZW7Y`n$RCECc$-KJPd)Z&5 zxO&9Sfq+>%zcB6Bq-0ue!~ol(JSCjkAvKISu@@@<WL@Yb$H8L{gwL;e(<+H`q*7R*Pcq2x!7C%3DmboA5fz46jcVoYaLt=a%g&C%`3E!Y z(6X=WPRjhR}1wpuLRPC>}$!rHXD z-DNQrgMzm*BS}zEeuhQ)J4EWpae}j15q0r|v&Zq~YnZ^*22|YLe(RV|lJ!J0p--X2 zl;&-L|Io5&-5#AuDH>^vBSfI zO0GJhT<=kwJRt%72HQHYKZ-11r-Ya^7#BA9z4zp69?hpMR@FMjj-ul|St1F0pO?Z6 zv?oHc?_`+T<*d&TA}`SAemIlgX*=OBJM-+^VgSz7b+bvr7U1@+qCoQ9BQtg{8xJT5 zDncSzGs;m45LXJys>?_{65h^i?p?|Z7k|2>wi>E;U;R0nC5gZaEb!1QgV%IK$I`;< z)I}I;@Gw5Zlv1n=NhtBdAPZ)?M#=1y!(gnbU1mzGj1O^&a+h@i!G zX>T6fcOu8Qc8{_k+9W^avzn~FomlXM3+I>&7kE*EYD;h^C)dM5cqAiP$2^Fx8-3I$ zn9$6{RGl8A@tNmsH~%;3LHKV)c-oHe-);)uikfB)EFQ*CLG3f)&u{y8Pj;1=@LT`- zOJAn9Zb?c2_>Ng(Urd9J!T&YxzruSUC+Ec!$|2rp1XHv0!Tf|hcjh@)qJrx{VG4Vo z=XEbCsb>sZTioJrIhdbFTUFx%_0e!-!}f#t65mUjiKN;~@ZM2y(O9GT2{coCJ067; zeUC04;JO6$j=ISG>sbA>H=IA(ab;ug`Fln?D(-!c9`bL@-<;-NixuVdiDKWed>nLDvn zs-MW@U|gTQqaCk#@DYwKQU*%e;XU|>Wn0Y8<-}A18LoGhVHyv$70eJuaH2iT+-?+V za-w02L)j6uX8YMCYS+;OmBI7gEPs?Xyp=YhN^-IxXs0^T3~QU5Lppv_zEaLY2%{`# z4sFFsL6mzOH5M#jSj2UM_9a}(w2*lJ(&?<2pb$3=@lt! zdy9A0gca)}ywwU|c|Qlg!%^`Dnb9iO<}-Ly)yLEz0x=_$`7$$SD=6}n>!D8ab%V=S z%F5Tq@eg~0d95m-?>K&XeK@@oKc)B;Mf}*A%A=iRo(MhBrxl~OZx!}pY^;WL!X{A| zVoxo`4p3+%aAVMXBJL^0*f=Oj;$}s0BJMiez`KgFLQdjl;dUbK$;H@g$0u>KrF|mq zNyXU6nhD(P_(?dSNotFc5mghYX}=ROPmCj5^A#JL);ke#HjZnJS8Qt9?nJy3;<(my zMZC1!iFj+`xYlq*ytLbic&p>M)@((*GGIBOA*$lI)@U(a+U!KMm2p&SvKZ~S6ju>N z9Yb&9Qd=g9IfmB8r8F)>Hrg3OXX8>Cd$JaD42_LTVY-$;^cd5ZX0T{L_-=IiYxCTv zWy^Y-+m2(;i2nz7<#yF}n~!L*p)HPvvhj+l0e z`+CHmJ-Dg2Cy%IOJm#*9SYGtX!Uh@0q2F%o=-IoFX;{jTwq`Hh>=g0YyKcB>5FJKE zR_b7{>rU>Rp`l;XRUin638`Cj6s&z%Q8++>g?$r*VC@HD?AlR|p6!CZg#@vw=JM zcFWC|GP~GZH*qv4A@Kt@T|(RY;rFrc^Ifx&+0E|b?^5W+_{e0!M@fvzP$|RD+-Riq znHw*e6Fx1eMQazEz?3%pEp$f0-};x$34h0e&7@70Q7!o!Xl67!%B{0#Lim#H`0CFu z-ahL73Qx9U!|DUIqwa4u`%g2{*_$hFNZ;h&u!h3%-_cdM+Ng4=$MRD-9&~@cDkdL4 zn0kLcGpOaI_gH?~{Wy*frV%ASou$d)Uk+~BVd6!Vjf<8)?-WpU>5J{=Wj~_aoMof=t;L(Fz_O#l2(;Q?} z_2)jRwWh81-e4FoYP5_Ixvg7LrF1S4Hbk6kRxQ*)$B*C5c=4cnshg~t5;i&Jv{PPQ z6yaSa$YwB~_rqyHjjapNj=FUL%K|LMwsYB@Iwa#F)a=Z2){;|e?7R|Tf{Q@)DpdJQ zt#)Z#Uer3P%Bbu*mCYK1em-u}zP*ls!>5+s0ey9~^lzZJ?i8gy1l~UNm+MRk#k8gb z7akIo=+t-%iSije>+&Exq;iiSZA`CQ{wjxp`LF7YoCnK<(|0g%+3s=SldsCOr?m!| zv6V2NAv0r`LC(lQ(F!9&_iH)=Ka$%ifE;_PWv$jBJOAXnYWpThTlw^`Z7l~pWq^$2 zvUMja(VQGfrnjmo6<5{p206xeylQJ6{eisjz-4tP_spGy^Gtz2;^YZ|YDsP)pa2=l zErWw9IaI8&nf$f+3f&LqM5YR3;$=7~5++i(BDbSpVQQV$e>-zk)K!>AcIDEbt^#$M z*-Rss*1Fc&lROmPEcvRR%K@b&Cb<`p-N0hOH{+?mZ{!;vCn&Lo>3=Mhi493H3lET z6l$87O8a)9*kNKKU7^_v`T3DS`sigLTcL-%pyLpeJz>?_wh zY*f}ppV~VPP*V(Hm4zpPJXg!05Pu8c2;5I#oJUlgNlMQ#G&D@W zaK|Smi3L=IzxvTqx7;+IWiw)&6vl0X7-y*!;bASca77ds6aT*9!%>(@^_Y#T$#0WR zN3ENmyzgGld9iQ5pJP})qBMiYi3R)cT%$;b@>6u--GTh1$4o6W@U}zw+5`JZ!|vDq z{e0Q)Dom8gQNGpf@ByXTcYwc>^j*v${CZ1a|KNdr`)CX7sNx2*)WZ6_ zMFq{iAoE$;ERi=^1(Rrn{rht|@Eb96y8c5(715-j13hjQV*W@4F|8auv@h?iS@X|- zcr5$zE6%qTIuO<3d0Wv&z%z#qthv(uQ=9BRu;zESEGk?y<9{Ebk{q*jRo_6ss&VQ{ zxza_ty*a|@VN(jPokOW?R=cFOD)umTG!X}u_1ZZyE97N;ZHBR^WN*R=fQBLO8g!zF z$z)7xrw#-uwTMT-ynT61?8fqmsrg+C*F(3)QX}ho$)kVv#alBHU|`=z9{n|%c7ITt zEFh}gU%+BeS@CV;@U5^f_bsabpPjqUVsXmEBbJ6uP=|{*r**QKhY4(5<|Y#y55w4* zOJl)Nkz%gST&YhbxzXANY_eU4h0sb88`IluKy<_S3X@53Mtx)^d z{B*^yez#g-L2Av4-UlXjUL8PVB-U_n{|=M{$u-a1cW|($b>sO5*8FVi-+U>2?DGeq z`NjWq_Frsy;}ntq-p3Bk?0tOWAzsfnTKJM^A+IKnJN59sdqoXF-G0JVjsyFkb=uo`t)_fs)I>ZT>Z*M|@!@;u5t+DZRmi$E zZ~FIRUpTYx!>I$MH_cmhYwp?M-FEH^tv4Mgy=Ak1k(RR>?W40rCA$S~cc5L_c8-m9 z2|M9BV8Twg4w$g^6ATatTm!P$06|;CmyeS{_jn06YsVsXQcA*s@gfbEMLO|1U{a2x z%3@(RSZ*powA+)>L_#lh9k8!cH&~gwxDS9-f>b=vb@#dDBS3=ekp4O7mZVb6P(?~@3R<6ZB2UhOMXuI*jhhL%vCrS(=K zWjnO7e{h>MD&|-!*ZWeQx1OgL!TW(*6Yz)2;E$BSF93HW;{Qt-{QWZchrsH~IKSTl z=MpgFH3lChE@NN}hsVGxfG*hBv2o?rS3lz3P9~0&HD&?q1z}d{$c9>WO z*OtL^fs_3_AGjrfZ*dv?e&BhD?;ikePQdp9FG#@mm3{vh@chL0hswSm1fG`oeh9cO z0Y3peBLRP@4E}N%{I9@Cd`Ezj_0F|cg7zrVL@b0<7?8C><+-old3&cUwDEzL_h2dK@G?#{vM zdiunvmnnswVwrkZ;9w^_w6nLjzsrJ$dV9JGj-?M&)Op*;dp|$*LwWwc4<9b$cUErY zc9gu{OdfyEPwgGU2YA<5j^Ta0HznW?mBIf6oJ{{c;5CW(FO&JwL^t!!M41XIcFHiTH7OPEW-DY+3wAfpdxPhk!MXWBgwP zPNshfSmlque;qiVfd2+Knf~vA&)~a$SMgK%U(GL0|82e}+vne+`0@820Vn(KXJzm& z%i!Mti?7A$eV9)&zY5?az6lY0CTY6)seA#yIDIYO)lV^eHgK|kF(?@Wca*^wmBE{U zll2{nVD&-VU-?9SyX|{;-+tNv#GChc*kJj%D$l;0|Who!=&r#@9iHP8tCjQc;406Zv7$cdIb%vDQ&oOlVtk7 z;UT8k-Ti&t!SLn+3xjUWvwFRD$Ht9?!D6~MlTK6Qj=sXKfkKzi5APl*EDnm`yrGRv zjq^_a{i-+pk8M3eLp^<)f?d0>C;uYu*^s-~hx(rGHu4quSMiI>J(oBE@IdEa=eEM| zU{6=a4jL!uE^O3#K=Nc)=Z>MmP|)48vu8-~wY!7s3xoY79H)arWLv^f5=K;+pbzn) z*nCTid80x#Ru`A04tN@Px~v2yd@|h!y{v!=C$E3Um9Kwe&_5Vl9=<+|8^SQq6!F5W zuP|gCC&X8%L>6JSdkh7Gh3z|f23dra>U5B@h&9AzdmLD-E{4VG1jpnf`C5y+E^DJ} zJG%pupdBd)R0I>KuPpVn(x`z}>-*-;zP>^)#I>VuxMTg5S0JGc4O`P8uNAfp4DViQ z!Nn#imSql|E4Ck(Z3(dYJ%-zX#g=1uZP|CRrDXi&z+z)@{Q5HZEMQGh@%L9puocg` zt$$}>aAR-(br#a!$6`0?{-NOY7p)FD84ewnylLHzzO8-z*Y(lldzX@3V9jCvQcTKA?d<*YtvlxCS@5%V@ z0Zzt$S6Tc!%Hoff#otpF|E{w5_mstde_8y$2A1d#i$nhIVcc}~^>mfW`zyX_sSua{ z4`E=*_LG>Ggm(jrZ^ZHMDTDvK3_b{~{Nwmv0M;}f!%zA>#o^Z=+ZLhN%Ci!z>3<@o2|mSmNj>;Xy`697n<7| zR@n;9@R zdH#6_7^qkl1>1W1t`XDRjNszUnqFu4A0R{V?UN-xx0JkdS1EZh{l`f!KC`W`t$%QL zUn&n!i-)>YT z64g+S1wBKwl%{E57m*Nh_-FFd^EglOD*dN===U0a=be{3Z(HYZ*XBZ^_c!zwHVy~D zV9%z_!yBTeNAsr8mB9oTzB2Gu&8)L_xs0cljvINZt;Z%*iYO`H;xxBKY43{C#A)ky z)z{ZI)Hl{Q)i>8KuWzYut#7Me(NN#e(9qb>)X?0pyrHF`wSghoSl`&t*x1?K+yEU9T})5PmKhqf)bmfCD8^i_#X zHPqL87f+^@HWh}i*;ue;&QNC2 { + qcms_drop_transformer(transformer); + }); + + constructor(iccProfile, numComps) { + if (!IccColorSpace.isUsable) { + throw new Error("No ICC color space support"); + } + + super("ICCBased", numComps); + + let inType; + switch (numComps) { + case 1: + inType = DataType.Gray8; + this.#convertPixel = (src, srcOffset) => + qcms_convert_one(this.#transformer, src[srcOffset] * 255); + break; + case 3: + inType = DataType.RGB8; + this.#convertPixel = (src, srcOffset) => + qcms_convert_three( + this.#transformer, + src[srcOffset] * 255, + src[srcOffset + 1] * 255, + src[srcOffset + 2] * 255 + ); + break; + case 4: + inType = DataType.CMYK; + this.#convertPixel = (src, srcOffset) => + qcms_convert_four( + this.#transformer, + src[srcOffset] * 255, + src[srcOffset + 1] * 255, + src[srcOffset + 2] * 255, + src[srcOffset + 3] * 255 + ); + break; + default: + throw new Error(`Unsupported number of components: ${numComps}`); + } + this.#transformer = qcms_transformer_from_memory( + iccProfile, + inType, + Intent.Perceptual + ); + if (!this.#transformer) { + throw new Error("Failed to create ICC color space"); + } + IccColorSpace.#finalizer.register(this, this.#transformer); + } + + getRgbItem(src, srcOffset, dest, destOffset) { + QCMS._destBuffer = dest.subarray(destOffset, destOffset + 3); + this.#convertPixel(src, srcOffset); + QCMS._destBuffer = null; + } + + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + QCMS._destBuffer = dest.subarray( + destOffset, + destOffset + count * (3 + alpha01) + ); + qcms_convert_array( + this.#transformer, + src.subarray(srcOffset, srcOffset + count * this.numComps) + ); + QCMS._destBuffer = null; + } + + getOutputLength(inputLength, alpha01) { + return (inputLength / this.numComps) * (3 + alpha01); + } + + static setOptions({ useWasm, useWorkerFetch, wasmUrl }) { + if (!useWorkerFetch) { + this.#useWasm = false; + return; + } + this.#useWasm = useWasm; + this.#wasmUrl = wasmUrl; + } + + static get isUsable() { + let isUsable = false; + if (this.#useWasm) { + try { + this._module = QCMS._module = this.#load(); + isUsable = !!this._module; + } catch (e) { + warn(`ICCBased color space: "${e}".`); + } + } + + return shadow(this, "isUsable", isUsable); + } + + static #load() { + // Parsing and using color spaces is still synchronous, + // so we must load the wasm module synchronously. + // TODO: Make the color space stuff asynchronous and use fetch. + const filename = "qcms.wasm"; + const xhr = new XMLHttpRequest(); + xhr.open("GET", `${this.#wasmUrl}${filename}`, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return initSync({ module: xhr.response }); + } +} + +export { IccColorSpace }; diff --git a/src/core/image.js b/src/core/image.js index 7ab44bcf9006d..48b2ba3b40806 100644 --- a/src/core/image.js +++ b/src/core/image.js @@ -26,6 +26,7 @@ import { } from "../shared/image_utils.js"; import { BaseStream } from "./base_stream.js"; import { ColorSpace } from "./colorspace.js"; +import { ColorSpaceUtils } from "./colorspace_utils.js"; import { DecodeStream } from "./decode_stream.js"; import { ImageResizer } from "./image_resizer.js"; import { JpegStream } from "./jpeg_stream.js"; @@ -209,7 +210,7 @@ class PDFImage { colorSpace = Name.get("DeviceRGBA"); } - this.colorSpace = ColorSpace.parse({ + this.colorSpace = ColorSpaceUtils.parse({ cs: colorSpace, xref, resources: isInline ? res : null, diff --git a/src/core/pattern.js b/src/core/pattern.js index 598d5d2a93e7c..e515645e1765f 100644 --- a/src/core/pattern.js +++ b/src/core/pattern.js @@ -30,7 +30,7 @@ import { MissingDataException, } from "./core_utils.js"; import { BaseStream } from "./base_stream.js"; -import { ColorSpace } from "./colorspace.js"; +import { ColorSpaceUtils } from "./colorspace_utils.js"; const ShadingType = { FUNCTION_BASED: 1, @@ -127,7 +127,7 @@ class RadialAxialShading extends BaseShading { if (!isNumberArray(this.coordsArr, coordsLen)) { throw new FormatError("RadialAxialShading: Invalid /Coords array."); } - const cs = ColorSpace.parse({ + const cs = ColorSpaceUtils.parse({ cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), xref, resources, @@ -461,7 +461,7 @@ class MeshShading extends BaseShading { const dict = stream.dict; this.shadingType = dict.get("ShadingType"); this.bbox = lookupNormalRect(dict.getArray("BBox"), null); - const cs = ColorSpace.parse({ + const cs = ColorSpaceUtils.parse({ cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), xref, resources, diff --git a/src/core/pdf_manager.js b/src/core/pdf_manager.js index 02c4e58b40f99..49e8a754b3460 100644 --- a/src/core/pdf_manager.js +++ b/src/core/pdf_manager.js @@ -20,6 +20,7 @@ import { warn, } from "../shared/util.js"; import { ChunkedStreamManager } from "./chunked_stream.js"; +import { IccColorSpace } from "./icc_colorspace.js"; import { ImageResizer } from "./image_resizer.js"; import { JpegStream } from "./jpeg_stream.js"; import { JpxImage } from "./jpx.js"; @@ -73,7 +74,10 @@ class BasePdfManager { // Initialize image-options once per document. ImageResizer.setOptions(evaluatorOptions); JpegStream.setOptions(evaluatorOptions); - JpxImage.setOptions({ ...evaluatorOptions, handler }); + + const options = { ...evaluatorOptions, handler }; + JpxImage.setOptions(options); + IccColorSpace.setOptions(options); } get docId() { diff --git a/src/core/wasm_utils.js b/src/core/wasm_utils.js new file mode 100644 index 0000000000000..8a07d0461f0a5 --- /dev/null +++ b/src/core/wasm_utils.js @@ -0,0 +1,43 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class QCMS { + static _module = null; + + static _destBuffer = null; +} + +function copy_result(ptr, len) { + // This function is called from the wasm module (it's an external + // "C" function). Its goal is to copy the result from the wasm memory + // to the destination buffer without any intermediate copies. + const { _module, _destBuffer } = QCMS; + const result = new Uint8Array(_module.memory.buffer, ptr, len); + if (result.length === _destBuffer.length) { + _destBuffer.set(result); + return; + } + for (let i = 0, j = 0, ii = result.length; i < ii; i += 3, j += 4) { + _destBuffer[j] = result[i]; + _destBuffer[j + 1] = result[i + 1]; + _destBuffer[j + 2] = result[i + 2]; + } +} + +function copy_rgb(ptr) { + QCMS._destBuffer.set(new Uint8Array(QCMS._module.memory.buffer, ptr, 3)); +} + +export { copy_result, copy_rgb, QCMS }; diff --git a/test/pdfs/issue2856.pdf.link b/test/pdfs/issue2856.pdf.link new file mode 100644 index 0000000000000..dcd50973de99a --- /dev/null +++ b/test/pdfs/issue2856.pdf.link @@ -0,0 +1 @@ +https://github.com/user-attachments/files/19016079/version4pdf.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index 8c9058adfb31a..6408845cdbc0e 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -11923,5 +11923,13 @@ } } } + }, + { + "id": "issue2856", + "file": "pdfs/issue2856.pdf", + "md5": "a13033722b99d7b24a1383ac793d2b51", + "rounds": 1, + "link": true, + "type": "eq" } ] diff --git a/test/unit/colorspace_spec.js b/test/unit/colorspace_spec.js index ca1a742a48b8e..2833d4c8c86e5 100644 --- a/test/unit/colorspace_spec.js +++ b/test/unit/colorspace_spec.js @@ -16,6 +16,7 @@ import { Dict, Name, Ref } from "../../src/core/primitives.js"; import { Stream, StringStream } from "../../src/core/stream.js"; import { ColorSpace } from "../../src/core/colorspace.js"; +import { ColorSpaceUtils } from "../../src/core/colorspace_utils.js"; import { LocalColorSpaceCache } from "../../src/core/image_utils.js"; import { PDFFunctionFactory } from "../../src/core/function.js"; import { XRefMock } from "./test_utils.js"; @@ -66,7 +67,7 @@ describe("colorspace", function () { xref, }); - const colorSpace1 = ColorSpace.parse({ + const colorSpace1 = ColorSpaceUtils.parse({ cs: Name.get("Pattern"), xref, resources: null, @@ -75,7 +76,7 @@ describe("colorspace", function () { }); expect(colorSpace1.name).toEqual("Pattern"); - const colorSpace2 = ColorSpace.parse({ + const colorSpace2 = ColorSpaceUtils.parse({ cs: Name.get("Pattern"), xref, resources: null, @@ -84,7 +85,7 @@ describe("colorspace", function () { }); expect(colorSpace2.name).toEqual("Pattern"); - const colorSpaceNonCached = ColorSpace.parse({ + const colorSpaceNonCached = ColorSpaceUtils.parse({ cs: Name.get("Pattern"), xref, resources: null, @@ -93,7 +94,7 @@ describe("colorspace", function () { }); expect(colorSpaceNonCached.name).toEqual("Pattern"); - const colorSpaceOther = ColorSpace.parse({ + const colorSpaceOther = ColorSpaceUtils.parse({ cs: Name.get("RGB"), xref, resources: null, @@ -135,7 +136,7 @@ describe("colorspace", function () { xref, }); - const colorSpace1 = ColorSpace.parse({ + const colorSpace1 = ColorSpaceUtils.parse({ cs: Ref.get(50, 0), xref, resources: null, @@ -144,7 +145,7 @@ describe("colorspace", function () { }); expect(colorSpace1.name).toEqual("CalGray"); - const colorSpace2 = ColorSpace.parse({ + const colorSpace2 = ColorSpaceUtils.parse({ cs: Ref.get(50, 0), xref, resources: null, @@ -153,7 +154,7 @@ describe("colorspace", function () { }); expect(colorSpace2.name).toEqual("CalGray"); - const colorSpaceNonCached = ColorSpace.parse({ + const colorSpaceNonCached = ColorSpaceUtils.parse({ cs: Ref.get(50, 0), xref, resources: null, @@ -162,7 +163,7 @@ describe("colorspace", function () { }); expect(colorSpaceNonCached.name).toEqual("CalGray"); - const colorSpaceOther = ColorSpace.parse({ + const colorSpaceOther = ColorSpaceUtils.parse({ cs: Ref.get(100, 0), xref, resources: null, @@ -193,7 +194,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources, @@ -244,7 +245,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources, @@ -291,7 +292,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources, @@ -348,7 +349,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources, @@ -401,7 +402,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources, @@ -458,7 +459,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources, @@ -516,7 +517,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources, @@ -576,7 +577,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources, @@ -634,7 +635,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources, @@ -696,7 +697,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources, @@ -764,7 +765,7 @@ describe("colorspace", function () { const pdfFunctionFactory = new PDFFunctionFactory({ xref, }); - const colorSpace = ColorSpace.parse({ + const colorSpace = ColorSpaceUtils.parse({ cs, xref, resources,