av6-pdf-engine 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +34 -2
- package/dist/index.d.ts +34 -2
- package/dist/index.js +326 -77
- package/dist/index.mjs +325 -77
- package/package.json +1 -1
- package/tmp/border-showcase.pdf +0 -0
- package/tmp/quote-details.pdf +0 -0
package/dist/index.mjs
CHANGED
|
@@ -30,6 +30,11 @@ function toPdfEngineError(cause, fallback) {
|
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
// src/images/index.ts
|
|
34
|
+
var images = {
|
|
35
|
+
default: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7d17vKdzvf7x1zUzDgkhCakcyjGiTRhUbKldMSaVIp1P0t7ZO4UOKOWUXbsT2XLIUFE5poiQ0zi1lZz9kJwihxAZZub9++O+R8tYa836rvX93u/7cD0fj/WYvc3M+lymsd7Xuu/P/bkVEbSRpIWA1YA1hnwsCywJLDHfx/MB5SQ1M7OKBfA48Nh8H48CDwA3Dfm4NSKeTso5UGpDAZA0GXgNsBUwFVgTWBWYkpnLzMwabzZwG3AjcClwHvB/ETEnNVUfNLIASBLwamBLiqH/Oorv7M3MzAbtUeBCijJwPvCHaOAwbVQBkPRKYJfyY+XcNGZmZgD8CZgBzIiIW5KzjFntC4CkpYEdgfcBmybHMTMzG81M4DjgxIh4ODvMaGpbACStDuwF7AQskhzHzMysF7OAHwEHRcTN2WGGU7sCIGk94PPAO4FJyXHMzMwmYi7wU+CAiLgmO8xQtSkAkl4LfAHYFj+SZ2Zm7RLAGcDXIuKK7DBQgwIgaTngUIqNfWZmZm03A9gjIu7PDJF2iV3SJEmfpDhowcPfzMy6YhfgJkmflJQ3hzOuAEjaEDgc2LDyxc3MzOrjKmDXiLiq6oUrbR6Spkg6ELgcD38zM7MNgcslHSip0tNrK7sCIOklwE+AzStZ0MzMrFkuBt4dEXdXsVglVwAkvRn4PR7+ZmZmI9kc+H05MwduoAVA0mRJBwC/pHgTn5mZmY1sWeCXkg4oX3Q3MAO7BSBpMeAk4K0DWcDMzKzdzgTeFRFPDOKTD6QASFoG+AU+u9/MzGwiZgJvi4iH+v2J+14AJL0UOAtYu6+f2MzMrJuuB94cEXf285P2dQ+ApLWBS/HwNzMz65e1gUvLGds3fbsCUAa7CFimL5/QzMzMhnoI2CIiru/HJ+tLASgv+18KrDThT2ZmZmYjuQuY2o/bARO+BVBu+DsLD38zM7NBWwk4q5y9EzKhAlA+6vcLfM/fzMysKmsDvyhn8LiNuwCUBxSchB/1MzMzq9qmwEkTOSxoIlcA9seH/JiZmWV5K8UsHpdxbQIszyn+JaDxLmxmZmYTFsBbIuKsXn9jzwWgfKvf7/HZ/mZmZnXwALB+r28R7OkWQPmu4p/g4W9mZlYXywI/KWf0mPW6B2B//EpfMzOzutmcHvcDjPkWgKR/Aa5gwK8QNjMzs3GZC7w2In43ll88pgIgaRJwGbDRxLKluo3iBKV7hnzcW/54P8UfnJmZtd8kYDlgRWCF8sd5HysBq+ZFm7ArgU0iYoEzbawF4OPA9/sQrEpzgEuAU4FTI+L25DxmZtYAklYBti8/NgPG/ax9kk9ExBEL+kULLACSXgTcBCzdp2CD9CTwa4qhf0ZEPJCcx8zMGkzSssC2FGVgG2DR3ERj8jCwRkT8dbRfNJYCcDTwwT4GG4TZwFHAlyPi3uwwZmbWPpJWAPYFPgz0tOM+wTER8aHRfsGoBaDc+Hcl9T7w5xRg74i4KTuImZm1n6Q1gAOB6dlZRhHARqNtCFzQjv4vUN/hfzHFKxHf7uFvZmZViYibIuLtwFSKWVRHopjhI/+Cka4ASHoVcA31KwCzgF0j4pjsIGZmZpI+CBwOLJKdZT4BrBcR1w73k6NdAfg89Rv+9wFbevibmVldlDNpS4oZVSeimOXD/+RwVwAkvRK4gXo9+nA1MC0i7swOYmZmNj9JLwVOAzbIzjLEHGCtiLhl/p8Y6QrAXtRr+P8M2NzD38zM6qqcUZtTzKy6mEwx05/jOVcAJC1NcUJeXe5lHAp8Lsbz3mIzM7OKSRJwCLBHdpbSLGCFiHh46D8c7grAjtRn+P8MD38zM2uQcmZ9jvpcCViEYrY/y3BXAC4FNq0o1Giuprjs/0R2EDMzs15JWoziMcE67AmYGRFTh/6DZxWAcvPfzVWnGsZ9FAcY+J6/mZk1Vrkx8ErgxdlZgNWHbgac/xbALhWHGc4sYLqHv5mZNV05y6ZTzLZsz5rxzxSActNCHQrArhExMzuEmZlZP5QzbdfsHMAu5awHhtwCkLQ+xX33TBdHxBbJGczMzPpO0kUUjwlm2iAifg/PvgWwZVKYoT6XHcDMzGxA6jDjnpn1QwvAVglBhjrFl/7NzKytyhl3SnKMZ2a9IgJJk4GHgCWTAs0GXuW3+pmZWZuVrxK+FpiSFOFRYJmImDPvCsBryBv+AEd7+JuZWduVs+7oxAhLUsz8Z24BZF7+fxLYL3F9MzOzKu1HMfuybAX/LABTR/mFg/briLg3cX0zM7PKlDPv14kRpsI/C8CaiUFOTVzbzMwsQ+bsWxNAwELAE+RsSJgDLB8RDySsbWZmlkLSssBfKF7XW7XZwGKTgNXI2414iYe/mZl1TTn7Lklafgqw6iRgjaQA4Mv/ZmbWXam3AVwAzMzMcmTOwDUyC8BtEXF70tpmZmapyhl4W9Lya0wClk1a/K6kdc3MzOoiaxYuO4m8EwDvSVrXzMysLrJm4ZKTgCWSFncBMDOzrsuahUu4AJiZmeVJKwBTyCsAPv63pSRNAl5OscF0DWB1ir0mS4zwMQV4DPh7+ePQj0eAW4GbgZuAWyLiiQr/dczMBilrFqYWAF8BaAFJiwKbAa8H1qEY+K8AFunxUy1dfixISLqTogzcBMwEzouIv/S4nplZHaRdARAwl+JI4KqtExHXJ6xrEyBpCrARxduk/pXipRK9DvtBuB74Tfnx24j4W3IeM7MFkrQ2cF3C0iEgEhYGWCsibkxa23ogaRFgW2BniqGfddVorOYCvwNOAk7w2ybNrK4krQnckLI2LgA2AkmbAbsAOwJLJccZrzkUVwWOA07x/gEzq5PMApD1EiCrKUkrAR+mGPyrJcfph8nANuXH3yX9DDg6Ii7KjWVmlmtSdgCrB0mrSTqSYsf9frRj+M9vceADwIWSLpH0luQ8ZmZpXAA6TtI6kk6g2FH/EWDh5EhVmQqcKen/JL2jfHTRzKwz/EWvoyRtIOkU4I/AThSXyrtoA+CnwHWSdnERMLOu8Be7jpG0lKTDgKuA7cl5BLSO1qTYKHiZpH/JDmNmNmguAB0i6b3AjcCu+H/7kWwEXCHpu5Ka+uSDmdkCeQh0gKS1JJ0PzABenJ2nASYBuwE3lqXJzKx1XABaTNJkSfsBvwfekJumkV4MzJB0vqSXZYcxM+snF4CWkvQS4DxgX7qzs39Q3gBcLWnb7CBmZv3iAtBCkv6N4rv+12VnaZFlgNMlHSppoewwZmYT5QLQIpKmSDoYOJPi9bvWf58BLpL08uwgZmYT4QLQEpJWBC4EPocf7Ru0jSluCfgkQTNrLBeAFpC0OnAJsGl2lg5ZmuKWwIeyg5iZjYcLQMNJ2gi4GFg5OUoXTQaOkrRXdhAzs165ADSYpDdS7PR/UXaWjjtQ0jcl+daLmTWGC0BDSXoPxWa/xbOzGAC7A8f7CQEzawoXgAaS9GHgBMDDpl52Ak6RNCU7iJnZgrgANIykacAReKd/Xb0VOMa3A8ys7lwAGkTSFsBP6O6re5vivcCh2SHMzEbjAtAQktYFTgcWzc5iY/Jfkj6bHcLMbCQuAA0gaWXgbMCvp22WgyW9PzuEmdlwXABqTtILKIb/CtlZrGcCflA+rmlmVisuAPV3FLB6dggbtynACeVRzWZmteECUGOSdgN2yM5hE/Yi4EeSvHnTzGrDBaCmJG0A/Hd2Duub1wP7ZIcwM5vHB5bUkKQlgBOBRbKz9MkjwD3DfNxd/vgkxR6HFef7eEn543K0o6x+UdJvI+K87CBmZi4A9XQE8MrsEBPwOPBr4FTgzIh4cAy/5+qRfqI8Xvd1wLTy42X9CJlgEsV+gPUj4r7sMGbWbQIiae21IuLGpLVrS9KOFIf9NM39FOcUnAacGxFPDmqh8vbINGB74NWDWmeATo2I6dkhzCyfpDWBG1LWxgWgNiQtCdxIcx75exo4kuK9BJdFxNyqA0h6OfB24L+AlapefwK2jYhfZIcws1yZBaAN91XbZH+aMfyDYo/CWhGxW0RcmjH8ASLijoj4JsWjkntT7Ddogu9Iel52CDPrLheAmigva++WnWMMLgA2joh3R8St2WHmiYh/RMRBwGrAt4CnkiMtyMrAl7JDmFl3uQDUgKRJwOHU+yU/1wFvi4gtI+LK7DAjiYgHI2J3YC2KvRRZt7jG4jPl5T8zs8q5ANTDR4GNs0OM4ElgV+DVEXFmdpixiojbIuI9wGsp9lXU0cIUxc/MrHIuAMkkLQZ8NTvHCO4FXh8R34+IOdlhxiMirgI2AX6ZnWUEb5C0bXYIM+seF4B8HwOWzQ4xjCuBDSPiiuwgExURjwDbAodmZxnBF7IDmFn3uAAkkrQwsEd2jmH8CHhdRNyTHaRfImJuRHwWeB8wKzvPfDaW9K/ZIcysW1wAcn2A4rjbupgL7B0ROw/yIJ9METGD4lz+e7OzzMdXAcysUi4ASco3w+2ZnWOIWcD25aN0rRYRlwMbAX/MzjLElpI2zQ5hZt3hApDnPcCq2SGG+EREnJEdoioRcTfwNoojjOvCVwHMrDIuAHk+lx1giG9ExLHZIaoWEX+mOEa4LocGvVXSq7JDmFk3uAAkkPQvwLrZOUpnU68yUqmIuAT4ZHaOIT6QHcDMusEFIMcu2QFKNwE7NvUZ/36JiKMojg+ug53L/SFmZgPlAlAxSVMo7v9n+xuwXfmMvMFngHOyQwDLA2/KDmFm7ecCUL03AcslZ5gDvDsibk7OURvlVZAdgVuyswDvzw5gZu3nAlC9Olz+Pyoizs4OUTcR8TDw8ewcwDRJS2WHMLN2cwGokKQlgWnJMR4H9kvOUFsRcT757w1YhOJqhJnZwLgAVOstwKLJGb4REXU7Ba9u9qQ4FTHTDsnrm1nLuQBUK/u89/uBrydnqL2IuBb4YXKMzcp3RZiZDYQLQLWyC8CXI+Kx5AxNsQ/wj8T1FwM2TlzfzFrOBaAiklYBVkmMcAvwv4nrN0pE3EX+2QBbJq9vZi3mAlCd7O/+946I2ckZmuYg4MHE9bdKXNvMWs4FoDqZBeDWiPh54vqNVB6SdERihE0kPS9xfTNrMReACkgSud/NnZq4dtOdkrj2IsDUxPXNrMVcAKrxcnJP/3MBGKeIuAq4KzHCRolrm1mLuQBUY43Ete8HLk1cvw1OS1w78++OmbWYC0A1Mr+InxER2YfaNF3mFRQXADMbCBeAamR+Effl/4n7LcXbEzO4AJjZQLgAVCPri/jjwLlJa7dGRDwNnJm0/DKSlk1a28xazAWgGqsnrXtWRDyZtHbbZF5Jyfr7Y2Yt5gIwYJIWA1ZKWv6ipHXbKPPP0rcBzKzvXAAG7+WAktb2W//6569A1kmKKyeta2Yt5gIweEsmrn1P4tqtUj5JcV/S8pl/h8yspVwABm+JxLV9BaC/sv48M/8OmVlLuQAMngtAe7gAmFlruAAMXtYX70cj4omktdvKBcDMWsMFYPCyvnj7/n//Zf2ZugCYWd+5AAxe1hdvX/7vP18BMLPWcAEYvMWT1s3asd5mWX+mWX+HzKzFXAAGb1bSuh4a/Zf1Z5r1d8jMWswFYPAeS1p3haR12yzrzzTr75CZtZgLwOBlffFeMWndNsv6M3UBMLO+cwEYvKwv3stJ8v++/eUrAGbWGh4Qg/f3pHUnA8slrd1WWQUg6++QmbWYC8DgZX735n0A/eUrAGbWGi4Ag5f5xdv7APrLewDMrDVcAAYv83l8XwHoE0mL4zMdzKxFXAAGLCLuJe87uDWS1m2jzD/LmxLXNrOWcgGoRtYX8O2S1m2jzD9LFwAz6zsXgGrcnLTu6pLWTlq7baYnrfsU8Kektc2sxVwAqpH5Hdz2iWu3gqRVgXWTlr81IuYkrW1mLeYCUA0XgGbL/DP05X8zGwgXgGpkfhHfUNJKieu3Qdblf3ABMLMBcQGoxk3A00lrC5iWtHbjSVoOmJoY4drEtc2sxVwAKhAR/wAuT4zg2wDjty25/51ckLi2mbWYC0B1fpO49hskrZK4fpN9MHHtWyLirsT1zazFXACqk1kApgBfTVy/kSRtC2yWGOH8xLXNrOVcAKpzOfBE4vrvkfSaxPUbRdJk4KDkGC4AZjYwLgAViYingIsSIwg4OHH9pvkAkH2IkguAmQ2MC0C1zktef2tJ2yRnqD1JzwO+khzj+ojwS4DMbGBcAKr1q+wAwMGSlB2i5nYn/1XKdfi7YmYt5gJQoYj4I/CH5BjrAzsnZ6gtSS8E9srOAczIDmBm7eYCUL3jsgMAX5P0guwQNXUAsGRyhj9ERHZRNLOWcwGo3o+A7Je7vAw4sdzpbiVJHwY+lp0D+GF2ADNrPxeAikXEX4BzsnMAbwK+nh2iLiRtDhyWnQOYDZyQHcLM2s8FIEcdbgMA/KekD2WHyCbp5cDJwMLZWYCzIuL+7BBm1n4uADlOBR7LDlE6vPzut5MkLQ6cDrwoO0vJl//NrBIuAAnKlwP9IDtHaWHg5+V3wZ1SPg45A1gvO0vpz8Bp2SHMrBtcAPIcCszKDlFaDjhNUvbu96p9jXq9KfGQiMh6bbSZdYwLQJKIuAc4NjvHEK8GLpW0anaQQZO0kKQjgL2zswxxH3BUdggz6w4XgFwHU+z6rot1gCskvT47yKCUB/2cQz0e9xvqvyPiyewQZtYdLgCJIuJ24MfZOebzQuAcSR/PDtJvktYBrgTqVnAeAg7PDmFm3eICkO9AILJDzGch4PuSviNpSnaYfpD0NmAmsEp2lmF8OyL+nh3CzLrFBSBZRNxA/a4CzPMp4FeSls4OMhGS9qTYXb9EdpZhPAh8OzuEmXWPC0A97AE8mh1iBFsD10v6RNOuBkjaVNJFwEHU9+/6nhHxcHYIM+ueun5R7JSIuBfYJzvHKJanuEd9naQdssMsiKQ1JJ0MXArU+ZCjmcDR2SHMrJtcAOrju+S/KnhBVgd+JukySa/LDjM/SSuUj/ddC0zPzrMAc4BdI6Ju+z/MrCNcAGoiIuYAu1K/DYHD2Rj4raQzJK2bHUbSCyR9Ffh/FI/3NeFWxXf8yl8zyyTyBs5aEXFj0tq1JelI4CPZOXp0DcX7DU6NiKurWFDSi4HtKL7T3wpYpIp1++QeYM2IqMv7IMwsiaQ1gRtS1sYFoFYkLUMxUF+SnWWc7qAsA8BF5ZWNvpD0Coqje6cDm9DcK1jTI+LU7BDWDeU7L54PLEnxJMws4M8RMTc1mAEuADaf8v76ecDk7CwT9CBwFnArcC/Fd773lh/3DXfufXlS3wrAiuWPK1CUoS0pTipsuu9ExH9kh7B2kbQaxRM7WwMv45/DfglgcZ5blp8EbgZuAm4c+qPPpKiWC4A9h6TPU7yspq0CeICiDPyDYtAvT/F2wrb6HTA1Ip7KDmLNVl4p/FeKgf9G+nvA1c3AccCxEXF3Hz+vDcMFwJ6jvGx3FrBNdhbri0eA10TEbdlBrJkkPR/4JPAu4DUM/hbYHOBsipdUneE3VQ5GZgFo6j3U1isfD3svxWVza74Pe/jbeEh6nqT/BG4DDgE2pJqv3ZOBtwA/B+6SdKiktSpY1yriAlBjEfFXYCeKJm7N9d2I+Hl2CGsWSYtI+hTFHppvAMslxlkO+AzFqaAnS1ohMYv1iQtAzUXEbynOB7BmOgv4r+wQ1hySFirfxnkL8B2K/TF1Mp2iCDTtcWWbjwtAA0TEkcCXsnNYz64A3uF7pzZWkl4FXAd8H3hpcpzRLAUcKem88gkEayAXgIaIiK9SHBdszXAj8JaIeDw7iDWDpOkU74d4ZXaWHmwJ/FHSHpKa/thy57gANMungROzQ9gC3Q28KSIezA5i9afCfhSb7RZPjjMezwO+DlzmqwHN4gLQIOXJXe8Dzs3OYiN6mGL4/zk7iNWfpMWBk4F9KR7LbrINKd4R8orsIDY2LgANUx4isz3w6+ws9hx/Bd4YEddlB7H6k7QqxSX/7bOz9NFLgAskNek2Rme5ADRQeV/5bcCPs7PYM24HNouI32UHsfqTtBlwJfCq7CwDMK8ErJ4dxEbnAtBQ5c7ynYFvZWcxrqEY/rdkB7H6k7Q5xeOhy2RnGaAVKUrAGtlBbGQuAA0Whd2Bz2dn6bALgddFxL3ZQaz+yu/8f0UzN/v1agXgfJeA+nIBaIGIOBD4MODnzat1MsWGv0eyg1j9lcP/LLox/OdZgeJKwKrZQey5XABaIiKOBl4PePf54M0G9qQ45OfJ7DBWfx0d/vMsD5xWPvFgNeIC0CIRMRPYADgjO0uL3Q1sGRGHlC9sMhtVxy77j+RVwHHlW06tJlwAWiYiHgKmAXvgWwL9djawfkRcnB3EmkHSVIrhv0R2lhqYDuyTHcL+yQWghcrNgf+Nbwn0yxzgi8C/RcQD2WGsGcrhfxYe/kPtWx55bDXgAtBi5S2BdYFv41cKj9cVwMYR8TVf8rex8vAfkShuBbTx/IPGcQFouYh4NCI+TXFM52XZeRrkQeBjwCY+3Md6IWlTPPxHszjFpsA2n4PQCC4AHRERvwemAh+lGG42vAB+AKwREUf6u37rRTn8z8bDf0FWBU70GwRzuQB0SLk34AfAGhTvG/cmwWe7FNg0Ij7qN/lZrzz8e7Y1cGh2iC5zAeigiHgwInYFVgO+A/wjOVK23wBbRcRmEXF5dhhrHl/2H7fdJb0/O0RXuQB0WETcGRH/AawMHAw8lpuoUkFxXsImEbF1RJyfHciaSdImFMN/yewsDXWEpI2zQ3SRC4AREfdHxF7Ayyie070nOdIgzQJ+RPE8/3b+jt8mohz+Z+PhPxGLACdLWiE7SNe4ANgzIuJvEbE/8FLgzRSvG27L7YGZwCeA5SNi54i4JjuQNZuHf1+tSFECFskO0iWiuBSaYa2IuDFpbRsjSUsC7wLeD2yeHKdXfwZmAMdFxM3ZYaw9PPwH5piI+FB2iCpJWhO4IWVtXABsjCStDLwR2LL8WD4zzzCepNjJf175cZkf47N+K+9X/xoP/0HZPSK+lR2iKi4A1kiS1gK2oigDrwNeVHGEWcCVFMP+fGBmRMyqOIN1SMOH/2M04ymF2cCbI+I32UGq4AJgrSDpRRRnDKwBrD7k/14NWGgCn/pu4Gbgpvk+7ogIH3FslWjY8H8a+BnFhtdbKf5beULSS4HNKG7nvRd4QV7EUT0IbBQRt2cHGTQXAGu18rSvJSm++xjuYwrFdyd/L38c+vGIv6u3bOXwP5v6Dsyhfgu8NyLuGu0XSXohsC/w75Wk6t0fgakR8ffsIIPkAmBmVlOSXkvxnX8Thv+hwF69XBmT9HHgMOr5VNjJwDvavJcnswDU8X9wM7NaaNjw3zsiPtvrbbGIOAL48IAyTdTbgS9lh2grFwAzs2E0cPgfNN7fHBHHUpwGWkf7Sdo+O0QbuQCYmc1H0kZ0ZPgP8Xngl334PP0mYIakdbKDtI0LgJnZEOXwP4dmDP/P92n4ExFzgZ0onrCpm8WB0yQtnR2kTVwAzMxKDRz+B/bzE0bEI8A04JF+ft4+WQ04sXyqyPrABcDMjMZd9u/78J8nIm6iuBIwdxCff4LeCHw9O0RbuACYWedJ2pBi+C+VnWUMvjCo4T9PRPwS+MIg15iA/5T0vuwQbeACYGadVg7/c2jO8D+gioXKvQUnVrHWOBxRPqVhE+ACYGad5eG/QB8Crq54zbFYFDhF0grZQZrMBcDMOqlhw/+LCcOfiHgC2B74a9Vrj8GKwMmSFskO0lQuAGbWOZL+hWYN/69lLR4RfwbeQfGCobrZhOIYYxsHFwAz65Ry+J+Lh/+YRcSFwKezc4zgQ5Lq+kKjWnMBMLPOaNh3/l+qw/CfJyIOB/43O8cIviFpq+wQTeMCYGadMGT4N+E0uS9FxFezQwzjU8DF2SGGMQU4SdIq2UGaxAXAzFpP0mvw8J+wiHga2AG4MzvLMF5IcVzw87ODNIULgJm1Wjn8z6UZw3+fug7/eSLifmA68I/sLMNYF/ihJGUHaQIXADNrrQYO//2zQ4xFRPwO+Eh2jhHsAHwxO0QTuACYWSt5+A9WRPwIOCQ7xwi+LGladoi6cwEws9aRtAHNuee/b9OG/xB7A2dlhxiGgBmS1s4OUmcuAGbWKuXwPxdYJjvLGOwbEV/JDjFeETEXeA9wc3aWYSxBsSmwCSUwhQuAmbWGh3/1IuJvwDTg0ewsw3gFcKKkydlB6sgFwMxaoWHDf782DP95IuJGYGdgbnaWYbyR+u5VSOUCYGaNJ2l9mjX8v5wdot8i4hfAl7JzjOC/JO2SHaJuXADMrNHK4f8bPPzTlW8sPCk7xwj+V9JG2SHqxAXAzBqrYcP/y20e/kN8EPhDdohhLAqcImn57CB14QJgZo3UsMv+X46I/bJDVCEinqDYFPhAdpZhvAQ4WdLC2UHqwAXAzBpH0qsphv8Ls7OMQWeG/zwRcQfwDmB2dpZhbAoclh2iDlwAzKxRyuH/Gzz8ay0ifgvsnp1jBB+W9KnsENlcAMysMRo2/L/S1eE/T0R8D/hBdo4RfFPSltkhMrkAmFkjNHD475sdoiZ2Ay7NDjGMKcBJklZOzpHGBcDMak/Senj4N1JEPAW8HbgrO8swlqU4Lvj52UEyuACYWa01bPjv7+H/XBFxHzAdeDI7yzDWA46VpOwgVXMBMLPaGjL8l83OMgb7R8Q+2SHqKiKuAj6anWME7wC+kB2iai4AZlZLHv7tExHHA4dm5xjBVyRtlx2iSi4AZlY7ktalOcP/qx7+PdkLODs7xDAEHC9p7ewgVXEBMLNaKYf/eTRn+Nf1BTi1FBFzgHcD/y87yzCWoNgUuHR2kCq4AJhZbXj4d0NE/A3YDngsO8swXgH8RNLk7CCD5gJgZrXQsMv+X/Pwn5iIuAF4LxDZWYaxDXBwdohBcwEws3SSXkUx/F+UnWUMvhYRX8wO0QYRcTpQ1/0Tn5H03uwQg+QCYGapyuF/Hh7+XfU14GfZIUZwpKQNHfRygQAAHZJJREFUs0MMiguAmaVp2PA/wMO//yIigA8A1yRHGc6iwCmSls8OMgguAGaWooHDv3MHxVQlIh4HpgEPZGcZxkrAzyUtnB2k31wAzKxyktbBw9+GiIg/Ae8CZidHGc5U4HvZIfrNBcDMKtWw4X+gh391IuJ84D+zc4zgI5J2yw7RTy4AZlaZIcN/uewsY3BgRHw+O0TXRMR3gaOzc4zgfyS9ITtEv7gAmFklPPytB7sCM7NDDGMK8FNJKyfn6AsXADMbuPJ89aYM/4M8/HNFxFPA24G7s7MMY1ngVEmLZQeZKBcAMxuocvifT3OG/97ZIQwi4i/AdODJ7CzDeDVwbHaIiXIBMLOB8fC3iYiIK4GPZecYwTslNXqDqAuAmQ1Ewy77H+zhX08RMQP4RnaOEewvadvsEOPlAmBmfTdk+L84O8sYHBwRe2WHsFF9DjgnO8QwBBwvaa3sIOPhAmBmfVV+MfTwt76JiDnAjsCt2VmGsSRwmqSlsoP0ygXAzPqmHP7n4+FvfRYRD1McF/xYdpZhvBL4iaRGzdRGhTWz+mrY8D/Ew795IuI6YBcgsrMM403AwdkheuECYGYT1sDhv2d2CBufiDgN2C87xwj2kLRzdoixcgEwswmRtCbNuefv4d8O+wMnZ4cYwQ8k/Ut2iLFwATCzcSuH//lAE96X/nUP/3aIiADeB/wxO8swFqU4KbD2hdgFwMzGpYHD/3PZIax/IuJxik2BD2ZnGcZKwM8lLZwdZDQuAGbWMw9/q4OIuB14FzA7O8swNgO+mx1iNC4AZtYTSWvQnOF/qId/u0XEecBnsnOM4KOSPpkdYiQuAGY2ZuXwv4DmDP/PZoewwYuIbwPHZOcYwbckvT47xHBcAMxsTBr4nb+Hf7fsClyWHWIYU4CfSXp5dpD5uQCY2QINGf4rZGcZg//28O+eiJgFvB24JzvLMJaleDJgsewgQ7kAmNmoGjj898gOYTki4l5gOjArO8sw1qdmtymmZAew+pA0BXgRxSXeFwPLAI8CD8z7iIi/5SW0qklaHQ9/a5CIuELSx4Fjs7MM412S/hARB2QHAReAzipf17o1sBWwGsXAX5bi9Zaj/b7ZFM/d3kGxGex84KLymVxrkXL4X4CHvzVMRPxQ0vrA7tlZhrG/pGsi4hfZQUTeSxXWiogbk9buHEnLUwz8N5Y/rtjHT/80cAXFcbDnARdHRB2fy7UxGvKdfz//ngzKNyKiro+BWRJJk4GzKL7e1c2jwMYRcWN5psYNGSFcAFqufPxkb4o3VVXlDuB/gB9ExN8rXNf6wMPf2kLSMsCVwKrZWYZxM7AxxS3XlALgTYAtpMJ2kmZSXMKtcvgDvBz4JvBnSV9rwpnYVpD0Sjz8rSUi4iGK44Lr+I3I6sCPSZzDvgLQIuUmvp2APYG1k+MMNQs4Djg4Im7NDmPDK4f/BTRj+H8zIv4rO4Q1g6TpwM9ZwB6nJKdRlJTKuQC0RLmp70fAq7OzjOIJinLyvfJtXlYTHv7WdpL2A/bNzlEnvgXQApI+BfyOeg9/gMWA7wC/lrRSdhgrNOyyv4e/jdeXgVOyQ9SJC0CDSVpO0pkUQ3XR7Dw92Br4o6T3ZgfpuiHD/yXZWcbgfzz8bbzKq47vA67NzlIXLgANJektwB+Bt2RnGaelgBmSfibphdlhukjSK2jW8P/P7BDWbOVTSdOAh7Kz1IELQMOUO/wPAM4ElsvO0wc7AFdKWic7SJeUw/8CPPytYyLiNmBHYE52lmwuAA0i6XnASRTP9bfJKsBMSW/LDtIFDRv+3/Lwt36LiHOBzp8c6QLQEOWz9BcA70iOMihLAKdJ8lvcBqiBw7+OR7laC0TE/wA/zM6RyQWgASStS3HU7muzswzYJOAQScdKWjg7TNs07J6/h79V4eMUX1s7yQWg5iT9G3AJ8LLsLBV6P3C+pDbscagFSatRDP8mPH7p4W+ViIhZFK8Pvjc7SwYXgBqTtBtwBsXl8a6ZClwhab3sIE1XDv8LaMbw/7aHv1UpIu4B3k5xYmmnuADUkKTJkr4FfBeYnJ0n0cuBSyRtnx2kqRo4/D+dHcK6JyIuA3bNzlE1F4CakbQEcDrwH9lZamJx4GRJbXvyYeA8/M3GLiKOAb6dnaNKLgA1IumlwMU093CfQRFwgKTjJTXpxMM0klalOff8v+PhbzXxGeC87BBVcQGoCUkbUuxG9T3vke0MXCBp+ewgdVYO/wuAlyZHGYvvRISvdlktRMRs4F3A7dlZquACUAOS3g5cCHiwLdjGFCcHbpAdpI48/M0mJiIepDgu+PHsLIPmApBM0p7Az4DnZWdpkJWAiyXtkB2kTho2/L/r4W91FRF/pHhxUKtfW+4CkETSQpKOAg6iuMdtvVkM+KmkfbKD1EEDh/+/Z4cwG01EnAzsn51jkERew1krIm5MWjuVpKWBnwNbZmdpiROBD0bEP7KDZJC0CsXwb8JhUR7+1hiSBJxCcUugdXwFoGLlo1kz8fDvpx2BCyWtmB2kah7+ZoMTEQHsAlyXnWUQXAAqJGkL4HJgjewsLbQhxebADbODVKVhw/97Hv7WRBHxGMUVgIezs/SbC0BFJO0CnAu8MDtLi61IcSXg3dlBBq2Bw/9T2SHMxisibqW40jgnO0s/uQAMmAr7A8cBfsPd4D0P+LGkr5T371rHw9+sehFxDvC57Bz95AIwQOWpdT8GvpidpYO+RPGUwGLZQfpJ0soUJ/w1Yfgf5uFvbRIR3wBmZOfoFxeAASlfZXs+xWUjy7EDxXkBTXg0boHK4X8BxUuS6u6wiNgtO4TZAHwMuDI7RD+4AAyApLUpNvttkp1lAp6i2Pn6QHaQCdqA4rXCTf7fwsPfrCYi4klgOvCX7CwT5QLQZ5K2AS4FVk6OMh63Ah8C1gUWj4hXRcSLKI4o3ho4gWaejLU8xTsE3psdZDwaNvwPB3zZ31otIu4G3k7xjVJjuQD0kaRPAGcCL8jO0qMngC8A60TEMRFxbUQ8Pe8nI+K+iPhNRLyX4iz+i7OCTsAiwAxJBzZpc2ADh/9u5bPTZq0WETOBT2bnmAgXgD6QNEnSNyi+AE7JztOj64F1I+KAiJi1oF8cEVdGxBbA3jTzasBewCmSFs8OsiCSXk6xj8TD36yGIuIo4LvZOcbLRwFPkKTnU+z03zY7yzicA7wzIh4Zz2+WNA04Hqj9MB3GNcB2EXFHdpDhlMP/AppxK8nD3zpL0hTg1zTwdFdfAZgASS+huBzexOF/BPCW8Q5/gIg4DdgMqOUQXYD1KDYHbpYdZH4NG/7fx8PfOiwiZgPvAv6UHKVnLgDjJOk1wBXA+tlZejQX+ExEfKL8izshEXEN8Frgkgknq95ywHmSPpAdZJ4GDv9Pevhb10XEAxTHBT+enaUXLgDjIGl74EKKo2eb5HFgenmYRd9ExP3AVsCx/fy8FVkYOEbS1yWl/vfg4W/WXOU3Qx/IztELF4AeSdqD4lW+z8/O0qO7gS0i4vRBfPKIeCoiPgh8luIqQ9PsAZwuaYmMxSW9jGLD38oZ6/foCDz8zZ4jIn4GfDU7x1h5E+AYlRs9DgM+mp1lHK4Gti2fXR04SW8FfgQsWcV6fXYdxZ/V7VUtWA7/C4BVqlpzAo4AdvXwNxte+ZjxaTRgb5ivAIyBpKWAX9HM4X86xXf+lQx/gIg4E5gK3FbVmn20DsXmwNdVsZiHv1m7lP997AzckJ1lQVwAFkDSqhQn+22dnWUcvkFxz7/yjSkRcR3F5sDfVr12HywLnCvpI4NcxMPfrJ0i4jGKTYF/y84yGheAUUiaClwGrJWdpUezgU9ExGciIu1+fEQ8CLwRODIrwwQsBBwp6X8kTe73J2/Y8P9fPPzNehIRtwDvBuZkZxmJC8AIJO0EnAe8KDtLjx6heL7/iOwgABHxdER8DNidGv+HMIpPA2dK6tvxzuXbCc+nOcP/Ex7+Zr2LiLMpTh+tJReAYUjal+LFN4tkZ+nR7cDUiDgnO8j8IuJbwFspCkrTvAm4TNIrJvqJyuF/AbDqRD9XBTz8zSYoIg6lmCe14wIwhKRFJJ0A7JedZRxmAhtHxPXZQUZStuFNgFuys4zDmsDlkrYa7ydo2PA/Eg9/s375CHBVdoj5uQCUJC0L/AbYKTvLOPwE2Coi/podZEHKRz83pvizbpplgLMl7drrb2zg8P+4h79Zf0TEk8B04L7sLEO5AACS1gQupzjXvmn2B3Yq/4I1QkQ8DLyZ4lyFppkCHCbpu+XZEAvk4W9mEXEXsAPwVHaWeTpfACT9K8Xl8yZ8cR5qFrBLROzTxC/WETE7InYDdqN4aqFpdgN+JWnp0X6RpJUoNvw14e+Xh7/ZAEXEJRRfO2qh0wVA0keBs4ClsrP06AFg64g4PjvIREXEYRRXAx7OzjIOW1PsC1hjuJ8sh/8FwGpVhhqnH+DhbzZwEfEDanL1s5MFQNIkSV+n2OU8psu4NXITsElEXJwdpF8i4jcU+wIaczT0EK+keEJgm6H/sIHD/2Me/maV+TQ1OCStcwVA0mIUL/PZIzvLOJwHbBoRt2YH6bfy0IxNgLOzs4zDUsAvJf07ePib2ejKV7G/A7gjM0enCoCkFSle47t9dpZxOAp4c7mBrpUi4hGKswK+lZ1lHCYD35Z0NMU9/yYM/6Pw8DdLEREPUMyiJ7IydOZtgJLWB84AVqpqzT4JYK+IOCQ7SJXK/RnfoziS1/rvKOCjHv5muSTtAhyXsXYnrgBI2ha4iOYN/yeAd3Rt+ANExJEU7xF4MDtLC3n4m9XHlVkLt74ASNodOBVYPDtLj+4FXh8RJ2cHyRIRv6V4o+B12Vla5Gg8/M2MFhcASVMkHQZ8k+b9e/6B4ljf2h0dWbWIuA2YCpyZnaUFjgY+4uFvZtC8wTgmkpakGBg9H9laA2cCm0fEndlB6iIiHgW2Aw7NztJgHv5m9iytKwCSVgYuBbYZ/VfW0reBaRHx9+wgdRMRcyPis8AHqdFRmg3h4W9mz9GqAiBpE4oz/dfJztKjOcCnIuLTETEnO0ydRcSxwFbA/clRmuIYfM/fzIbRmgIgaUeK56+Xy87So0eBt0XE97KDNEV5nvZrgWuys9TcMRTf+c/NDmJm9dOKAiDpi8CPgUWzs/ToDmCziDgrO0jTRMQdFG9vPC07S015+JvZqBpdACQtLOk4ilfiKjtPj66g2Ol/bXaQpir3SkwHDsrOUjMe/ma2QI0tAJJeCJwL7JKdZRx+CrwhIu7LDtJ0Udib4u/BrOw8NXAsHv5mNgaNLACSVgcuA7bIzjIOBwA7RsQ/soO0Sflq5DcAf0mOkulY4MMe/mY2Fo0rAJK2pBj+r8jO0qOngA9GxBe8I3swIuIyYCPg6uwsCY7Fw9/MetCoAiDpQxSvi106O0uPHgK2KR9hswGKiLuAzSle+dwVP8TD38x61IgCoMJBFC8xadrb4W4BNinPtbcKRMQTwDspNoe23Q+BD3n4m1mval8AJD2PYtPcntlZxuG3FMP/luwgXVNuDtwHeDfQ1v0WHv5mNm61LgCSlqcYojtkZxmHH1Jc9n8oO0iXRcSJwOuAe7Kz9JmHv5lNSG0LgKT1KJ6V3yg7S48C+EJEfCAifGZ9DZRvVdwIaMvbFY/Dw9/MJqiWBUDSW4CLgZdmZ+nRPyge8TsgO4g9W0TcQ3El4CfZWSboOIqnSTz8zWxCalcAJP07cDqwRHaWHt0HbBkRP80OYsOLiH9ExHuAfSiu1DSNh7+Z9U1tCoCkyZK+Q/FK3MnZeXp0LcWxvpdnB7EFi4j9KZ4SeCI7Sw9m4OFvZn1UiwIgaQngDOBT2VnG4SyKF/rckR3Exi4ifk5xXsCd2VnGYAbwAQ9/M+un9AIg6WXAJcC/ZWcZh8MoXuX7aHYQ611EXE3xWuHLsrOMwsPfzAYitQBIei1wObBuZo5xmAvsHhG7RcSc7DA2fhHxF4p3CByfHGU4Hv5mNjCZBeAdwAXA8okZxuPvwHYR8a3sINYfETErInYB9qYod3VwPB7+ZjZAopm7obPcCWwbEX/IDmKDIWk74ARg8cQYxwPv9/A3az9JawI3ZKydvgegQa6i2Onv4d9iEXE6MBXI2tTp4W9mlXABGJtTgNdHxL3ZQWzwIuKPFCcHXlzx0ifg4W9mFXEBWLBDgB3KN8xZR0TEX4F/BY6paMkTgPd5+JtZVVwARvY08JGI2DMivE+igyLiqYj4ELAHg90c6O/8zaxyLgDD+xvw5og4KjuI5YuI/wa2BQZx3sMMiuHvx0nNrFIuAM91K7BpRJyXHcTqIyJ+CWwK3NzHT7s/Hv5mlsQF4NkuBjaJiBuzg1j9RMT1wAbAd5nY47MPAO+JiH18e8nMsrgA/NPxwNYR8UB2EKuviHgiIv4deD3wK3orAk8ABwKrRUTTX0tsZg3ng4AK+0bEV7JDWPNIWgvYkeL2wMbAC4b89FPA7cDvKB4l/VVEPF55SDOrrcyDgLpeAGZRvGL1x9lBrB0kLUpxiuBCwH3e2W9mo8ksAFMyFq2JvwLTImJmdhBrj4h4EngyO4eZ2YJ0tQBcT/Ea39uzg5iZmWXo4ibAc4CpHv5mZtZlXSsA/wu8JSIeyQ5iZmaWqSsFYC7wmYj4eETMzg5jZmaWrQt7AB4Hdo6I07KDmJmZ1UXbC8DdwLYRcXV2EDMzszpp8y2Aq4GNPfzNzMyeq60F4HRgi4i4OzuImZlZHbWxAHwDmO4jV83MzEbWpj0As4FPRcQR2UHMzMzqri0F4BHgnRFxTnYQMzOzJmhDAbid4ljf67ODmJmZNUXT9wDMpNjp7+FvZmbWgyYXgJ8AW0XEX7ODmJmZNU1TC8D+wE7lq1fNzMysR03bA/AU8OGIOD47iJmZWZM1qQA8CGwfERdnBzEzM2u6phSAm4C3RsSt2UHMzMzaoAl7AM4DNvXwNzMz65+6F4CjgDdHxMPZQczMzNqkrgUggD0j4iMR8XR2GDMzs7ap4x6AJ4BdIuLk7CBmZmZtVbcCcC+wXURclR3EzMyszepUAK6hONP/zuwgZmZmbVeXPQBnApt5+JuZmVWjDgXg28C0iPh7dhAzM7OuyLwFMAf4dER8LzGDmZlZJ2UWgJ0j4sTE9c3MzDor8xbAHxLXNjMz67Q67AEwMzOzirkAmJmZdZALgJmZWQe5AJiZmXWQC4CZmVkHuQCYmZl1kAuAmZlZB7kAmJmZdZALgJmZWQe5AJiZmXWQC4CZmVkHuQCYmZl1kAuAmZlZB7kAmJmZdZALgJmZWQe5AJiZmXWQC4CZmVkHuQCYmZl1kAuAmZlZB7kAmJmZdZALgJmZWQe5AJiZmXWQC4CZmVkHuQCYmZl1kAuAmZlZB7kAmJmZdZALgJmZWQe5AJiZmXWQC4CZmVkHuQCYmZl1kAuAmZlZB7kAmJmZdZALgJmZWQe5AJiZmXWQC4CZmVkHuQCYmZl1kAuAmZlZB7kAmJmZdZALgJmZWQe5AJiZmXWQC4CZmVkHuQCYmZl1kAuAmZlZB7kAmJmZdZALgJmZWQe5AJiZmXWQC4CZmVkHuQCYmZl1kAuAmZlZB7kAmJmZdZALgJmZWQe5AJiZmXWQC4CZmVkHTQIicW0zM7Muy5qFMQl4PGnx5ZLWNTMzq4usWfj4JOCxpMVXTFrXzMysLrJm4WOZBWCFpHXNzMzqImsWphYAXwEwM7Ou6+QVABcAMzPrutQC8GjS4i4AZmbWdVmz8NFJwANJi6+UtK6ZmVldZM3CByYBNyUtvqqkVZLWNjMzS1XOwFWTlr8pswAAbJ+4tpmZWabMGegCYGZmliRzBt4oYCHgCWBKQoA5wPIRkbUPwczMrHKSlgX+AkxOWH42sNikiHgauC0hABT/4tsmrW1mZpZlW3KGP8BtEfH0vJcQ3JgUAnwbwMzMuif18j/88y1ElyYG2UaSjwU2M7NOKGfeNokRLoV/FoDzEoMsCuyXuL6ZmVmV9qOYfVnOA1BEIGky8BCwZFKY2cCrIiLziQQzM7OBkrQGcC05G++hOP13mYiYMwkgIuYAFyaFgeIP4sDE9c3MzKpwIHnDH+DCcuY/cwsAcm8DAEyXtGlyBjMzs4EoZ9z05BjPzPqhBeD8hCDzOyQ7gJmZ2YDUYcY9M+uHFoA/AH+qPMqzbS7pg8kZzMzM+qqcbZsnx/gTxawHhhSAiAhgRkKg+R3uWwFmZtYW5Uw7PDsHMKOc9UD5FMAz/4/0SuDmjFTzuQ/YKCLuzA5iZmY2XpJeClwJvDg7C7B6RNwy7/8ZeguA8idmVh7puV4MnCZpsewgZmZm41HOsNOox/CfOXT4w3wFoHRcRWEWZAPgh5KUHcTMzKwX5ez6IcUsq4PnzPZn3QIAkLQ0cC+wSEWhFuRQ4HMxf1AzM7MaKof/IcAe2VlKs4AVIuLhof/wOVcAyl/wo6pSjcEewEm+HWBmZnVXzqqTqM/wBzhh/uEPw1wBAJC0OnADw98iyHI1MM0bA83MrI7KDX+nUZ/L/gBzgLXmv/8PIwz4iLgZ+OmgU/VoA+BKPyJoZmZ1U86mK6nX8Ac4abjhDyNcAQCQtB7we6Bum/BmAbtGxDHZQczMzMpDfg6nPnvn5glgvYi4drifHPESf0RcA5wxqFQTsAhwtKSLfDXAzMyySNpU0kXA0dRv+AOcOtLwh1GuAABIei1w+SBS9dEpwN5+lbCZmVWhfKXvgeS/2Gc0QXGg3u9G+gWjbvKLiCuox/HAo5kOXCvp+5JWyA5jZmbtJGkFSd8HrqXewx/g2NGGPyzgCgCApOWAm4Cl+hhsUJ4Efg2cCpwREQ8k5zEzswaTtCywLbA9sA2waG6iMXkYWCMi/jraL1pgAQCQ9Enge30KVpU5wCUUZeDUiLg9OY+ZmTWApFUoBv72wGbA5NxEPftERByxoF801gIwiWIvwIZ9CJblNuAu4J4hH/eWP94PzM2LZmZmFZoELAesCKxQ/jjvYyVg1bxoE3YlsElELHCmjakAAEjakKIE1OlwIDMzMyvMBV67oHv/84x5mEfEVRRnG5uZmVn9HDLW4Q89XAEAkDQFOB/YfBzBzMzMbDAuBraMiNlj/Q09FQAASS+hOCFw2d6ymZmZ2QA8AKwfEXf38pt6vp9fLrALxSEDZmZmlieAXXod/jDODX0RcRZw0Hh+r5mZmfXNQeVM7lnPtwCe+Y3SZIrXHr51XJ/AzMzMJuJMYFpEzBnPbx53AQCQtBhwLuCX8piZmVVnJrB1RDwx3k8woQIAIGkZ4CJg7Ql9IjMzMxuL64EtIuKhiXySCRcAAEkvBS6lOEHJzMzMBuMuYGpE3DnRT9SXU/3KIG8CJtRGzMzMbEQPAW/qx/CHPh7rGxHXA1tQtBMzMzPrn7soLvtf369P2Ndz/ctgUynuT5iZmdnEXU9x2b+vs7XvL/YpL01sQbFD0czMzMZvJsV3/n257D/UQN7sV+5M3JriGUUzMzPr3ZkUj/oNZH/dwF7tWz6bOA04EB8bbGZmNlZBMTunTeQ5/wXpy2OAC1xEejMwA79AyMzMbDQPUJztP67jfXtRSQGAZ94i+BP8KmEzM7PhXAy8ezwv9hmPgd0CmF/5L7QlxUuE5la1rpmZWc3NpZiNW1Y1/KHCKwDPWlTaEDgc2LDyxc3MzOrjKmDXiLiq6oUruwIwVPkvujGwG/C3jAxmZmaJ/kYxAzfOGP6QdAXgWQGk5YBDgV1Sg5iZmVVjBrBHRNyfGSLlCsBQEXF/RLyP4orA6fiRQTMza5+gmHEbR8T7soc/1OAKwPwkrQd8HngnNSgoZmZmEzAX+ClwQERckx1mqNoVgHkkrQ7sBewELJIcx8zMrBezgB8BB0XEzdlhhlPbAjCPpKWBHYH3AZsmxzEzMxvNTOA44MSIeDg7zGhqXwCGkvRKis2CuwAr56YxMzMD4E8UG/tmRMQtyVnGrFEFYB5JAl5NcbDQVsDrgCVTQ5mZWVc8ClwInAecD/whGjhMG1kA5idpMvAaijIwFVgTWBWYkpnLzMwabzZwG3AjcCnF0P+/iJiTmqoPWlEAhiNpIWA1YI0hH8tSXClYYr6P5wPKSWpmZhUL4HHgsfk+HqV4Gc9NQz5ujYink3IO1P8Hyl/vRzQwecMAAAAASUVORK5CYII="
|
|
36
|
+
};
|
|
37
|
+
|
|
33
38
|
// src/renderer-engine/index.ts
|
|
34
39
|
import fs from "fs";
|
|
35
40
|
import PDFDocument from "pdfkit";
|
|
@@ -208,7 +213,7 @@ var drawRotatedImage = (doc, src, x, y, width, height, rotationDeg) => {
|
|
|
208
213
|
doc.image(src, x, y, { width, height });
|
|
209
214
|
doc.restore();
|
|
210
215
|
};
|
|
211
|
-
var processImageBlock = (doc, ctx, block, y, env, ensureSpaceFor) => {
|
|
216
|
+
var processImageBlock = (doc, ctx, block, y, env, ensureSpaceFor, defaultImage) => {
|
|
212
217
|
const imgSource = block.src;
|
|
213
218
|
const imgWidth = block.width ?? 80;
|
|
214
219
|
const imgHeight = block.height ?? 50;
|
|
@@ -236,7 +241,18 @@ var processImageBlock = (doc, ctx, block, y, env, ensureSpaceFor) => {
|
|
|
236
241
|
height: imgHeight
|
|
237
242
|
});
|
|
238
243
|
} catch (e) {
|
|
239
|
-
|
|
244
|
+
if (defaultImage !== void 0) {
|
|
245
|
+
try {
|
|
246
|
+
doc.image(defaultImage, x, startY, {
|
|
247
|
+
width: imgWidth,
|
|
248
|
+
height: imgHeight
|
|
249
|
+
});
|
|
250
|
+
} catch {
|
|
251
|
+
console.warn("Failed to render default image fallback:", e);
|
|
252
|
+
}
|
|
253
|
+
} else {
|
|
254
|
+
console.warn("Failed to load image:", e);
|
|
255
|
+
}
|
|
240
256
|
}
|
|
241
257
|
const newY = startY + imgHeight + mb;
|
|
242
258
|
if (y === null) ctx.currentY = newY;
|
|
@@ -546,6 +562,7 @@ var toTableCell = (rawBlock) => {
|
|
|
546
562
|
const tableCellInput = isTableCellInput(rawBlock) ? rawBlock : void 0;
|
|
547
563
|
return {
|
|
548
564
|
text: rawBlock.text,
|
|
565
|
+
blocks: tableCellInput?.blocks,
|
|
549
566
|
italic: rawBlock.italic,
|
|
550
567
|
underline: rawBlock.underline,
|
|
551
568
|
link: rawBlock.link,
|
|
@@ -562,7 +579,8 @@ var toTableCell = (rawBlock) => {
|
|
|
562
579
|
paddingTop: tableCellInput?.paddingTop,
|
|
563
580
|
paddingRight: tableCellInput?.paddingRight,
|
|
564
581
|
paddingBottom: tableCellInput?.paddingBottom,
|
|
565
|
-
paddingLeft: tableCellInput?.paddingLeft
|
|
582
|
+
paddingLeft: tableCellInput?.paddingLeft,
|
|
583
|
+
border: tableCellInput?.border
|
|
566
584
|
};
|
|
567
585
|
};
|
|
568
586
|
var resolvePathValue = (obj, dottedPath) => {
|
|
@@ -585,7 +603,7 @@ var interpolateCellText = (text, item, rowIndex) => {
|
|
|
585
603
|
};
|
|
586
604
|
var applyIterableData = (cell, item, rowIndex) => ({
|
|
587
605
|
...cell,
|
|
588
|
-
text: interpolateCellText(cell.text, item, rowIndex)
|
|
606
|
+
text: cell.text !== void 0 ? interpolateCellText(cell.text, item, rowIndex) : void 0
|
|
589
607
|
});
|
|
590
608
|
var expandIterableRow = (table, bodyDef) => {
|
|
591
609
|
const templateRow = bodyDef.content.map(toTableCell).filter((cell) => cell !== null);
|
|
@@ -615,7 +633,15 @@ var normalizeTableRows = (table) => {
|
|
|
615
633
|
}
|
|
616
634
|
return rows;
|
|
617
635
|
};
|
|
618
|
-
var
|
|
636
|
+
var measureCellHeight = (doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn) => {
|
|
637
|
+
if (cell.blocks?.length && measureBlockHeightFn) {
|
|
638
|
+
const cellEnv = { marginLeft: 0, innerWidth: textWidth, allowPageBreak: false };
|
|
639
|
+
const contentH = cell.blocks.filter((b) => b.visible !== false).reduce((acc, b) => acc + measureBlockHeightFn(b, cellEnv), 0);
|
|
640
|
+
return contentH + paddingTop + paddingBottom;
|
|
641
|
+
}
|
|
642
|
+
return doc.heightOfString(cell.text ?? "", { width: textWidth }) + paddingTop + paddingBottom;
|
|
643
|
+
};
|
|
644
|
+
var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2, measureBlockHeightFn) => {
|
|
619
645
|
const localLeft = table.marginLeft ?? 0;
|
|
620
646
|
const localRight = table.marginRight ?? 0;
|
|
621
647
|
const width = Math.max(env.innerWidth - localLeft - localRight, 1);
|
|
@@ -638,9 +664,11 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
|
|
|
638
664
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
639
665
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
640
666
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
667
|
+
if (!cell.blocks?.length) {
|
|
668
|
+
doc.font(getCellFontName(cell));
|
|
669
|
+
doc.fontSize(cell.fontSize ?? 10);
|
|
670
|
+
}
|
|
671
|
+
const h = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
|
|
644
672
|
rowHeight = Math.max(rowHeight, h);
|
|
645
673
|
});
|
|
646
674
|
rowHeights.push(rowHeight);
|
|
@@ -657,9 +685,11 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
|
|
|
657
685
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
658
686
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
659
687
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
688
|
+
if (!cell.blocks?.length) {
|
|
689
|
+
doc.font(getCellFontName(cell));
|
|
690
|
+
doc.fontSize(cell.fontSize ?? 10);
|
|
691
|
+
}
|
|
692
|
+
const neededHeight = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
|
|
663
693
|
const currentGroupHeight = getRowSpanGroupHeight(rowHeights, rowIndex, rowSpan);
|
|
664
694
|
if (neededHeight > currentGroupHeight) {
|
|
665
695
|
const deficit = neededHeight - currentGroupHeight;
|
|
@@ -674,7 +704,7 @@ var measureTableHeight = (doc, table, env, styles, computeColumnPixelWidths2) =>
|
|
|
674
704
|
totalHeight += table.marginBottom ?? 0;
|
|
675
705
|
return totalHeight;
|
|
676
706
|
};
|
|
677
|
-
var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidths2, bottomLimitForContent, finishPage2) => {
|
|
707
|
+
var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidths2, bottomLimitForContent, finishPage2, renderBlockFn, measureBlockHeightFn) => {
|
|
678
708
|
const localLeft = table.marginLeft ?? 0;
|
|
679
709
|
const localRight = table.marginRight ?? 0;
|
|
680
710
|
const baseLeft = env.marginLeft + localLeft;
|
|
@@ -690,7 +720,6 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
690
720
|
hLineColor: "#ccc",
|
|
691
721
|
vLineColor: "#ccc"
|
|
692
722
|
};
|
|
693
|
-
const borderAll = layout.border !== "none";
|
|
694
723
|
const headerRows = table.headerRows ?? 0;
|
|
695
724
|
const rows = normalizeTableRows(table);
|
|
696
725
|
const buildPlacementAndHeights = (rows2) => {
|
|
@@ -710,9 +739,11 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
710
739
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
711
740
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
712
741
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
742
|
+
if (!cell.blocks?.length) {
|
|
743
|
+
doc.font(getCellFontName(cell));
|
|
744
|
+
doc.fontSize(cell.fontSize ?? 10);
|
|
745
|
+
}
|
|
746
|
+
const h = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
|
|
716
747
|
rowHeight = Math.max(rowHeight, h);
|
|
717
748
|
});
|
|
718
749
|
rowHeights.push(rowHeight);
|
|
@@ -729,9 +760,11 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
729
760
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
730
761
|
const colW = getPlacedCellWidth(colWidths, startCol, colSpan);
|
|
731
762
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
763
|
+
if (!cell.blocks?.length) {
|
|
764
|
+
doc.font(getCellFontName(cell));
|
|
765
|
+
doc.fontSize(cell.fontSize ?? 10);
|
|
766
|
+
}
|
|
767
|
+
const neededHeight = measureCellHeight(doc, cell, textWidth, paddingTop, paddingBottom, measureBlockHeightFn);
|
|
735
768
|
const currentGroupHeight = getRowSpanGroupHeight(rowHeights, rowIndex, rowSpan);
|
|
736
769
|
if (neededHeight > currentGroupHeight) {
|
|
737
770
|
const deficit = neededHeight - currentGroupHeight;
|
|
@@ -754,47 +787,60 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
754
787
|
const paddingTop = cell.paddingTop ?? 2;
|
|
755
788
|
const paddingBottom = cell.paddingBottom ?? 2;
|
|
756
789
|
doc.save();
|
|
757
|
-
|
|
758
|
-
|
|
790
|
+
const columnStyle = table.layout?.columnStyles?.[startCol];
|
|
791
|
+
const rowStyle = table.layout?.rowStyles?.[rowIndex];
|
|
792
|
+
const fillColor = cell.fillColor ?? rowStyle?.fillColor ?? columnStyle?.fillColor;
|
|
793
|
+
if (fillColor) {
|
|
794
|
+
doc.rect(x, rowTop2, colW, drawHeight).fillOpacity(1).fill(fillColor);
|
|
759
795
|
doc.fillOpacity(1);
|
|
760
796
|
}
|
|
761
|
-
doc.font(getCellFontName(cell));
|
|
762
|
-
doc.fontSize(fontSize);
|
|
763
|
-
doc.fillColor(cell.color ?? "black");
|
|
764
|
-
const align = cell.align ?? "left";
|
|
765
797
|
const textWidth = Math.max(colW - paddingLeft - paddingRight, 1);
|
|
766
|
-
const
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
798
|
+
const textY = rowTop2 + paddingTop;
|
|
799
|
+
if (cell.blocks?.length && renderBlockFn) {
|
|
800
|
+
const cellEnv = {
|
|
801
|
+
marginLeft: x + paddingLeft,
|
|
802
|
+
innerWidth: textWidth,
|
|
803
|
+
allowPageBreak: false
|
|
804
|
+
};
|
|
805
|
+
const savedY = ctx.currentY;
|
|
806
|
+
let contentY = textY;
|
|
807
|
+
for (const block of cell.blocks) {
|
|
808
|
+
if (!block || block.visible === false) continue;
|
|
809
|
+
if (block.type === "signature" || block.type === "pageBreak") continue;
|
|
810
|
+
contentY = renderBlockFn(block, contentY, cellEnv);
|
|
811
|
+
}
|
|
812
|
+
ctx.currentY = savedY;
|
|
813
|
+
} else {
|
|
814
|
+
doc.font(getCellFontName(cell));
|
|
815
|
+
doc.fontSize(fontSize);
|
|
816
|
+
doc.fillColor(cell.color ?? "black");
|
|
817
|
+
const align = cell.align ?? "left";
|
|
818
|
+
const textHeight = doc.heightOfString(cell.text ?? "", { width: textWidth });
|
|
819
|
+
let paintY = textY;
|
|
820
|
+
if (isHeaderRow) {
|
|
821
|
+
const available = Math.max(drawHeight - paddingTop - paddingBottom, 0);
|
|
822
|
+
const offset = Math.max((available - textHeight) / 2, 0);
|
|
823
|
+
paintY = rowTop2 + paddingTop + offset;
|
|
824
|
+
}
|
|
825
|
+
doc.text(cell.text ?? "", x + paddingLeft, paintY, {
|
|
826
|
+
width: textWidth,
|
|
827
|
+
align,
|
|
828
|
+
underline: !!cell.underline,
|
|
829
|
+
strike: !!cell.strike,
|
|
830
|
+
link: cell.link
|
|
831
|
+
});
|
|
772
832
|
}
|
|
773
|
-
doc.text(cell.text, x + paddingLeft, textY, {
|
|
774
|
-
width: textWidth,
|
|
775
|
-
align,
|
|
776
|
-
underline: !!cell.underline,
|
|
777
|
-
strike: !!cell.strike,
|
|
778
|
-
link: cell.link
|
|
779
|
-
});
|
|
780
833
|
doc.restore();
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
doc.moveTo(x, bottomY).lineTo(x + colW, bottomY).stroke();
|
|
790
|
-
doc.restore();
|
|
791
|
-
doc.save();
|
|
792
|
-
doc.lineWidth(0.5);
|
|
793
|
-
doc.strokeColor(layout.vLineColor ?? "#ccc");
|
|
794
|
-
doc.moveTo(x, rowTop2).lineTo(x, bottomY).stroke();
|
|
795
|
-
doc.moveTo(x + colW, rowTop2).lineTo(x + colW, bottomY).stroke();
|
|
796
|
-
doc.restore();
|
|
834
|
+
const effectiveBorder = getEffectiveCellBorder({
|
|
835
|
+
table,
|
|
836
|
+
cell,
|
|
837
|
+
rowIndex,
|
|
838
|
+
startCol
|
|
839
|
+
});
|
|
840
|
+
if (!drawTopBorder) {
|
|
841
|
+
effectiveBorder.top.visible = false;
|
|
797
842
|
}
|
|
843
|
+
drawCellBorder(doc, effectiveBorder, x, rowTop2, colW, drawHeight);
|
|
798
844
|
});
|
|
799
845
|
return rowTop2 + rowHeight;
|
|
800
846
|
};
|
|
@@ -834,6 +880,123 @@ var processTableBlock = (doc, ctx, styles, table, y, env, computeColumnPixelWidt
|
|
|
834
880
|
if (y === null) ctx.currentY = newY;
|
|
835
881
|
return newY;
|
|
836
882
|
};
|
|
883
|
+
var SIDES = ["top", "right", "bottom", "left"];
|
|
884
|
+
var DEFAULT_BORDER_COLOR = "#ccc";
|
|
885
|
+
var DEFAULT_BORDER_WIDTH = 0.5;
|
|
886
|
+
var isBorderStyleObject = (value) => {
|
|
887
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
888
|
+
};
|
|
889
|
+
var normalizeOneSideBorder = (value, fallback) => {
|
|
890
|
+
if (value === void 0) return fallback;
|
|
891
|
+
if (typeof value === "boolean") {
|
|
892
|
+
return {
|
|
893
|
+
...fallback,
|
|
894
|
+
visible: value
|
|
895
|
+
};
|
|
896
|
+
}
|
|
897
|
+
return {
|
|
898
|
+
visible: value.visible ?? fallback.visible,
|
|
899
|
+
color: value.color ?? fallback.color,
|
|
900
|
+
width: value.width ?? fallback.width,
|
|
901
|
+
dash: value.dash ?? fallback.dash
|
|
902
|
+
};
|
|
903
|
+
};
|
|
904
|
+
var normalizeCellBorder = (input, fallback) => {
|
|
905
|
+
if (input === void 0) return fallback;
|
|
906
|
+
if (typeof input === "boolean") {
|
|
907
|
+
return SIDES.reduce((acc, side) => {
|
|
908
|
+
acc[side] = {
|
|
909
|
+
...fallback[side],
|
|
910
|
+
visible: input
|
|
911
|
+
};
|
|
912
|
+
return acc;
|
|
913
|
+
}, {});
|
|
914
|
+
}
|
|
915
|
+
if (isBorderStyleObject(input) && ("visible" in input || "color" in input || "width" in input || "dash" in input)) {
|
|
916
|
+
return SIDES.reduce((acc, side) => {
|
|
917
|
+
acc[side] = normalizeOneSideBorder(input, fallback[side]);
|
|
918
|
+
return acc;
|
|
919
|
+
}, {});
|
|
920
|
+
}
|
|
921
|
+
const sideInput = input;
|
|
922
|
+
return SIDES.reduce((acc, side) => {
|
|
923
|
+
acc[side] = normalizeOneSideBorder(sideInput[side], fallback[side]);
|
|
924
|
+
return acc;
|
|
925
|
+
}, {});
|
|
926
|
+
};
|
|
927
|
+
var createDefaultTableBorder = (layout) => {
|
|
928
|
+
const visible = layout?.border !== "none";
|
|
929
|
+
const hColor = layout?.hLineColor ?? layout?.borderColor ?? DEFAULT_BORDER_COLOR;
|
|
930
|
+
const vColor = layout?.vLineColor ?? layout?.borderColor ?? DEFAULT_BORDER_COLOR;
|
|
931
|
+
const width = layout?.borderWidth ?? DEFAULT_BORDER_WIDTH;
|
|
932
|
+
return {
|
|
933
|
+
top: {
|
|
934
|
+
visible,
|
|
935
|
+
color: hColor,
|
|
936
|
+
width,
|
|
937
|
+
dash: layout?.borderDash
|
|
938
|
+
},
|
|
939
|
+
bottom: {
|
|
940
|
+
visible,
|
|
941
|
+
color: hColor,
|
|
942
|
+
width,
|
|
943
|
+
dash: layout?.borderDash
|
|
944
|
+
},
|
|
945
|
+
left: {
|
|
946
|
+
visible,
|
|
947
|
+
color: vColor,
|
|
948
|
+
width,
|
|
949
|
+
dash: layout?.borderDash
|
|
950
|
+
},
|
|
951
|
+
right: {
|
|
952
|
+
visible,
|
|
953
|
+
color: vColor,
|
|
954
|
+
width,
|
|
955
|
+
dash: layout?.borderDash
|
|
956
|
+
}
|
|
957
|
+
};
|
|
958
|
+
};
|
|
959
|
+
var getEffectiveCellBorder = (args) => {
|
|
960
|
+
const { table, cell, rowIndex, startCol } = args;
|
|
961
|
+
const tableBorder = createDefaultTableBorder(table.layout);
|
|
962
|
+
const columnBorder = normalizeCellBorder(table.layout?.columnStyles?.[startCol]?.border, tableBorder);
|
|
963
|
+
const rowBorder = normalizeCellBorder(table.layout?.rowStyles?.[rowIndex]?.border, columnBorder);
|
|
964
|
+
return normalizeCellBorder(cell.border, rowBorder);
|
|
965
|
+
};
|
|
966
|
+
var drawBorderSide = (doc, side, border, x, y, width, height) => {
|
|
967
|
+
if (!border.visible || border.width <= 0) return;
|
|
968
|
+
doc.save();
|
|
969
|
+
doc.lineWidth(border.width);
|
|
970
|
+
doc.strokeColor(border.color);
|
|
971
|
+
if (border.dash?.length) {
|
|
972
|
+
doc.dash(border.dash[0], {
|
|
973
|
+
space: border.dash[1] ?? border.dash[0]
|
|
974
|
+
});
|
|
975
|
+
} else {
|
|
976
|
+
doc.undash();
|
|
977
|
+
}
|
|
978
|
+
switch (side) {
|
|
979
|
+
case "top":
|
|
980
|
+
doc.moveTo(x, y).lineTo(x + width, y).stroke();
|
|
981
|
+
break;
|
|
982
|
+
case "right":
|
|
983
|
+
doc.moveTo(x + width, y).lineTo(x + width, y + height).stroke();
|
|
984
|
+
break;
|
|
985
|
+
case "bottom":
|
|
986
|
+
doc.moveTo(x, y + height).lineTo(x + width, y + height).stroke();
|
|
987
|
+
break;
|
|
988
|
+
case "left":
|
|
989
|
+
doc.moveTo(x, y).lineTo(x, y + height).stroke();
|
|
990
|
+
break;
|
|
991
|
+
}
|
|
992
|
+
doc.restore();
|
|
993
|
+
};
|
|
994
|
+
var drawCellBorder = (doc, border, x, y, width, height) => {
|
|
995
|
+
drawBorderSide(doc, "top", border.top, x, y, width, height);
|
|
996
|
+
drawBorderSide(doc, "right", border.right, x, y, width, height);
|
|
997
|
+
drawBorderSide(doc, "bottom", border.bottom, x, y, width, height);
|
|
998
|
+
drawBorderSide(doc, "left", border.left, x, y, width, height);
|
|
999
|
+
};
|
|
837
1000
|
|
|
838
1001
|
// src/renderer-engine/blocks/text.ts
|
|
839
1002
|
var processTextBlock = (doc, ctx, styles, block, y, env, ensureSpaceFor) => {
|
|
@@ -877,7 +1040,7 @@ var processTextBlock = (doc, ctx, styles, block, y, env, ensureSpaceFor) => {
|
|
|
877
1040
|
|
|
878
1041
|
// src/renderer-engine/utils/block-renderer.ts
|
|
879
1042
|
function createBlockRenderer(deps) {
|
|
880
|
-
const { doc, ctx, styles, computeColumnPixelWidths: computeColumnPixelWidths2, finishPage: finishPage2, processSignatureBlock } = deps;
|
|
1043
|
+
const { doc, ctx, styles, computeColumnPixelWidths: computeColumnPixelWidths2, finishPage: finishPage2, processSignatureBlock, defaultImage } = deps;
|
|
881
1044
|
const bottomLimitForContent = createBottomLimitForContent(doc, ctx);
|
|
882
1045
|
const ensureSpaceFor = createEnsureSpaceFor(ctx, bottomLimitForContent, finishPage2);
|
|
883
1046
|
const measureBlockHeight = createMeasureBlockHeight({
|
|
@@ -889,11 +1052,31 @@ function createBlockRenderer(deps) {
|
|
|
889
1052
|
if (block.visible === false) {
|
|
890
1053
|
return y ?? ctx.currentY;
|
|
891
1054
|
}
|
|
1055
|
+
if ((block.backgroundColor || block.backgroundImage) && block.type !== "pageBreak" && block.type !== "signature") {
|
|
1056
|
+
const startY = y ?? ctx.currentY;
|
|
1057
|
+
const blockHeight = measureBlockHeight(block, env);
|
|
1058
|
+
const opacity = block.backgroundOpacity ?? 1;
|
|
1059
|
+
doc.save();
|
|
1060
|
+
if (block.backgroundColor) {
|
|
1061
|
+
doc.fillOpacity(opacity).rect(env.marginLeft, startY, env.innerWidth, blockHeight).fill(block.backgroundColor);
|
|
1062
|
+
doc.fillOpacity(1);
|
|
1063
|
+
}
|
|
1064
|
+
if (block.backgroundImage) {
|
|
1065
|
+
try {
|
|
1066
|
+
doc.image(block.backgroundImage, env.marginLeft, startY, {
|
|
1067
|
+
width: env.innerWidth,
|
|
1068
|
+
height: blockHeight
|
|
1069
|
+
});
|
|
1070
|
+
} catch (_) {
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
doc.restore();
|
|
1074
|
+
}
|
|
892
1075
|
switch (block.type) {
|
|
893
1076
|
case "text":
|
|
894
1077
|
return processTextBlock(doc, ctx, styles, block, y, env, ensureSpaceFor);
|
|
895
1078
|
case "image":
|
|
896
|
-
return processImageBlock(doc, ctx, block, y, env, ensureSpaceFor);
|
|
1079
|
+
return processImageBlock(doc, ctx, block, y, env, ensureSpaceFor, defaultImage);
|
|
897
1080
|
case "qr": {
|
|
898
1081
|
const qb = block;
|
|
899
1082
|
const imageLike = {
|
|
@@ -907,7 +1090,7 @@ function createBlockRenderer(deps) {
|
|
|
907
1090
|
marginLeft: qb.marginLeft,
|
|
908
1091
|
marginRight: qb.marginRight
|
|
909
1092
|
};
|
|
910
|
-
return processImageBlock(doc, ctx, imageLike, y, env, ensureSpaceFor);
|
|
1093
|
+
return processImageBlock(doc, ctx, imageLike, y, env, ensureSpaceFor, defaultImage);
|
|
911
1094
|
}
|
|
912
1095
|
case "barcode":
|
|
913
1096
|
return processBarcodeBlock(doc, ctx, block, y, env, ensureSpaceFor);
|
|
@@ -923,7 +1106,9 @@ function createBlockRenderer(deps) {
|
|
|
923
1106
|
env,
|
|
924
1107
|
computeColumnPixelWidths2,
|
|
925
1108
|
bottomLimitForContent,
|
|
926
|
-
finishPage2
|
|
1109
|
+
finishPage2,
|
|
1110
|
+
(b, blockY, blockEnv) => renderBlock(b, blockY, blockEnv),
|
|
1111
|
+
measureBlockHeight
|
|
927
1112
|
);
|
|
928
1113
|
case "columns":
|
|
929
1114
|
return processColumnsBlock(
|
|
@@ -1166,14 +1351,24 @@ function drawHeader(doc, def, headerBandHeight, header, renderBlockArray) {
|
|
|
1166
1351
|
|
|
1167
1352
|
// src/renderer-engine/utils/image-loader.ts
|
|
1168
1353
|
import axios from "axios";
|
|
1169
|
-
async function normalizeImageSrc(src) {
|
|
1170
|
-
if (!src) return src;
|
|
1354
|
+
async function normalizeImageSrc(src, fallback) {
|
|
1355
|
+
if (!src) return fallback ?? src;
|
|
1171
1356
|
if (Buffer.isBuffer(src)) return src;
|
|
1357
|
+
if (src.startsWith("data:")) {
|
|
1358
|
+
const commaIdx = src.indexOf(",");
|
|
1359
|
+
if (commaIdx !== -1) {
|
|
1360
|
+
return Buffer.from(src.slice(commaIdx + 1), "base64");
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1172
1363
|
if (src.startsWith("http://") || src.startsWith("https://")) {
|
|
1173
1364
|
try {
|
|
1174
1365
|
const res = await axios.get(src, { responseType: "arraybuffer" });
|
|
1175
1366
|
return Buffer.from(res.data);
|
|
1176
1367
|
} catch (e) {
|
|
1368
|
+
if (fallback !== void 0) {
|
|
1369
|
+
console.warn(`Failed to fetch remote image "${src}", using default image.`);
|
|
1370
|
+
return fallback;
|
|
1371
|
+
}
|
|
1177
1372
|
throw toPdfEngineError(e, {
|
|
1178
1373
|
code: "PDF_ERROR_IMAGE_FETCH_FAILED" /* PDF_ERROR_IMAGE_FETCH_FAILED */,
|
|
1179
1374
|
message: "Failed to fetch remote image for PDF.",
|
|
@@ -1185,23 +1380,47 @@ async function normalizeImageSrc(src) {
|
|
|
1185
1380
|
}
|
|
1186
1381
|
return src;
|
|
1187
1382
|
}
|
|
1188
|
-
async function materializeImagesInBlocks(blocks) {
|
|
1383
|
+
async function materializeImagesInBlocks(blocks, fallback) {
|
|
1189
1384
|
const out = [];
|
|
1190
1385
|
for (const block of blocks) {
|
|
1386
|
+
const blockAny = block;
|
|
1387
|
+
if (blockAny.backgroundImage) {
|
|
1388
|
+
blockAny.backgroundImage = await normalizeImageSrc(blockAny.backgroundImage, fallback);
|
|
1389
|
+
}
|
|
1191
1390
|
if (block.type === "image") {
|
|
1192
1391
|
const img = { ...block };
|
|
1193
|
-
img.src = await normalizeImageSrc(img.src);
|
|
1392
|
+
img.src = await normalizeImageSrc(img.src, fallback);
|
|
1194
1393
|
out.push(img);
|
|
1195
1394
|
} else if (block.type === "columns") {
|
|
1196
1395
|
out.push({
|
|
1197
1396
|
...block,
|
|
1198
|
-
columns: await Promise.all(block.columns.map((col) => materializeImagesInBlocks(col)))
|
|
1397
|
+
columns: await Promise.all(block.columns.map((col) => materializeImagesInBlocks(col, fallback)))
|
|
1199
1398
|
});
|
|
1200
1399
|
} else if (block.type === "signature" && block.blocks) {
|
|
1201
1400
|
out.push({
|
|
1202
1401
|
...block,
|
|
1203
|
-
blocks: await materializeImagesInBlocks(block.blocks)
|
|
1402
|
+
blocks: await materializeImagesInBlocks(block.blocks, fallback)
|
|
1204
1403
|
});
|
|
1404
|
+
} else if (block.type === "table") {
|
|
1405
|
+
const tb = block;
|
|
1406
|
+
const newBody = await Promise.all(
|
|
1407
|
+
tb.body.map(
|
|
1408
|
+
async (entry) => {
|
|
1409
|
+
const materializeCell = async (cell) => {
|
|
1410
|
+
if (!cell.blocks?.length) return cell;
|
|
1411
|
+
return { ...cell, blocks: await materializeImagesInBlocks(cell.blocks, fallback) };
|
|
1412
|
+
};
|
|
1413
|
+
if (Array.isArray(entry)) {
|
|
1414
|
+
return await Promise.all(entry.map(materializeCell));
|
|
1415
|
+
}
|
|
1416
|
+
if (entry && typeof entry === "object" && "content" in entry && Array.isArray(entry.content)) {
|
|
1417
|
+
return { ...entry, content: await Promise.all(entry.content.map(materializeCell)) };
|
|
1418
|
+
}
|
|
1419
|
+
return entry;
|
|
1420
|
+
}
|
|
1421
|
+
)
|
|
1422
|
+
);
|
|
1423
|
+
out.push({ ...tb, body: newBody });
|
|
1205
1424
|
} else {
|
|
1206
1425
|
out.push(block);
|
|
1207
1426
|
}
|
|
@@ -1355,7 +1574,7 @@ function createMeasureBlockHeight(deps) {
|
|
|
1355
1574
|
innerWidth,
|
|
1356
1575
|
allowPageBreak: false
|
|
1357
1576
|
};
|
|
1358
|
-
const h = measureTableHeight(doc, b, fakeEnv, styles, computeColumnPixelWidths2);
|
|
1577
|
+
const h = measureTableHeight(doc, b, fakeEnv, styles, computeColumnPixelWidths2, measure);
|
|
1359
1578
|
return mt + h + mb;
|
|
1360
1579
|
};
|
|
1361
1580
|
const measureColumns = (b, env) => {
|
|
@@ -1669,6 +1888,26 @@ async function materializeQrAndBarcodesInBlocks(blocks) {
|
|
|
1669
1888
|
bb.src = buf;
|
|
1670
1889
|
}
|
|
1671
1890
|
out.push(bb);
|
|
1891
|
+
} else if (block.type === "table") {
|
|
1892
|
+
const tb = block;
|
|
1893
|
+
const newBody = await Promise.all(
|
|
1894
|
+
tb.body.map(
|
|
1895
|
+
async (entry) => {
|
|
1896
|
+
const materializeCell = async (cell) => {
|
|
1897
|
+
if (!cell.blocks?.length) return cell;
|
|
1898
|
+
return { ...cell, blocks: await materializeQrAndBarcodesInBlocks(cell.blocks) };
|
|
1899
|
+
};
|
|
1900
|
+
if (Array.isArray(entry)) {
|
|
1901
|
+
return await Promise.all(entry.map(materializeCell));
|
|
1902
|
+
}
|
|
1903
|
+
if (entry && typeof entry === "object" && "content" in entry && Array.isArray(entry.content)) {
|
|
1904
|
+
return { ...entry, content: await Promise.all(entry.content.map(materializeCell)) };
|
|
1905
|
+
}
|
|
1906
|
+
return entry;
|
|
1907
|
+
}
|
|
1908
|
+
)
|
|
1909
|
+
);
|
|
1910
|
+
out.push({ ...tb, body: newBody });
|
|
1672
1911
|
} else {
|
|
1673
1912
|
out.push(block);
|
|
1674
1913
|
}
|
|
@@ -1924,23 +2163,28 @@ function drawWatermarkForPage(doc, watermark, pageNumber, isLast) {
|
|
|
1924
2163
|
}
|
|
1925
2164
|
|
|
1926
2165
|
// src/renderer-engine/index.ts
|
|
2166
|
+
var BUILT_IN_DEFAULT_IMAGE = Buffer.from(
|
|
2167
|
+
images.default.slice(images.default.indexOf(",") + 1),
|
|
2168
|
+
"base64"
|
|
2169
|
+
);
|
|
1927
2170
|
async function renderCustomPdf(def, outputPath) {
|
|
2171
|
+
const fallbackImage = def.defaultImage ?? BUILT_IN_DEFAULT_IMAGE;
|
|
1928
2172
|
if (def.header) {
|
|
1929
2173
|
def.header.blocks = await materializeQrAndBarcodesInBlocks(def.header.blocks);
|
|
1930
|
-
def.header.blocks = await materializeImagesInBlocks(def.header.blocks);
|
|
2174
|
+
def.header.blocks = await materializeImagesInBlocks(def.header.blocks, fallbackImage);
|
|
1931
2175
|
}
|
|
1932
2176
|
def.content = await materializeQrAndBarcodesInBlocks(def.content);
|
|
1933
|
-
def.content = await materializeImagesInBlocks(def.content);
|
|
2177
|
+
def.content = await materializeImagesInBlocks(def.content, fallbackImage);
|
|
1934
2178
|
if (def.pageBackground?.src) {
|
|
1935
|
-
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src);
|
|
2179
|
+
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src, fallbackImage);
|
|
1936
2180
|
}
|
|
1937
2181
|
if (def.header?.backgroundImage) {
|
|
1938
|
-
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage);
|
|
2182
|
+
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage, fallbackImage);
|
|
1939
2183
|
}
|
|
1940
2184
|
if (def.footer && typeof def.footer !== "function") {
|
|
1941
2185
|
const footer = def.footer;
|
|
1942
2186
|
if (footer.backgroundImage) {
|
|
1943
|
-
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage);
|
|
2187
|
+
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage, fallbackImage);
|
|
1944
2188
|
}
|
|
1945
2189
|
}
|
|
1946
2190
|
return new Promise((resolve, reject) => {
|
|
@@ -1991,7 +2235,8 @@ async function renderCustomPdf(def, outputPath) {
|
|
|
1991
2235
|
styles,
|
|
1992
2236
|
computeColumnPixelWidths,
|
|
1993
2237
|
finishPage: finishPage2,
|
|
1994
|
-
processSignatureBlock
|
|
2238
|
+
processSignatureBlock,
|
|
2239
|
+
defaultImage: fallbackImage
|
|
1995
2240
|
});
|
|
1996
2241
|
const startNewPageLayout = createStartNewPageLayout({
|
|
1997
2242
|
doc,
|
|
@@ -2030,22 +2275,23 @@ async function renderCustomPdf(def, outputPath) {
|
|
|
2030
2275
|
});
|
|
2031
2276
|
}
|
|
2032
2277
|
async function renderCustomPdfToBuffer(def) {
|
|
2278
|
+
const fallbackImage = def.defaultImage ?? BUILT_IN_DEFAULT_IMAGE;
|
|
2033
2279
|
if (def.header) {
|
|
2034
2280
|
def.header.blocks = await materializeQrAndBarcodesInBlocks(def.header.blocks);
|
|
2035
|
-
def.header.blocks = await materializeImagesInBlocks(def.header.blocks);
|
|
2281
|
+
def.header.blocks = await materializeImagesInBlocks(def.header.blocks, fallbackImage);
|
|
2036
2282
|
}
|
|
2037
2283
|
def.content = await materializeQrAndBarcodesInBlocks(def.content);
|
|
2038
|
-
def.content = await materializeImagesInBlocks(def.content);
|
|
2284
|
+
def.content = await materializeImagesInBlocks(def.content, fallbackImage);
|
|
2039
2285
|
if (def.pageBackground?.src) {
|
|
2040
|
-
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src);
|
|
2286
|
+
def.pageBackground.src = await normalizeImageSrc(def.pageBackground.src, fallbackImage);
|
|
2041
2287
|
}
|
|
2042
2288
|
if (def.header?.backgroundImage) {
|
|
2043
|
-
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage);
|
|
2289
|
+
def.header.backgroundImage = await normalizeImageSrc(def.header.backgroundImage, fallbackImage);
|
|
2044
2290
|
}
|
|
2045
2291
|
if (def.footer && typeof def.footer !== "function") {
|
|
2046
2292
|
const footer = def.footer;
|
|
2047
2293
|
if (footer.backgroundImage) {
|
|
2048
|
-
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage);
|
|
2294
|
+
footer.backgroundImage = await normalizeImageSrc(footer.backgroundImage, fallbackImage);
|
|
2049
2295
|
}
|
|
2050
2296
|
}
|
|
2051
2297
|
return new Promise((resolve, reject) => {
|
|
@@ -2111,7 +2357,8 @@ async function renderCustomPdfToBuffer(def) {
|
|
|
2111
2357
|
styles,
|
|
2112
2358
|
computeColumnPixelWidths,
|
|
2113
2359
|
finishPage: finishPage2,
|
|
2114
|
-
processSignatureBlock
|
|
2360
|
+
processSignatureBlock,
|
|
2361
|
+
defaultImage: fallbackImage
|
|
2115
2362
|
});
|
|
2116
2363
|
const startNewPageLayout = createStartNewPageLayout({
|
|
2117
2364
|
doc,
|
|
@@ -2141,6 +2388,7 @@ export {
|
|
|
2141
2388
|
PdfEngineError,
|
|
2142
2389
|
PdfEngineErrorCode,
|
|
2143
2390
|
QR_ERROR_LEVEL,
|
|
2391
|
+
images,
|
|
2144
2392
|
isPdfEngineError,
|
|
2145
2393
|
renderCustomPdf,
|
|
2146
2394
|
renderCustomPdfToBuffer,
|