From f8ee51de001676a8cfcb00539daaf39aadedbaba Mon Sep 17 00:00:00 2001 From: Shawn Graves Date: Sat, 14 Feb 2026 01:39:30 -0500 Subject: [PATCH 1/3] feat: add per-user parental controls (content rating limits) Admin-enforced content rating limits per user: - Max movie rating (MPAA: G through NC-17) - Max TV rating (US Parental Guidelines: TV-Y through TV-MA) - Block unrated content toggle (fail-closed) Filtering applied to all discover routes and search with parallel TMDB certification lookups. Backfills from next page when filtering drops results below 15. Co-Authored-By: Claude Opus 4.6 --- .../parental-controls-settings.png | Bin 0 -> 229140 bytes seerr-api.yml | 74 +++ server/constants/contentRatings.ts | 115 ++++ server/entity/UserSettings.ts | 11 + .../interfaces/api/userSettingsInterfaces.ts | 6 + ...765557160380-AddUserContentRatingLimits.ts | 23 + .../postgres/1765557160381-AddBlockUnrated.ts | 17 + ...765557160380-AddUserContentRatingLimits.ts | 31 + .../sqlite/1765557160381-AddBlockUnrated.ts | 17 + server/routes/discover.ts | 608 ++++++++++++++++-- server/routes/search.ts | 210 +++++- server/routes/user/usersettings.ts | 91 +++ .../UserParentalControlsSettings/index.tsx | 216 +++++++ .../UserProfile/UserSettings/index.tsx | 12 + src/i18n/locale/en.json | 13 + .../[userId]/settings/parental-controls.tsx | 16 + 16 files changed, 1387 insertions(+), 73 deletions(-) create mode 100644 docs/screenshots/parental-controls-settings.png create mode 100644 server/constants/contentRatings.ts create mode 100644 server/migration/postgres/1765557160380-AddUserContentRatingLimits.ts create mode 100644 server/migration/postgres/1765557160381-AddBlockUnrated.ts create mode 100644 server/migration/sqlite/1765557160380-AddUserContentRatingLimits.ts create mode 100644 server/migration/sqlite/1765557160381-AddBlockUnrated.ts create mode 100644 src/components/UserProfile/UserSettings/UserParentalControlsSettings/index.tsx create mode 100644 src/pages/users/[userId]/settings/parental-controls.tsx diff --git a/docs/screenshots/parental-controls-settings.png b/docs/screenshots/parental-controls-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..660d8fb0dae77d7bed8c1ebab3e42614ebbec52d GIT binary patch literal 229140 zcmZU*2UJtt7A+h_Km_}_x^9Z|BOLN!a1I^_u6yKIoH~Ty-}9Cd4ur=2n4$M`k$9-AP`9f2t-VO zodkGi!yXd|{J7$#CienV*auz(UR<-5R+0vRilfQTO^JcmWG?^cx`9BHt(RX{P|i6P zAkanT>zC3R-bU;7K5toMQ!XwFQ_uQRs=v4pU$>^bbB9t@TB1o+VI%e_pq` zb#nk^q-@u(%eD7m=Y5qcnw*%dHXkE)z6a|=@ZoIAUt>2Bh7dIpkkU|XC)h} zhAD}vY~ol+z&=3;tb}N1?B0{7PLl={$^w>+HW69L86gLxDeADvd=7T^FC6-hXf-Q2 z=nxT&N4>gPe2=Bl!m&+<&{<_t#+IL4aVIU~c7MVrPjn_cDxqz~>)P^g2Ip)~)-E;E z9$GFjRY^}yPR=}yk@4}!%DKsJ3u^WYgG8+J$vw8*>dJ$wzAQ}|0YUi=|16Wase$!5 z(r*YYnz^V!BBsUs(h1*7YvcKNuCgObwEVOlciE|uRnsRA#16UH^=Bn_e8n)qQj;yZ zViYvkvLvKgM(=qb986%z?CgmpK{j4l5)8nH=G0&BA@&wb@iNQLvmLUMzr-l|+zHEN zbL1h(zBAPHk6PcX+WU}$5Qs9;wls??#iC1#m`yAtD>>B<&;Ds9h&sixflnDdT&N^k zJrpGW7+I`oq#@wwiSzJH|N8Z-re1DAfy_}ufV7uX|7+Og+*x#;?EDUDwNU&ukv!RS zzn+SJ@tU%@z~XT7U6j`C^c%vL4|q*5lw{4Em%aSxatN#L8Hh@-Q5F@v{O`=AT+ZAy zNcm6G5OT=yc4tT?>~l9A~onLW{8y zCGeLn53)xTMSsL7PCPBnsZpwSk?=POmIwE^-n2AftsIp7c!&U{YN!3B(@S#H5-p^mbQE>v+>5zCS_TZKowUqPd=6*3Om8b{Y|_?p6d( zEFLSA(XFsg86n*2_$7)-B<5cXp5iIh@ugqxN0Pe%QxbT)8F5TB*>41Q6_v{dZfyep z=xqRA#`?WmYVzra=)|t{8Jyxtix0-&87mPjuX~pNyurQA9AJ8X6J$rz;nDwZ6DoI6|MQm3a* zb7pYygwpe76WugbqwV%Lbr80ExiK4S=rz@Nf4O->up&P{zg=@bvLNTog>UFXS8Tn= zlMmhQbuh3dl)nd*+8M-bDgL3$y)Fx^X&jTB7v}!MVnPGnus8P}zK35a?GvOpqZF@1D%VjZj5RpvbANM{ zXBj16A)klrF2T^fLY^yES)B)*eFdr>$Dv61g#JG>FKoH`P`%omVTGNDdiTewfk))%ZUEu-5NTcCJ%^c|*(KKX7lMf#N!oleGfvXseM4tCef<5!me zzPoT|B$R_LG(`9fUuM-6gX=f>`d*7Mg+8;s%zI^`hL>6FQS>_N?c@$yVIZDgXBoUq zZxvqbME|tOYCMvp6?Io$F~v(SYa~Cj?;^Xzbsy>!9(5l2>?JVjiZatBAOmmy>Ii7p znhs6e{F{tZoUju+Sy{Ao)gB6m9%&^UbU&-AR4CiP7I!x8@hB_9Bqdp4PpOcvVKB|I zdOn%}gJ&S#=EfH`1~p7$fA;QX6VN5j-@j^U({EF~@A6)0%J~DmibW*nvcy5T{+=!k zHYkIKt2bjX@(0()rr-t!G>*KA>Qc%ZV@lgaw;1C$+spUgg;GDIIL7Wz(KVa{*?o@3 zzSa$UA4wKb%Q6UW2WRi9N#w*mX-wT@`Ax@;L6I6(i;^FL2_}?Y`k<3~9RFZI= z3spvw;j^?bL@SP!ryC>Jt{J@o{lJn<^ykdkV48i>BmubK;nL${?dwqr(e`uZQF4dT zp;bljCq19;6?$u&vDhc)s>9(lblS30)77!kWkxSU+Y8?VMfce0j3QcYUf-+rYDm&TO~Fwuj>F zbnmf1|7WDMz%{-jdQkyhMiR(!(0bwRHZuimAI0;>*0kA@p|?B#>7(fAICO67Iy>Nd zg#gbOyHny=(|e3A26Q!E+}p#LE_BS}Ukil(l1vh4BV&;BRClww&la~4oiOQ4YY!}? z?}RU2w6v`fNgU=6BPPks$|Y&JyGQx8J~|jLQHXGdF6NP0fhf?4CQDDd4>`thywqJ+ z>j_D*w&Gy`Oj>cRxo~miLIY?Ia*82S)J^GGj<3Lig9MK_QDIu*EW%Zm_H;>v zxcV=damlACK7@oxYYFS4Xfn&ll+SDtORvGB#uyz3^PZk_JR5(+O(Y*)(zMI{dy7n> zJWZ1{9%(rt#r{pUApFpzZ&ujBK*xS7i%acB(CU_#I_=c0t>s=w9rR}}kQWh)LGs;Z zxuJLIMP1*(JEQ6e=IyhhH!a#q|4G!L#HGQw)b9MABHT>8Vo30r!26@!JXR#0g~;9(vE`CY(7uJRo2fE zSColwT5_mY2&n3ihXb+rmjf=CKeDH1cemU6fBCGzJ(khu&9NAg?Yp*b%fv56uh=Y31Gd&qvYM|8m&B0^qC2;Htpl{xl96mJp~K^rsaP zq+SaE`TtluuA))s{%|t7#D>8Eg zsYpa*7jM^%!MD0UTzzy!yPiIMW2E)5q(mS#HujxuT8wKSznIv&`FT?cDk^MKkTmdv z=*pBr(&`@i-hW5`GJT#YiJC_cJ)XPukBp#oU&}tjkgC3R#O7we%EqQF9L`EYO2RK8 z^j=kTW~A%i!!AFacj0F*5)GuYl9Cen$2FJ)S9#^R?;?vYmGcr^5z67_fJWiWyTu<1 zp|D(B%*n}p>EUs6Z4EatFz}YpAmzS=YoDz*#FWTWgH{A^CG<^X0Hr@7R`*N@Ui-$V zp{4mFH}^(Jk8}GwA0->xZ^09#R_Q-}(0-+%0ljS|l3Cf@L>A8Y4a`y$8qZ`2Qek-ZI6x?m~68s$qQJ{ zd3-8F-Iu7WzU{W$BfUj1TAwVYHuO96W!M)v{IK-z(*X}yQgVZ)enw!?%>9dHcU(3P zU2Fo^cYr0tV8-q4L@>U;{8iB>H{7(nXEj0CnsUv~zSzFsX??PqGtcvJICJ(j4-b!= zU%!y^A$_P4q}=>_q?~o{Ksfa>xL@KzAT@wMQ&)WAxV|+Njjylouz1zHuv}e+G?;*O zb6eR|17yhHcS^CPrKND;9l?r<&?~%NXays+Fb`H4|I;1@8z(#9=2_ewaL?iJG*_}p zp35}+--DRbxAro{Ka`xg*LRQL@ZJ4X@BvR>LW!tk{XZC|gInD+7|i1XCf00bwVIaC zJ8!SzoUjCMwF;;DCztw4>qF++8lzCJ{i^^+W-%`ZITbHnNdH?=O7B+?ZxWLm)&kGp zRpA6uzizfKdO%~Ol?)}<>~JpY>8&oO;#wxn=d|@5qN@d!;@cf*WAnU4POqGusZLMN zO14B!12{9Q0@~v|aHFV^q;Ho~)4O?HJjVG=%lMC9m7lq08&)K?zMte2{Ax{dc9QiP zGs5fX>!jmKIq2R2BmS4;M*tGs0T`SA95fGoD;+Oabh_0kSQzn@h?hQ2U@7PHw?t=x zl$W68k`tiLmmjJttK1yQHf??vJOCY!KCJM(XX1?QM5w>}XgkDTTaY+pX$k1uF!=F0o!Z955dr21=>p zTl+@`rrlZGvk$fKDJci9F#yE;4JF_kKmn)fAv`bHqu2yPq0Wkl{FzmUK1?MJ?V|;B9{|B=XBRe)mZ6eXa=cklUw>0ZM#k*LTky6U`}Ku3L;@LYljWji zf>glcI9^dkc)+Z#iG%;ty=Cx4z*exgZ)^8>tuyaODvDF<Ib7gaw^wYohb zeMD~M(*Io*!ML@xVrOSM`jDz7S0C~Iu+sY6k~`#dEQlF#ulWs;xmah~-Fv>Q=6``Q zRW1F-CD;N!#{Zy7NolawRz3C7?*LZ)gWDe7m*|SzsfsY4o8^g(jWeCC)7szMLUwe7 zGBHsV<>WN=B$n>XdKI*UT&ziA_9kJp<`gLA07#Rln3ub$jm>p7w$=w7mM4+PawY#) z=)Yjt3iqm^Lb~Ycic&()UEDq0P5i908|*LP1~~H4@8Fr8x<(81D~&pUwDI~;?ybMK zQatjIRyg!>%o9t#YC73D*u7MD6RdEW2q$WlahaAY3Y|-n@B70b^YN^@ES~}Z!gkVr z37Rb_$4sO5bt}GtsfM zkup^ra7J0ymqzM>h|KS&pgZ~E_B&YgG8+2)m%GTAhOfT$syBZGypUH+dPWo}+F?<3 z?w=6s#si^lPqgW~{@*+R=+5t3$VlWeuMQwJO}ev`PI(H{ZjY4xg|>;muy1DC;mGXZW6C^{o^DEs%x5RFZceSw32Eu$OyfODrVFiD>n2 zkJN?OBF+5Q&r1&sl|u<is})NSawO^zx~**qV1OY({c3ik3M{lq{Adx>5EG z?b!}xXH;a->OXU$)jsI_eeeEquMZ;s;WyXWWLkA)x53JkSYY+T{;qyahd)INuP1<; z8)g4v%fBc@7cf=r+Q)LZtPjpcm#G5IMcGR7Qo6JF-$$zc{*#V}gD!pO4$7A2v?9ip zAD9!AvA&42w1=heT9zz(0r>vcBx2yCT?O9nYmQJUEq!DEx?o%Zcs;t74a{$P_O>e0nFHEYH{u?gMT87 zDt-d`^FKMVEYsLF2C$p-6eoB*iz5ubaC6Dg@)$*>7+RB6gTSz!cZs_nT&0*rfm?L7 zz>%fUs`o9YZ~gliqO2HiT!F}-P~~k3m!hL;-!S#?(;8p@ZON@|sWfg7fBSaxQ615N z$H5breAB{#)Jey4*=rV=`Rv2mbsg_ z+!6*7Uw(cQfgt75*PM8ceEK->R)pXVMecKwwq?K=E&Rcv5Uv0ICp~-qi_7m&ec3nX zRY(-}YrK&(kT=geWf-jgX;(BlAy1rX9nr~S?N*PvT&4dW;p&PFwU=V}q59}w&uPBP zIl1$0G;&$nciL@hj~g!bJdJ#@=@-P&GdbaBsaA%1VqTv8@0Ar<@5Qg$MA&yFP*zQB z4{Ts~IIM-xPd^4buPo?Zfxr7w+P&nQ^x-)kn=Rk5E3Fn*2qPC(- zmElQESd~Il3@)`@WvfA@-{?Hu?$VL{!lA;U`Tu9KQTJ%#23zWS*&ZXs#`Ho1M zn6c3rM*yyO1kdV;#va-98{15~YsKY`4oow#yO)n`aX=88Sibj8L2zzm{AYub-Z4ALMwe_Kf?Y(y2^T_wFRutPuG=c>~6ryNbTebghWU^{K~-=1(2# zJFI(C8hSpC|Eg(s$+@l>!p}E5*qL8#n}%?=9d4woOqR3z;rWjn;mb_N9mILXj{4#( z#%Dqmj`pZJAMONb5d(XXUXbI|SG&-E}f)i0Y?EDZQNlxKb*K|o5hPi=%&*S zyo8u+2K^)hTG1zIm9Gry^2;btEO3cYXtna@eP;YFo!9(=Cg*m6^ISOm?2y}+es8G~ zt$j32464Gc+3zgG;10NopK@?CBkAB2TcY@s1b%Z8dh?alnP~P@oe=TBV{<^js~BgR z?Eg{;q_Bo>2UP9#U9=EUN&F09^Ek&~T{bRi8Aminyq6|!9-kh}?Y(8`inyH9skX)ezf71 z1dXPq=6J0aZ{PuL4$}xfb$jIY+o@qS39|n^_`o9Vl=O5b%6aC!SL2yRvgaB{)fRzt zJA?J2GW8~C`$wY~Ib8rI!y6l=bc`v#$O+kdlFN5VR906nT{9;ZmH!fWB$uy<36K(h zwZ=5BzJ-Wj^KZgFF6Jq>FcX#*T^z=Jt0(Loy^qahb z0&G}S?ng}xV`TC8fhb-7-rCj{iW4{wKom&@AVQ8YV~r7qh-a75&`H>v=FZW{Z$>YA za}bS0_w6rI4Lfeib$2iD)$BV6*@HGTD{nZD%z4m;C!W(ts-6z zbo*Bbh>z5S!h|y63)MYD^qBB)My(%f)56U2jXqNa#blClDfdm;wEqlD-Oy6mbxUr1!A|_v{ku=NqS5Lx2#9pgZ z!W#G8nT`}x(sFlx{v|)c6Pd;*|B{I61lsy_U9O910jrJv@^=<-Y@87Q*7COpDC1wK zsBlUt^LRS+P4o@U%tTF|>JrTuyTjwPwa{qd-dXG4WNnL}iFd^0(}{Yo zN3D0+Z{+3W!3LyBAL+@_m{XAQ+Pspr%zOgn{)Cc2b<%^mdB$12Aat#wAJEx6ry!@( zwt9#)68T0pShtieJk#^p8>0sa0z(!rcb< zSxKFWZG3{3p!PcF_h}#%MSEJjyudP8eh&D9YN*mltIDdOm7J+>pzNQo&uT~$3f#@5 zf%uHv@ZSV5qAdnjidj3I0&?V6ZQ}@^J-zKCxR<4tgw5Gq=w6SP`NSXWPCFA5Z0AuL zQoG@_|F}#0f`QKHm?PhBje$#I{Y}1Zfal67Y>M@$>M1u%LKX_NK0EYbbtr2-B|Bw3 zx?5sPV#7j1D=wq9R-4Rwrzrs0ZkgUfC9!>rr)oQ<>fo%Bv>j<*ZYI>nA2?l%GI912 zY1k>)LeDwXF+i)ZJdp@jE<<1c_0zfYu_Tuhnlbb)XHoN_wm~qnxTo1l)2%?4vy=z; zaQkhqF@J_4XMdu8$)l?k&T|N2@}>Fr)NxN2u^SCT~Z;Q}$G& zyqouhlr6O&s(@*(U1fq1SZ^o8>gcvdkpExeSeRthnfuFMrYYJhJLjpFJie&!Y_8mF zn}Kb2<+ob&a7b3P1i0X@yDEvORzE*qRYP62Pl2vHY^?_7kBp485X1#at}>mP#>UaQ zrB)17%F>i?dXq(|4-O7ytsBY8O^m3!y1QmhW0$NK8DGIzyQ>n4ACU{GHsn~6HTVr) zU<9+_45hewYE?B7AtAqD-A9&APxQN*Zx4ym36`G=R#frb*0yr2=C@4QQ#lck!V~oQ z>MQtvpI-)p8z}`PSoG{EgCMK6rsj{vMygqDaKifF{hsubmc3CBDA4x^Pk;>VD$G_C z5JBtD0{!>TM}l_vq->h~0gDZTY^-}1a8@&OZ1Xtyf{<3b(|808-4ORY9)+5osGZ{~ z3sJnAc(Tp&`J0*#k<+{aYeZl`zV} zi|itF#D$CS>_MLw8tPQb;B~RD%w^=CJkClq>$kLeJnPl?;R26@V?!=>wvHEM;ZeD{ zPeqi?D2~TbJZ&k^bE!?jM6}CBe4(`Yo`JE?%aN|JPZZxXN~zDzPF-3`9zEgU*g-A} z^)-J%qRdprjDSoxHg&&1UA|go@&H1P4A~TW8N<+ zlpexQ7UMB~b7$JgJDXmZVRe<3qlPo?e4~I0=d-9@H(2kSVc5k4nqnG15tE2hOS@81DaI;)3(BFuYeQ?(*Ck+NaQ&}MaH$;fIJofz z(rSQl5WzwBCq15<+taY2ybp8LrLEW?QrAavlcF2jy}L(ke#rQ0UZ51*q@iN#3V4!F z^PVCJHZ@<^j#!%kwP53zN<_`y&S%{R2F%Z@w3%$dUnwxo{h${AZU3MeE5e)O-pCr6S< zLAsm>@C*Z0)gU5#FsSOBTXW~)&C;NM*X!<`q1vr(#GXr_>x^$t(%2nFDojePr>TuM zJ&M`yZkCe$Hqtn7(Zm0uVrnO8j?mnDk*ET{b8)U>++2*}dU0gLfAi$rZ450gLMW}2 zT0WkpiJ$+7Yy60eh(;1-@$@VV?VapJZ6b|6%m^q!=dGKDwwCGq4^s0^0RAe|&M208 z?c;<&u@K6J(?xg_UEv9sQheXUePgu+7_6P*Mk!Vi0uE}fCquNbN(8DqlC(w_L3d5x zUIDCE2zK8KlU8&V-XpiH&(dh2JMWSZTyf|rBqD;1Ro6P%-YK%qi{vFv?y@EwZqMch|hz!{a1onZ!Ks3kRHyJ2-LmJ(|8;o&sYEB%5tE$aG&^* zOci?CZD4LLT8`z!&4l1`sC>O#SduWT-v7PQ3yRQlf4GLj`R_bZpks?+Ku(tTdru8j zI#2BC07cd~NQFY%3+?-tlnpSHF56a;_c^WqjbxQyA3|JG!J-0H|8$2HuzTGV8(O}f z#Z~`3QNNFxb%ph%tdD3DvWipyv-ihk37tp*Xg+@XQHq3|l9D^Z!e*Z1IvVQg!ChVQ zlA>y**1a!ZzqW1T^$sg$j28T{&e#5&Ja+5^eM!xXMVGbann(Jq5`3=9^m6U^Q<9t{ zQ&z9^&>Yprl@=V96Oo=?;i=^P7EyW6u zcCw{N_`YXmGRQG|JoMa}jB2c1Qm9%e;e-t$ zL>0KgR)x+;Ya#D%3~fBkqeB1GBM{97t+CTrN-=A_h^#TUuaa(ZU@ejz>G*xxd z6JAakB@bc3VJ`2ydb~d^UEsc%#L+oBP`__xl1#?o-YkV9L|e)4|y( zzF(NEDIgnVF;`sbPA8di3RDBlGQ~mu<3Z* zf#OBV(itP1@wi?W`c`)6j_R<;a7M!qmP_I~4us^zQ6|o1V(y$ErS3KAeZG?a^j^b! zHQn!mdgiF8D4mi8Z;^)W->tt*nkCj}>zP!X$8R;@UviN<_H>!~xB})9H_RbE6j={q z`0IuJbv_=~?sLNb1J6V0@sb?+{W0Bg1^O(!agF!xcK`9{8_{L#akbbHG2!ZNq&82C zN(uQG@~cb`HQ&<&=EvIU$uKKwXlgzRRJDx+blmMm3ybd`KkC7z5k!2V zv;cgX$AuyVD{S6>k`ardw@WrV@6L1HkyOb0Ns%zx^+wn*Qti(JD+dd=$82$*iNL`D z&yBT7>cxXnQ^2)zT_$5m3}ua9nh61BakSaiKqpY#Kh&iU_ZjpaL{~cdvS@!K%4R;| z@V6N$Ptcm8_w|RNoUzZOEHN13I$cHZbFlUKYRC6B*e6x%{YX{k%5w9-yoBahjlJct zE8Nr@Q=dIe?dBzvCAeYlxmDZ>WU&+8dTpE_O@${mt|KtjYRIAV+D1297+UtS{ zaO508Zvky~z9iC!n%#8bcTqQvMjTQa5GER1<)DEaMm~!kUih)O@lYbtk9>~4L`{|t z-WrN~Vd*Z;6e1A_wJ*oN#6SSG^aG^B6_?^7rp5qr!o0%RJap@v_p_?qhB~eohJE~& z2sm_(h6T~+gl7TYI__0+swAP*aAVMj`m@9N99cQ^cVco7CD^C!1=xMtzpT<36#@6@ zY`jXUEVcS_cw`iPLD)}#C|A$a2A)GNZ~StVx||ownPc0PE??U?BnQW+hz-sheaVdA zmymcT$7+n5s~Ge$5=x0q$lS@0Ttu*$IKSuHbVcXSH@bGU`E@D7UV90~u^FtZ>2y6Rlie?J) z#&MD`E2BpvuQ`z>0~M9Xo`QcmWk}olrvi@VoLfUi{ja4}pW97enQJu$q zl>}m-gad%>FI!4*_BDI0w5Ta3d_}E4!3`eVwR=NDQ_HM0Uew4sHEEH^0H9iQqM+6H>}SGq)S*Wq*D`;SuJ8$(}jQsZ+=+fsCr-7}nO7R?61ocF`&V4#Qy6aA1=Ww65l9 za4N`T^xVr!gq9U9wA4e>SXyVX!w+#Wx!x~vmfVw97#~Y+JJ=l;3)GpUsxLdCE{_<) z)30*?4~&aw1_}@wbSJQvwAny+BeiJv=e-3p)D3lkm=9*Il!@(T#K@bA5X4d927Mbn z6Bd+s-ZsWf9&i=hPtkE9SRu8yXLHNmFr3L{;I3{-}gAC0Q6&vp&g zvaZe{aa@GIii1~tjbD;<=3GhCORtKRGhCqH>r*wBq+=Dw`{fj+GWpiUajSTc zfLst1RVzccicJn14!#R4gEJB-lD`xiaN$o!E1i*@d0Oa)qHY{vQm)N*CkBPr)Z|)d zW~*S-4M+8?=yP(O7JQ@ct?_h%YFlZb^GI4 zi;%q{0o3q=W-61}cRnjyOieW&{U$Ch&)1(?T%e!J1Ta7C;%pMch+6qh8@{`HSAC33 zKaD6_>hR&mj~`)wUURBy>VBY(<8E$9b>jDX9iLC-g7`f6Ip5Li=*-JqO4-hiXx zdY#iVGs%`yY8fkMP96Q1+u_Y+A8pNo!Jv4aOKSbSp@GtC_Qd$o4{T9^`%-1~Cwy$I zU32AURllSp1++Y|0x4MWm(;_;L@*f06MUNa+b%BXmNL-U-!|w+ihK6 zIFo9y5c*7O#m*?=fW9^Jlg#~QB2o*^e;#`=ncrQWzCa#bOE3AuRTc@l-DAct!Wk<1 zY0laqEKyHER(fHtY;8&GJ2h(==(#bS+?YNX?-w+9d#AZVBuPHSaxrRl@Ym;!R>Qi4 z4yI=^-Q8P`A-j2JjyaBP;)vR7Lv|a2m0bFiX3yP4_}LU-J0{#GwPiaypXYDK#>e}m ze5qj0N;rPAH$9&ISt6Xm^^JfM;e0O!s}m4(eYWG-EBmlySYqQrtJs1z6mQb zJQ5-yr37-(-W5=-=XyIDeT%RmKG#Y*W)MnM*w9pIaJt%WI#uDB?6Xu`Y<6N z(zmg7Y)`aqU{X?w@^-^bd2f_Q`D(r82Rb{LGA${s`oH~>8yprQZIxlOai$aO^sVu` zM4;v}hN0rMHtOFNtFZC8v5*5?+MqU#8HKplX3M}fA4}juzpe+qS(pyf%1WST@kZbG z`Z|Xv-1a~0YHZbIm0*RRoxq!zoE_R>C~%Z;UjN}79|%OTw^aVUyqfH+<`DDip#Lf; zFt9)1xK{?=^dp2Nyx(xg7T`qly#>y>A`D&utoBo0_S!)9tJMM@VUQ?vf_b#GhX+ln z&!Om!TkP}W!0)~ix)|&a@qOuw@U|zI!2XMICCbl25>Vk?L)xmife8cuG~TIKL{0U!msx)UW3iG zEaX3or*1dQ)>ZQLErFCl)WU4NPhk^9G1SB9+#Wk#HXbiBB_H4vcU+pXCjV2F%ljkk;z9rJRmei% z;`;4Aq~aF}QiSM20OS;XB+CN-J>~6E6Qz<1X2 z3M%)9vjVIsRy)=l*vbNWt8L`RoN4(8aM zaTbLwo4;nRU-?HvL+fq#hMX<7y*DSXpt*L|;~OtNpQ?@ydU0ZS+>;GmRS=1jaL#=t zC%1z!HhSTxbaVDBbqMfQ9>8DlJx|7d9Wx5S#$sY)v`<*t$Fib?p?=PNrCG^S>fK`QU$w_?9%> z_`c7yIORV>j?=u70n=DL5~i`~_TZt2dwo}qN}=)8Z2{zTX(N8ge9G_&)#*hGSih`< zxa5bb>Eg6tEX`LMhzt5H#K_}wX%#xFIV#8v=#n!T+nnK3g~J@wguDhs)dfVq2HtME^lc6>`g1ZWDirt^`K^ zg>zxZ(u!=tvjUczHxD3-KWV%#&ia~E2z#`AphlmSi|x+Dp?9zi=VWkJo#94cvZ9FS0_c8;l@ZT0YJCM^AS$YW< z(51-&5G8e;3U_|bt+f_vl|mVy60NLPeszzwN9M6$__s+$|KnsT41Ozs>M3W};OuPB z#o16AzvHA(GVIiro{_P=i1obS$)`HS&Dl~qPGy~N^JsBK0D}Qy*v?>GM-In--g^TS zY>Ww~BA2%TlsPyM61y%A-Lzl zP2k39wHLFqQpxUrZg3^cg&!VLp2NM)uakbHtgdMgttWO-+c+K<(IA7vooloDL+$MCca~A9&*kK-wUVofidad3RE}cy;<8e7 zZejvBMdrtvLUsq)?!coQ;e~*(TWJMYrD0Ql;6HLE33sEy(Aigp{T?X^I#FiU%hKJ?ZbHI2Alj^dz!F?z5#% z$E2wE9v+^bb$8MIjv5tJ*!~kYhi>{bu@B|U>&&kKy0md?YOm(LBB+tuUcbMT+yR=J zZu)s929V!Z1`0#Ry<03-NL!0h;IMv!Q?ko7blh~NjC$w8eca3pZD!|bxYPL6hcG9s zO@Gs=9`DIi10?3qRx0FYIWEA2lqAbeExDnjr~KNH!RQS_@5VF zQjm)+=w@3Q;g}v|LFMq;@}>iEhsf_oM{^@1A2JXUU~<|X6jmj_HI1+j0of4g!&@2x zW{d*Bp4WkpWZ4qMrs()!$U0mQwOiG!Q2eT710L2lIPfO=QA9K%Q`;L!1m>xVa&x#dtC+Z#Nhbz?4&cxB zBE3wJyO#9K49Na1{G&}g5--nj?z@AGZw8YBG?+_Se8VD{usP(i-Aq0(I~&GIScaR< zn}(QlenHweZ#7LhSFYw+hmlkeUJ~iwep-}sY48H+@8jJ0(vkP-qV@q7ps3Upr(Z+@ z{1{MJ;W;mq{{8K**!ug8`o1sFSv?s!i?62#({JO=z>w&LKVQ^_hey%xAIag8C~4x; zn)?#?TT^sQp7x1OPEHPtjaipP$q~-)&d!b^eh`sP_rIIb)g?X2N!gc( zGeavM z8zOqCmk#=Rg|P5FtFduO{=Ct?u&J^kfRg~&PAl{O^x7r|pX}*f0XaL{xAtvd*sli* z0jLZ1?~n$JVuvMH*q7eV=1_MT3>C zRR(B78sq=QaI+^qFFrOFos)rh4is@ABI2IDusfubVm4Q-dQ(?NzA}zw7QowDT2Tu=JtzokPvhFZ~raOCSN;W z?8-0Jd8venkQOBB$|DSMMPj#$>UVFvdL_5G{9~7WB_V;n4gBG&x2})qwY*FV+FgDoHqeRnu#wsbzU%aZL-)4IB)za73QOH0(n<(aXV!N9~O!2^L*;0eTh5$p3HcXi?vPJeQJG zvLMGrMsRuG?*?4m6A_(+uz?eIb5G;Se|4b z+}`Fh^4k!Oqz|M$>2c$opIA1QRyi_)Eo{#9GC-|`D8ovLBa}68&xCt(om+a-s>T*` zZJ+CE9NFBJ~KnvCwjQ=-VxK!SKq+kp()63KPjQ1 zt=!sEqZJ#kN$RXk+jbNay!#VJGqFXfNP zM1!Aj5ZhUWfS-__9=S$RhPkCvfd>`y#)Ei3MUH+X(DRM>;@Vo7Ifd`Eea1mpDnF{F zUQxy&oZcHlQAxkXTTE2GS#gbELQrA0Q4KZDxLSQ~@%>7jur;=AQ2_+n)B83!`R5wQ z#-6U>#5<6rb6R^wM=#ozN=KSt`jb z$E6|FRiGh`8_Zav3gEAg&U4b;UN7%_v%l!f;et(lkl;O!jQF<3_zC~_XYZ;4lrxIi;JT@-^hl(3tnK;QXB^MkSr}(4UdfcC@a&T zA_4&->atG~fuMBv^1{vQ)Sq~YHyp7-W##0=fzOaHxxRf`blVyf8ti$OT1>O2{)Eh1 zOQsZFG3x%kjO#c$t(gU3dXlFoVTXQd0wQZjqrB_m=~0Q*ws&rg;l=-H%y`0YGXL%? z#C+A#CdX0QaKj-MV(FT8rGHpnLm7=~lw_?x6E9t3H}=N@O-G#CT)m9n!~WD9Fl~R} zHQu@z_|gH&QCaZ}J3V4O4}39v%`B*=KAHsvk3gWRZ+p8D{Xsv82{r;0bEk#Pesli< zW&^f`r@}1hJ4H`7aHIhfW#EC#1o}+UXqKP1JDWocBYS$h^-SNx0N>sOlbeZ3ZIXuIDx27r_siT+BYgZl(QC;BRJHvv!-)sGh zn-V*EiGW^SEyD3Hcm#1N6)7k-_R8W2q3d20r5kvhcXWQTNpl6Hg?8ZJEhtH+M6r5` zfzVME)@70(^X!e8Qhg4zSD4mccpOl~mbk{oYoq$_?tLA)7<#{$Sw23wQ&k)N`&2%u zU*GLn;9euNSv7)EE+8P~3!6~^w^G$HHC=jU^=-h-CaLi|sxAJFm)%(|s=8Y_w_BuB zZT1VM3zUCKnNf!osSuL2yGv7ii%pP;OByX%)_+ND8P;kD@_+~Z0UOBZdPANd)*SS zIb*k*GOV3VBJ%=1t6r@!3f#DPKL1&+v?88-Y-GfIYnCS-wH8ocpCIB4c;=-15WWPO zN~ijPf1PKJFtMM1H^fYIJ=d7O?9TqTwft{yHfP?>XxZw}!1#D*fpY^{6_v$2hHk-3 z=jii~`}?f)vILo$a+-t$%Ix8+_vxwYOVmU(6S_Yb4Nfw zuQ4Lnx-Cs@hv=VJ6|fn}gZpO;I;nF9wM8Zy-6VpQKeJTqn@_eHt}HH==M*M2tVSjJE{boT!)UJ|NzWUp1q~T#nn8(}+ula1Hdw`w!_%Wn~1HENB7;~`S+~nt1 z0F!P`@){ly7!)KdBJx+eM?>?es)`k27S7FOrLetU^dikjeRuEB9UT9a6NI}q9+oGz zQA;8;spSzV*1OMs`Vtn}z)nj>*6z^r9&IF&+*}N8pPGSK?MOGDhzV3a@I`Xpc-cYpYqE1qOBGHr|YU(sfl#OPo0WrKS>Au~0Q<7mgi<7T04^<)laihjQT!j!Nh zo`Nc&(P=EPc(u5ymIJ=CU8Ts59d#Ye;I^1g*=KKMnF}3W8QvriKd2&^5Lu@XCX3sV z(%Iaz;Ec?}$vK!=ckHxOef@j+7T2bW<6=*>yMBj{&~4Cts?1;k%{6W;UqIroDCIZU zM-m^WG0hk0tL`h0t>8UsU`NG0)F`D4$d|~&E=c3y$ z$<-{nieEw(so33?lH5=|0dvda!DF?ff-KD6pPcrfGd_tB%9|@`0*;Ey zpX#XxWb|ve%Jt`QyD)sPC7DFf@4)3pGFv}|Ga}LO!VXtw?RociqWmgK$dU5a?c&cJ zOr#$~5A8-`K5xKXf7yP_$_2)g2Iz}1POmW-!Xpn47SwGz)CV`Mu}}ZO7u2`^&&zhZ zw)?mAql);NiqccJZ{L17-cQ*=wi=wdgM5BC>vyWfTR=|k`dE26H9>k?#AiPUH^q*% zC=oU9tZ#fvE$qFwalg3uLn~O_Vq=YmODw_RcaxAw3(dHTFL>^s4M#x}15L*GwTc3` zK-+U4e%h7^q2t*m+8!cIjM{QZwmAPn@j?w5wqjuHBZt*z5J>JeNJC_dAY@GN=a9sHTyNtI~VR_~~-pq370(vA! zSqocb&rtSjCi;-h8T5p%^!%+OtP5~$7P&326}XKX(&$lZ%sHqAg*Y5u#Ojr0V~}R* zWsE_eDzf&ZoRUyhU;kKel5GVWcWR-eb;W$_ugxWG=xKzNN`C8OwWD2Lf$+oN2e%me zK2~~74lkN4o*~PxToXZKydL!*1xP=BM43vqKsWS@BWGhd9P7>cLhs;?jf=+zIO8gR zl6ZPy;f3(7$pCi^4ga;PX#YD-&E^BtRZ*>8o>XQP{m>P;<2nkz&^H~VWT0N%r({W z@_A~!YA3dn2fw;0H6E0oLhH*(Q#uo7XZYYyJ}WOJAaOz4fB#f-FC3rn^0CO)NRC{i zW5Fno$j!|d22kcruF8#MUfY}Y)PGjLXShmec1Y#CTqH|&u%tL1343p8{Tpziycu4x zwX4pavMDGnJu{mx%j@ufes1@f>Z?{AgIUa;zm6jLV$R6$$Q#Fj`*C@oT+FPt2={xp zEOQjJe|J&pA*dd&fJ$D}*bh7?`e&!0vU`cyc(LE^j;<&7u%zVS*ch|+(U+0IUT9xC zVL~I_M7~RNHxL%@IewKpKR3Uzv5CPLx5YO1(wbhLm-oi6bf|{N5L=W}FdtfDVn)|H z;GyCWC_174a#k;m<^hqLjr%P}M{8;pR@OqZ4h9-_IGJBS1NkhoUocv`6ZR(zp{eo0 zXr^;$r=B@;f?D(NTsAnOtu$aj&D{zd*)cPI>Ui# zZpbtd6Frgn1$O=V<)8b`J@*Yszv}uV5)vaM9gOBwmr6@riLXNi20j+|f;q8QsgtWy z*cqoH8c$3qhqfdXs<}9)KX2S`J9Qnkan0=^QdLzD`uA4EGJJibXXATLOh?=ekFoyc zjPzBvbp(X1u)hg9v;ODAH|5gfSR9PXFue5cf^*A`garu!s{Qt}jZD!eRT4n5D)ts@^m?yF*U`=$QugPjqY z?d{gaRW}IFL)G>4WVT$KgRRM$1%-Y(b80dqs|?QlIlZ+!8Z^_-(A(c z^Pf!ZOWINQGl2gBz>G5Oti<$PC*T40zloJkez)U-3%`iL7q zB&cX!rN7l z1TXI0ISPB&bkj>SX67~@+80}*rE|M49w$r_vAxb4uRIn{)NfRd_=dcXZZrL}HZy+0 zaBlh6+s~6neup7zJw9)lX7D<%D;HYoJ(QZ#DTP7X;-7n9bTs<=_($@$^|xTrlUK}Z zcD1XaSZ4c0v7Y0zvhXK$SGU}ULZEtXt$s7@U~HeGnK3^`wChCgaQB<_espqa%0i9? zUpQL9Wl|xI1Rn3y5p4e@RYqdmmYc(WI@|r?OiF3YeMWsJ#L-d5F%07qjhi3aXRm*o zdcc>WQ^#q4D8}YDmmlF4NEs)~FvG&ZBH&*22MX)=2oTAtV$y18kYe(?1bUjBXC(dDlD%Q-Ta<-y?N!@l444S>;WqMF`VF@(2xhyRa zu16`~rn`t2f5n9!ST<%^SgDPLE%10(?-H%+8vQ4Mj|A;!J41sB(bAV08i5^(A#Ejy z;@Fe@x-9JCj#OkiI*CPVio3T5j_6fnO>VDL{PwSRdk;F&+}4J4>-@va`ppkJGTSoe zcWrVUO;QdwC*#S>OBW?h<}=Rz0^N{>duf>%R@RzVMPk&!6F(jL3{0B*imko+&6Xx| zvXOnZ=L?+`g@YPQb*0l!oSe!?@9)ty7%8$xBqp+KV>WdXvcW+Ar}xG7N|UrCQS$Ie zbDbhBceZA1X)A@8`C|V%P}kOFjC!2NydJUqfp~R4TbMBo5*}JPJhuB!p{qI2 zJMo>17RLz=;FqP!O+artu{JOV587u+FLb=|K~ba$oNIFHd(B_=n&cgCWUSlj8Z=-Q z{n=4a>o4fDoV3%ZSsToFyml5~Vg7*QXI~C$h`8U$HI!7S0C>3zouTnNOO$pRmmJCL zDN`=c;_JU!V0>fgqqQ}Ox4#AleiFROQK2;;w;#IZzG!3XtC10=7x`+3oGj4)vn|cJ z?a-zk3mdfyF=E0*CVgMjChO&Gnc~Mi?$-F0>i(J5%@;mahmKLJpEflG=s0@!8cPR4 znGG&1;$9t(83Yo-z&0O(l(P~CK1W{OX@@~raN{e|RwkG4Ewyf@LyO>VpW~pYMa3Aw z$J=AahD&>vE#!W}yM}k?OX7>Ymfx(8<=5ih{`1E-J(>l;~O%G!L4 zjQ?2re_79c*FN|-K*DK$lyp?6e(V=?VyNATL`PwGM^v6JApl6LT^^yLyhr1~`R;#Z z_J8%7P_ofXZUUT`r2qjvU_E*Rs?W>&TP{tLL`U@?(L0qNxq4hK7VeZVc+1obj{Wqf zV)r;1hg?*oT9hPQSs91p^i5mFbAwX zB8;UB%FV)DmSfu!{czA4QO0wiEaMU?D&lRWD9)%~h98_ndq>TL_<$w+eG&zBIoqe33ULH5O zLz%{hSx0QJFvA|~``%tQ-; zt!?%0mhRl*sNjuyQ@2m+g(9l;WLJ7b6VzyEX^oGM^ld;jW1=b>e!RO|uzCgAlum7POmYcI$G<_**QFx3FJ5?921kqcgfj3c2wP#H^V`pM@PAb z^{73R|8)!(O7fjLi;tH0f_4;MZ+K78_7TP-RxgtIsb4jJg>wFM=8pL#zyw;NeTcg9 z(oe}d&z8$@;?_+;Z>^fDOt$gr#lsWNy48YG!>=p)Tq3)7@6ancrVq1^zjH|}ovkUh z+&93P;LBTb)Y2|-)S+n)aI?*{y%O6)$`Pl<<(Iz)Bg)DmT9*_4=oZL+{oURN3U2f1 zNRoSA*UMM7&ESlx9)Sah=~dr_KQp?&>$}QFQc7za2?$n+Bc(r|W@@%&`~AN|m0T-rVR@8_qA139+g;>?pM-`F|YcZ_J>`Ll{GG3PEg(niO`rGdMn^mb`h zcK%&Z2|w;=e@c8e{<8Exg4zH1CFIg9Qw7CQcuns z+|565F%hPUyRc}jZLemaBvsQ_3l3Rxh>nc`D66tp*`gE@m3yzLiHV)15x5D3(VnYN zj3?LJnnh_L!xr2)CN4U@Bg7yyiD&nTVZr|Vu5u&;J_}V?Qcl1vvo~APg z{!}Zh%JR?EESCvr(p7!G`{A6S*(=~N8MHZ$b6uNW($cZXW{_t`-MrhW!D#RccvDG<~h+r{e5m>&$_QpVCbp9?sM zWtH;uCwaWXcgX4NBO=eNeI8g!gx{A6``i6MTKEJ9AL(4*7L?O*s0jt#zVRa%xBYMw z4>tt5GQYbu0^t!Cl!qRHqkPCqLqq+3uZ;3vn?Y(Nr~8m|n#BE#&Z(dR8iYM$(+V6Y z2mZ}+!QnJ;%=iB?=Ogh23Ge3ekV%tNly8Z-69!q*7h^gqvNmWeS|2hx*Vkip)=E1C z<78@*cL?J?r>d%cnT3ff?^^ngL}*1$*+vS3-AQs&o*xvt^Y#9dKK5i30iNE%1RY&+& zDa6_!I`$3UuhgoSosE!Z8M+g=keUtU7ioI{cd%G4R>Vbztk5kBJP+Jqs#(Az5Ro~@ zr|6=0zsntlW_SxYm={|bqqtbXqbGqgX(5*)KD`)LVUKJ@*I=X9%d>p3fkK)+=P-t7 z_fC3;pYZzk)S0s?fK)MWCji_NlTpOG4zXOGE7zt@pk{uUPDqb4QpgXlAmMXjDt|ESDN1!7_V_Ekh#}AbJU6ncF zV53$^&J_msmNR-~x+cI7Pj9gkK_$Yxy6!10RTtHd0jdrC8*DQU?G96v3PB8vDpq=)!C2xihmLH+k<2 z>6JsL8=t>^<+0v3V!t6!rl4z7u>$$7Gd42`5Akn`{s^foL40aL z)LRP&(}8cviABNIhn&LPE-CK;-PAT5QMkXa=zx!Oq}|^2zOm%^#vUpaq5DD{2mu(= z*5BB8w_`AZiR-5JC{-bgx*p?p?Drqz)fZ@P%OtroDb1eW=1%4@fM-H(Es}bgPY_QC zQ?0@1+14mLeNp+Bu6cgQxcJHTc7eUhM63A%hirz|1=zx4-_}+a=2q#D9@GLOqPW^_ zVQH&eh!!)R=-}cjJS~lAM9^a&OAP=om*U`{%{VyzSzc*C9NL(RUS6yQK zGnrU+oXTnST9heeEWK!}UGR5Ug8poPN$hvK614m<|(j=lvn1*la`J? zGP*P-m=(SpFG;rF+NMg@u8l{m{dT-(9^uCE!S7p5Qc-%zJ{s0p70W8B)Qs2C&X`}C zQ!e24^EMMTEDyRQTnro9CLI3ij*h9bOowY`Y7d$i>nJm~X+04&@<=}0QN$`rPoax; zbPZIDDu4xw1wf!g0>lz3D}rz9%a?(v{Wax3z0I&lcxe4mDQ1 zTqfM^Xvcf7`>3QUdG-9gU`>~7`fW^%nvQ$*{(iY)zd>U4);9}OSLpx=Y;pukO2#R^ zEY{=coSm(62KSU4P3Df$%AN#hSsfv%BEjNZ__s3ZSjIrJ9w3gSDNzj*2!RBDr;4@H z_1vj9w^nl0I6_j6f~Wrk9R@fZsMjn51b}7;vFs`zi*ojPmwqXF{0;cSSDM+OmklZD zMzgq!3l`;6-n|+hdf#N`L_!>;iiMFiT&zaN*4 zu=ttwTC4W~r#)rsR3mdma-nFcfjUE`NMPwvRJ@s|YO^fk;guAHaC3(#<&dzO58y%D zjPt<>+@|w9BC3rEHVmZ~njia4sx6hy78b)r94X<1D22>N&AkS96M!Uu;^@evSy~V+ zAHk=q%w+M*6!Hlzb&H>EO%vzSogte=h)@Bv@+>XGhP{~R@fPkkHh1qvR=^8+0o!I8 z<{xhr+9)RS<-E>C*4cA7c^ghoYoU6Bglh7&f2F*$v+`siRB!Q0uP+F0zQ8HuImS(X zxjb;C$$zbgrMHj&w6s3T$PB0qgM*ITj5KPdJ2V9hUdQmp{ymzen*a<^A~;!A)WvP( zE|-Z*5LbhK4``B4d1RsshvSa33Hq;d@~f2zXKx1FUrZSTsuE{{bP%YT>kn_Nf=6gH z^-$kxS;?TkN}UZydkCjiB)$bL(~+ql zOq|CeJgaL8fpx#_&=*FtCF8X;qraX~_?)cz|2(I1f-iy#f$w6D_ey`+(uVFAnRY^F z2d%@jhTenC71UtBolX>(4_#H)Kw2I@K$59YU2K0Q$=i3K698f%65ye~E}=7|4fOxx zj!c)eeBb89oiuu@zrRr9ev;^4rzds;wKF6j_k{#Lmchg6Jlq@KCE$jJ>ygOMwg?Mv zAbf$RnSI+n_aT>@y=&T9xc<8Ap9vUdo-wt>+Agn0;`hS${^XP_gKd zc0L9eW#`y6c#f~y0Rjkb&I7&C6IX~B*JXEhU;S-&Z&CU*a5apl*S>0%8Z&F;Yh?#f zIQQ_ElR(4q<0GJg)$B#5Oj&_R=_oU8hb;0*TT#OyxDrgkl4(J+QeftO5Kbe9Y zMXaT54RdPl9e9}y?iu~6+Y3>;XMr7c>R8@c$#cD*&r$B(F-7hE8YDW` ze~SGOI|*Y3*0YJsF}i{_eZAr*knA5lbH_wWt1Wzkzxo<_njW4Z_*R4Akr?#=GE|e> zww2Rct=e}}>xdVx817pS$mL9}ErLQ)VPzb5h6uPCa1{0#M1R>iun=qjC&z)lRg*dX zi+0x3si;1H`qIYb<2T||a_pGqq~ z8c^k>{c&25O5{Czi)Ce{0lffa+~rrDA6qXp=67seZj_FGJKGLbeEI7zZLn@1g7QBh zbd>7*h7i6BYZ*5CM&Oqj6IWQ@7MfxoS!Qjb()GGPZSroJt!rU1z;J-W|d`W;dMjW1wmOCHqfgigK~Dhc{0N7!FhFA z)DW%dybyd)3`6FZ6ZVnh{9=z9%SGIlMdH(ji6DzI@=w}oI`&dEWbPH$b zI=$c)phgm!e}m$(dUHV?>i8fw%;W;EU=wJs1Hr0C{AQ8T(XLu6VEkkGmxLETZ{0V7 zwWUMH=KrTNWQ70WQ(Q#5ajpKj$lhj;e3 z=T>xCYg4%<`bG%-kU_Sg6Fm|iy!;)ez0p<@uOLco!qBBG}s__<_SSSR=%By2u2M)xFPI-DMaSzyA1Vi(^Q{_*-wk3Vg6r!qC_BG+w~ zBIZZ&JO%4re4L_pkZxTG)1i*e%2!<+Oi{_n_U5;GF4nJDJJ*~s57K8X^5QtDcu*5V zO|4qr8ikvB*bF{ovy*|CS*+ZH2tFiw8y){d`d*o?dSH4H=2E<9w~;$fyYV#>hBo73 zdDyZ;G*`s*B$KF85F70~wO!#oaI)#zA0uJ%C@jkyBl-Os-s+i!OB=IpI#$?(mrL=p zC|UjE7?U*)iJFzg@e5jZq-B2oC;szBK0SG^Z}7taYi@5ROm}8wIp^;!eFe(wO)wMB z9Dch;rnTQ&?7xV@7jDf@FzbHO*5!?*%#Z7p1G93^TyK=i_qFg#nS6_WP!u*deVOeD zq97xf)<;E+e{Tcgk0|#eCg}*QGk>VN7&V6leyY_;IL@}cwcbxOs`DO#zOB*G@S5p0 zqn|0A+GUwAL{442h=gID+%@y<&65r{NShY)vCAcc%m|U^vCD$7X8ZjKv#pJ|R?ti? zBO<=lOgFDNpARaVMH#W<6VBsXOHLTx7onSe$+(?vif)VQ^I`4mC3Kr#Gyi#`Q@bS2 z*y86H_$py+<(ttN>PHWM&9th#C|_dW7(2`PWadl)x0y%XS0U9#q`O|d@?k@?=nds% z-UxSc5xRK}RBqXJp$I5iz;if}4Ly9>>!m|3;Ps`F4QCMG!wuDjY1d|KS+;|Zp>zDOb7g<5P}sqAN9%B; z<4wg9T_DXKj6X1na(02}a}h^7<@d>c^%kQKFf&}5AEgygho8q}S%-R+kilp=7;05p zsC7j%LoKY%m=S(Fi;SZf>_7U|x~G&>0MJKhYQkMNwSje#?JLW(-YfJxFAtOKYMSB{ z`yTK1_{;ArHEJ4MIHs!s_chKUu-Nig31ZUYNDu;^t%7*0RR?&Y*(LlPIe!UmEkKkLG zUN2q=vz%wCT0PI9gsk3j{D7%~U(I(&!w~td$<)BT0~9lw2x;E8c7wlGq2?cvrY;Ti zs0UXac98C)zSc;xa0lnG57f25EOaVcKCiw%MQ$mNl1WWTxw-NZwascSjKXR^1ayWH z%+3RCFQhXizn+N%J8=l57`i_cO1({NU}v_ViD;=kFhXII-#bl4Ft}c9kzrh2+7JWp zIh2{h18s?#nMudA>mxCYbX%(ti?ke~`~t%XafDF%#T5g=UpP^L;qcUA(wc6+?Fd00 z)u-Uusv;PMNyjF?K@pg}l~THI(}s6o!-M!%Q9tXdv4ly~kl^htgm;tvWIbm8$*~QG zF0u^kmvGV+ri0F3uf^bOr8ka*{ZScMv*XSXUi{r|>KphHr|^3u2Na1DaB70vI2gDY zUle5UE@h$Kt$#xqB2nDeWWwQ&WK=%pEL7MRu44V(cS(FnQJ3RzGc9IpmMCLEmBn4{ z?Osx^#+9>OVlJex;dCIS(^ob~Gd78k(iwTgq>0{3NKsj7o}vq_I%I@~6g6)v-Ha2( zudVIIV-!8-eP|=WsI|fVCq)en-FCgj9qK7S9GZVb{6T!kq?zn*`QOtTQZCQxAWb9$ zM#Fo8Mmw1+$^~m=Jb^)Lqiq3NeyxRx)bY!49 zsZws!fVhJ$1Fsy!b^h$h^Y!o7hMinw-z|=iU*wMZ-#xA62P=%jN69}hi826es4BOZ z|s+)z0w7?m!W7gu|5DVifV)F}G>Fn?5J6=|~sF@t}g*&9fy0$%-7_$C;qZ##b zp2g9gUqE}Nqpnu7*1-3Q$|X&7 z(3g+u$EQ0u7#Ib{>b^mr1Kg3bTtLXG%A_en|6v7N5zF3XY%ocU-SqMRBa?QRgXR-J zmQc%qUw}uHILQU!-g>SYMuy+}?{iR9Vv4@y;^vR0397r*`ybgEd5-oOr((p!1xCrQ zD9QzlUaQ>-A8!x0APiotx+KhbV|~}cCMG(TglWRRcR#BhB;ZyM+0kz0g=^)c)io6yWh=S<8-N| zP#p$X65%<3>b$N~W8us>g#o7?fZq4hCil~3-?H51hGSHKZJvX{Y_g-v#NM7uLG79d zgzWE`dsY5P>$o?-9r>*Hh}5n)FMqb3vBW146@^1tJbd^2)=t8O(BJ-Us5a6C#_0{> ztx&MS8cM`99)Yh;GGOg}%SBQS?QuCrr0K-{fb-D`8K9YzL#>xu5*Xs7Wx>KGW8N+y z$+J>u6L&TTMRkM;IP6Qy=5CIBqRIk3yF zkvc}}7#j<))=q-gIkkvNj(Udt;)Wuw2KVp+`8r$N@uid2k_VHK>mh_4+(q;!yz zt(c`C;$E(e=HwiBlN(~-{aM3UEG}j4lVcBI?2OC3p&c%)Kxa=D8Fnu;oeaz=mMYXx zvf9z zjGc@W<;S=13ouHo6k_CfQP8e&{H@^jgGS8AM^?i!$;+! zYYC=Z4Ylq4g(6O2#H6JJ6A4}i3x*8sGIFL}bvOEmg#DJ9K_);_@TqNVPP!Ao~Gfk`d(ZkiJozJJQR#h(46ntd!)i< z1<%!DcjOj_#LDa+cn|UQCWii_9G`$ye<(epG1&BC(urZjwL_|OOk)&k_egQt3+GJP zLu65hDTh0Pw?~?T4-mVbkfPZqqEIhUC$XQQVGLqmL|+C9aJU#Pb1G=iSw1osoA=)) z?nNG)K!){DIJ8`xRrYfA=cSNaE8Xc2l}HbDoY;L*htsRueOeEg*$CL4|#u z?A5aH!@@F(NSS_RyUOLT7&^QvE^}R3DE@ARExP{;z8lu(;gAK+DvYVpuatX&GY$Yz zv3i+V1MXz|v=RzbG$xC?89||_lM-AuwjgM62$BKP=`j?Ep`Yxg$dUZ=j9|cA53mq!2Bsol-k_7RL zP~5~>`ciInl?h07WGEngltHC8XEe z3u4l5(ew?JPUvMGB}rY;)EM(iOq^LVi5UZXtMA_WDecYZvhr4KMI(yqCVkLo1CEu& zvgUSd>D2Lf`uUD-olQHt+`B`7HoH zRh5rjz>K-ML*R$a*y*5Pasv>P^XH5i?P}f|dxqbPPBX~ePZIBANaZ%}%6u!4M#{^G zBn3}=49K9{qk%s@evJ1^?~UV89B^%4dY7Mk zksz!N7fqVm*M)oj9yl8}@79#CV&}89fI~HlHaNRXF)H3mSn;H9MTZ^{i=>aV1itLM z{&WO!Tcl50$d}4E>vpwGvli{c+niO0rSB3JnxfMeig!S`-5jjfXT6@5g78MTCiRSA zOEZeH=ouY-+rPj(os@2<7qG0kYc44Z0zOi&5ocr7wxT2;^?0F8r*J{U^=QgE!XG!3KBTcg4yN`d&Cr!l&C;?eF-!$05FN=6U`s zg}}mZIhn3<`tHl;0JV{3bJN+wP1y=?GWH3(m=su6%GjaS_68-)dusA?fVc^S2eR+> zyf#_@*4duFeb2{v5%0=GhbS+cArshbe*1ZLK@O6tY^)4?q_+g8>7NOYA+}w=%qx9Y z6SaSIME`q8|CiUik=oT_v(l0^v=*y@&n*CQ@D?KAuQlU>^D?K_-cG}`j|lMrD^$DY ztKI0#4;>+*7W1UePX>uXrl{19k6QR5Z=d1%M7ULyyU3rPlxG?GIgFC)$Qq*Cy=ONog?(IsB4jn0hhe3SqFvf_U zMM!tb^P$vQ*U7x25EjkQoThtO90bLPgf6`7{_a71qP3^RywP$!(DHu!yKkKhxm|-7 zedC2CpB}QFK0^!==WiKL@utQolh%ldGJe;~zR=~sUsvoSrW7Y*= zBg-qcUt9xpzkEJ0>)zP`c%nr3f25GdwQeB83P__H|D`jyU%ou}ceVMK+y{|ARjt(C zLZMpQ_taHpN@963=Qdm)kf}RU78P+OQ@20?s|p|-7dvr3LmKfH=thLH7{W5A7G}+E z{7nLcGEv)_K*Plhg^ zS$a-6-0dR{yus-4dfpmy#aSP+0lWyYY7t#mLic$Zk&88ksfA`Qew?jRgVZ~gxyatM zvp@gpKTlnkyz7Qr-So)dbrhMggEtNgtkd8&J=~m}#sn}!_g61m3 zg$8Dt9Q&d{7VW25T28^62Z80Hcv7v zY+jAR#J(#a{t0H)A3oR1fJ}U+t3%G(v^S>9!OzVez?b`?(^Uyth!<~@Q{Vz8L3Ba% z#TQyIu;2X;rRIRj5i-Eo`K2qQdY z6huzPy@`<7c&?f{0k7dm$8_kRd2x(?sP=bSnBjz*sNJ5ZLR6oqVdt5LsdI2PZfw)S zy~xG<*?}5AQm-tJ%Ce|H$`|iQS9And{_)%@Uu0G)Dzfi z`*5T-hsvg^@om8t%T)Wk@~S5BO&x*UN|}Qr@j|ew93C3oN9Wf$9XNSs9NZZA9URfK zI=>x>af@Bt{8|+rgwuWq0xNUa`)j!+RhFOpmLo^u+H6x%%Mx!fBr@jf0)y7awCY3w zTywGX&Jp}4$|`8@P(mPOxqX)p120t#0YEEBepw>_??-H!IEr>Ykl%GqtwvcLU&`F# zU{vk)Ju9QK`DuF`<5m_l@EgpH-;8I75wO9v2Riet3D+W@kb10HS0$iXW|j1sD!-Ak z(kno(-roGQl#5-XlCDn>P~yz5APlT*bt23{3tT$drd7|!#`f*BKQhbos@os6jN0Tf z1r|QLq_Hsm_Ia#jSEC~cH{n!sh9rNFW=~xF9}TPhmW*1c*tDt2wz|3s&N2rDPG&gx z9y^~ZDoXozJlUOgHtcVB7VA3~#(&ahk@GJwP$tpUc=?elUb&{{NN-fOdDT^>98vn795tKG{ngVE}1->Kc8tYLl-kNHSa^xT0N0g`kJgz2}jIy zDI9}3^WHQtR^$hE+8m1z@Fzuo&iA0rzP0$Xr;a{=%42ghJQPfhk6KPUxO&dB&E(IY z+e$lIpcL@k#3YAT-auruq?x?ff`?9y(OrTfJu1*XJQT zndZDHc^><*1v@S`gJe?KE;gi`JNjDO%Gg4QpOTn+g79BQ84r9LPb^v}(raFecD9Ox z4uNsZ4Kzg7E?JEQ?l9_x%{A!NNFtMOR0hn{%WP#h@KfFduu3fA=$lU)wo5RmtPnkH z@$L>S^`ZzNdeJKl?66bjRs$(480;MX&^tbo3Glk}*4inJES-*-G&?J1mBc0n50 zB_rZaT@;|Iu5YL~2$rMW*jj#|daSZEH~bDKen7S5QXYIREP%=JPsGP#=FN7|QaIJ) zj%+pEs(Q^an&yTO2aydrC*mqjpfj5aB;aI2TQ+sqAQ5?RT^`{C0_Y3qp}5I~20+Fo zq)M&P0&JHV_6G)+Q#t$@oxVQ{meNdBFOaK+j%WgY1worYga(~`PG3qMP6Aq;9#njh z^J4eB4?}zB{wHO#ZCR$4Q**s^$XHwgcDGti)gyDU2HaRZs6+>kls*G`VEvy>rJjOR zS^gQ#-8x_1aw1`D{He#Ylq>)5;MJl8b-+iGb~p7^gEGBAzOl+CD8-am%uA7(;fr6g zBl5$+?ZtDe-Kv4Jof9d>Gf8yvqjp`tS&;leL?}9~q~rv(jt1ETTxcYS;@&)dOvi1I zs?cV2R!y((G_4xob(WN{lsZ$tUp-g7+tErceSDxPB!tl$&yDGee(|@+T#k}Cx$AgC zDg$J6-HR2CSf3-_V#2=X@qyCGcfj8B?Yfm-^2w~g^ZMb3Tmr96yT zqVMQP4~@{HKW;S7JC5ARFjW^{`*U=;%fyw_QGhRVAOj?$i+{S3L0_;9C|poj{EJoC z(4N~q2HMV547`NLoDZ-Q@8Z8r*KV0x$sd)xO)Mz4lknJgeeGyCJNCqFb#uQkZ(ZB{ zPDRdFcLc4>PQc47Ihv>KZHTAZw^?Iiic1_quxxWg7}%Sj{psf7PM&UR`wD(A?Ih23 zIGVHS7r}VqvQW@g%D(&n`DegYv|iCxC`j9|TTYXm2F z24BPj*mnffA%O#75wl?xPSG!muooO3BhvRR;2q~KUs88~c?OA^(}M9){>5V&=ma_y z!43uN=TYA<mlX~n)Ev+$-BgZ~Zi)?IQ*cHtIIc4&}P3`RxVyfi&xUlcaMf-Q_{757V`~V2S9rOfK$Ac7u zgyDnXDYb0I-U3^#T0E5=#c=q3L10Fae#=CyG zR1j)7u&ZAfK(^N`Zr&$`RozNF)XNC$gP^OrdofuJdIGaho`6EClo^EnoSJ;jr%qdt zeBb8w+b^4OPyYs4z90`)0crJVAcr>OeyPP@qYmX;e*^wbtxXn`$^>%FBnO79N!nj; zysXK1oAOS6Q~h*fJW%&N{%0xl%hxXl%(bR2y z>&A`WD$+{}zMw1AZgb&iv^l!a;l81XYzZRh>|Td?wo=ubT@2EC z4b*fUA8)5CDN*5C=S~L(?$;xLH^cb{4}yd~Lz~ zQyRFqX8-t`wlI+~qhT|)6SyC)f8)d*TJ#8LIR9hTK$095LACvVB_d<=oF7E+Ic$&a zK@Df~WCDKMUxNb^s5d>-6#8oJXmuFbR^E|;eyuLAto@Ca6THCVTUK_Q0457Hs})K) zpK08Tx(hX4+3}PN?QiEGT=20{?-6KFRTvG`BdYJGpkS~0%+up!CTq+p8|3;-pj4q^0Q20nKB~<>6wtcyY#zF5>> z))}wLatFXX=HaBlJ#cpc74yG}M`b$?f`j@3cyv?mWG>plpzkLX0s0w8pPzV6mmw{l zx#$U-Z37H4dV9Y(sD!3fK7OckAujc4kR{D(xvMN4-ajz$Ms!@?Ym2Vu@{gdA0HQCyiM;-}7` zS>?L%Yg2cfYP^hc0Tn5S?)N3X;VEE)=&pSAz3`T%(?KThI8 zXb-HdUuG7?_bUk>E%;rJA!Kn{shzYif-`iWxfZHWE2PpD^_~LVCFk%~bLGsMyJPG` z4Yz)1W#R*SZN;h2qGeO^S?)Y_f=_e>SMS7C$rO&=Id-YuSd;kCx9O#^3w+YqSDrlK zAFQ-AaWT9KP;LNK!6W_&17kSUtl4-O(?K;=kai*oEap5B+@-*u3*7q>=Rjqbnb)$) zg!Hk$*!*12KiB5r>}vqC{1enbv8_N@`|N_VB5?ONsyoSm3r1^*0>VA;_=?MVpj>fB zI@kX-5BA&yPdAyRE3}I|PU?ZWD9Ck|?|HXS@ouH5E9GcU==O#kE^xp%BISrJzR#Yi z9hA45{x{4%g?2PuupBuIzB52U)%;p!F+qpiUEgC~*KPhQD=1sJz8|1)79{bMWp!?S zP0h%BnW~0{diRWnNUxJ-cuUEPMVoDN_P^qo8G{z5H%0GiyD=rfRf8Q}TBamK&LK|C zB8nD^q+4u=YX>ZVd{?RpG4l?uB}QSR>ChBmW37vP>u(F40IiHDttgIiACd1&XPQJC zSWL7Z@*)@m7N?)I-^lL|1rF*g|K`Hx8l{lQ1amS^>W4VtkI8*-%lqkIBi*W-Ny zeF$!cc}a&U;`SNu77eX~jcJ3s9q8*>Ikw$CAD$w}LCTTY$&}lJUn{i)=autlngc~9 z2217@2TOJpJywx#V^To}ZA$_@4Sh6ky(*YiVP#@d-QVhUKqD$dgcmOm9~D=?%EDA%>Jc z{h$_lI2X)wl_X|$7ZY$Q0&W%owQ#6PfNqu$gCW9T_pjZPfBGYEgD9SOdtq+Dg$wPb;An|t=JE6wtmT|Y4cfso4t zEXm3_>HDS=`X?jjvzdS0?lZ(8r*-=oklA}nW%=3cYX_9K#H=ZPs>vPP%~VY9DZuQ` z0<*hU7V1nQdZM{Y)#ctnELQ>bGT9gC6<*NVuvr-2b(iKHc!lt{BoAeKV=F#1T zt!$1#L_Q-p8Ku2#`zd1Md*SJ;sG4d^lu^aY$eF)AGOnMy5%g>2NL;fgI4rBXJ3-O3 zzp8;F0nZqjLE!5QJ}lXUWN^oW`?Ny#LKU}fKY^9h`UTh6S^J&_)=1PK{)T^U?*C%z ztD~a&-mgVbQcx+8QWTI*=@0}_V(1<~S^F(}k=x*te&Y=Z?_Y8i% zzrS7=%cab{ch0@{obx<;Ke1hKTOOZ1?zRB>lcrEGwLL*4YP;!_bma-bBLs4s#ulh; zHNx)8$@}qwHv8EEoDwE%ptYt7QGgcOBQ~LvEjNXXi{IkNyQJJ&H z=|?fW7e{ezx@TiT65A2uL4NK?tM;{Ot(^evatZ;lpfn77Pz&m>JgVJhxQ&3W^Yof$ z6tfbevmMwG4@L3Jx6iC1>YVPh=Zh?oXqfbUE)g8-!nhwZKwWhxV1ETzxvKk6PMd2Y zME61Ejf}07MevQ^jR>_fqBqjq1S_IK^37e2{?U6fc0Pij0IM7bcqcIZHg>8;#M#Mh z*LdGAM1Aa)Fc!iwG0v>Tt%WTcvl$#PkEjbIr)R(RFwyM$eZ3V|+`ohN_d0Lc><4dL z_ao7e@?ihsBNL$M?NFOlMHa_jk0tBXV#-rl8HjCf<|@?H#j0$e5uC4fFBqO1H9t1r4eY~bM9r*`23CZ zct;5?vyEGj;~T&!%0LCZxn-MQq9rkcDA8W-j@Vyxpcw#(*q$)}6K9ECrFL6T1DOjM zXpOfo#?g)fS@0be)@0S7cLU+I%)Ad$j-yc9Yxd?GSS!yR9Uq^bR+xBuGYNjIzt~!( zoA9Z>fDjT|%U(7*dD?^alc=BnV?X6I8Wnb?O)9giA4F)3f)=KjB32ew)&V|e{^g$7 zU>)8JAQ(ckzG0=Trtg>Cg&!Ujk(^peN@Q~FBS3;QluZM>xVLT*|19tZ-Kab##)sjc zou<*scHQc95y595IMCSm@D?$labW@74V+uoFN$%EgzE)^vx&b^em-Ho@xnaFH4e>v zVEz|2g0_*_{g^0lITD^v2o50IMsJXqsEgSX^nRLn|?}PN1H4 zua}ym80(J2NR-M@z+vUKo7YSU${{1Aa^i&tHIIRs9(;XDSAAUFr2XI>5Utgu7Hyzp z@3rT4J|et!hr(J>@?EyzirbI4auY3zDG{eP8^35K{+d%&A33Eo6cC@E9jDlM7Zfm_ zgJ$hWp}y$1#2=ys84*jRI%1yJQ4aB>6gZ(YA=!!C?OFQnD#n5Eqm8zJ6x1YQ#+y+X za`+r33|c(BKA*xULElBLxov$3Fj>@r#ElL!aY2x;VX$lFhiV5fx5St9!Eg-YEtViS z(=c-U{nO_~2k#6)DEXh-O4~s99Rkq|-Qgih5;`{J>7{6wNVSrKp{xW|=!Zr@+NlfF z;t1s6;x5H;8RuTs1L6&df8@84bbN5wqOu^%_9*co$q(cp+Bzd|ea(+5gEVmXZhPD4 z={{gR&EoTsAELG4H92eJhj>B5Fy;7QPL2<%68z$Qu=WRbm?uDJF~S4*H&CE)jKqnm-K zI|bR>0r3Q+AeousVv~5lmrJwfw#&>Bsu$pgv)oDH>l=Xy9;b2 z-I0*ZosG5&1T7&U(Nos$J)EbTyC@f)D-*ZJWLb1&E|=)<(d1*uWdK0~SX#rwggisv zg2LqYqv6PTEN>i~{}I#Wpjcc^#z7KeZZQQiRK6h*xkm8=YhGqu0Z``pyDOalrc_Bk zGX@sN=r*YW^M`8`Qa46Go${^Z-YcK&JqIb-3~xCAhX&Buk?Fu*o7!!q41&Dwy&FF& zUB+;j-P~efw}J`RH!_m)ldyO#6p+QJkXD#1UGQ@IWIa~yPs!XOBHOhaI&KOyyXzD6 z1f2DMZy`Jvo^7s8!DqK=4~`sI=k6puW@KE0ool9LP^iR9mI}ya98pkMC``s93?9Oc zcLQz&8=B%4&`}Y;0;lsDLu;or6iRmI{m$|Cpy~Jni|c4Oq3)?^AXv#{6iQ>4?IN^e z5;xVdO7=6xF7LMzvdbO!-iLq1`Fo&PE{n|iNDC)hTueHD;rwG(;=o0-h8~Qh0_4t7 zDRK5mZ7adhrpHmWNKama%n3QK_Has0xoLqLj0=aJwJ0##W^qu9jK_1=gTqA0tyVAPkEhE3oG%Y>$+DBL|2r(tj$Ffe3V0TPo#=dGc^3wR$a&0e3~mF#8jKU?g9$+2 zk0)&+H2&F)lpEvf8+->f&F%TruK&Xh5znVtUd*Ddas|Aes4-%q74;maa%PiYF;v+D zBBAT2 zoZw$N=@yu8aIEg6kGN(6;v8-K7Hu)L^|5x3Dh&{+0K_=e2j9 zoP~x;(Zej>Vuv+u$MVRFSo>fKgW0bV;un0Fp5=A!PA0Z*xOPtnLSp`AQK=D~u4PM^ z2pa%9P(W|OIF-dM>&2z@@L$TxvpzPj0h7(mkB`*m6_65|z*clero{M7H!KRSda3>| zv8BW4I7E=B8nF_$=As~!EuKz|i6J5-x2guBw=H0sqq1Y?p;(lN8@yi#=?v2^?sV;W z!~vsKWG&=PJtlz?Ts^lg;vV$}SvD4EZi1@IR@lJ#o9ofswzTaBUW^}OQflW0g?^ta z*T?i}QOhC>yGhzW84=HGgpL6GsvT0q3{Wp}=J#7r7yU!h&1=ys*;2aZvQwkf{EmtJ zCIRIDJ!2beYB3(k!!9gw`uo=3?MsBT^Rc+Y)-+aMw0p`e3bK31&V*PW47(Jm=8k#Q z!VootG-TZVKgWsr_sH}x@X$dJq+C2A{=vupoFt#&Lkt?ku#TAOw5v1waGkE1I)L;b z&(!aIJcjx46d5gGqs}Kwt?Gh;pl3aqOO9x zfaamr$+&xjcB=N0wKsDl16@_&s1UJxI})B`=DqRTRE>7jIM+OGXr9hT^!*7JE=+46 zdN4m#XTj-p)}dRw8#P|&ehfJ{K2)0U{Gb3?;SGKaJriN)29geLz>5pS3|Golm`JTJ zXZUbB+z)OO7;Enpe+o(!?XzVu5wR-&!-lKCQ4oq-P(S1faPS7_Dd}XKY5a@BA6Id4 zT)(;;98e!vk`h=6_NeoSr43orD32A_H}8 zk2J6c?Zhg?oeFYtKs(MEzTc``;wE5b$Nc*G%%YCUBEc2k(lXn#ziTKlE{(`#O;iP+ zCG1p}oz8@CbW}rdd(|&9Cr1()%mIX52?;wYwAq?nr8sC;UCS4R5cDNQ)xxJ`Q zQi%JvP+u<&57l#q{hB+{Xx9Krlw+t9w;`Zgt#)$0ld4WD&N z<1p&YFCctA-&?kLrvAJlF|`A&v!r;;*9q1V<46nsQ;_N zgp~3j$sSo+X+obrGb^O`fBd)O2Fc3ELrftmsJMi8thv4a$Cq1+6{$IM12$_ud1hDP z8taxaU`B*NSWF*gc_$t0(a5DDTtK*c-v`_mI=y#HF`nh$e)M?4C%SmWB+aY25`-6# zn0`R(BeNJw5X>5UJDx)TgeIpigV<-7GY}szz?~n##epa~{K9iUFEgp=N@$>>5+DR* zMa%xW#P2r^tI%7RVJ%wVe7;p2X!cxQYvP&~V;IaZ#GL13&QRi0nNq{Y1ki!4asFrA zxaB9Zu?x)2kRnN*o(5c3;~>fyzT1;(%`q`-rs0rG@af87sro4GZvyV~NkU%WO9x>^ zp=VLv7x(S)Avd{~S}~wsMm_1DkMldZ?qBcS@>uEQTO|LY>MRcj@t!ROIE$Ec10n~y zByPgGLCpRquDr{UnPc1eoKtq@9KAmE0L)R}<9aKy+4EpB9p2IdpIl>_fuS^F+cn+_ z!IhH+i2~%#MJ2gNg>!O4gVG4y`BTwRCeN1ErO?WagOoitH>}nyPv!V2MJN=;_$vdM zT=fm~NW0O;i|>B^NEiZviFt0qie7L+Zic|!A?IpdX)}3Il`bxqeNI%sE$D}E{&1N% zXW&5mK9v}R345Ji+@lc4YWNf~9G-@8PwdR(!a4PU=PR0iwl%T%dOO6JS0P~7d~q>* z_~_u^L~xX%Eo&CFXui_lP5}H8@5RO6gXgRbFkz0smMsa|7i$fqE8A!@8-$NV_(ckZ z|6*5ewXlXkKC@qId^RRl z=kor&*n_xO^a3#=SWS}y&m)rjBU>WjP)Ia<&SN1N#A`G6wIQ>r=TrSDzwDz-d&n6ZL_bxVyD;wI{{NVfd`u!FbpSJgzL(1|p zl!AdQS{bSm%z%r*rBJ~%i$A0xFD^W{iYqVL+x3+$j@=7G9&udmtYE_ut+trD;i8CA z?^Sf_mj8?JMzcwj3CdDD!ZER(u9wI<_E5%Tk=peu$Uk_jx2Q57sD!ahLa60W3n51 zMT~_kp|nG55y8g30aZ7`yL4X?c;V9BsXwJQHJYm*Hdz3f6%~(D=@{wu}eW(r^|1se~|^9={^t!EPkL>)jxq>dF@-q z_{hl5qNVXo7iKk%IZ>R&OJS+rd;nOy!sau^u;9A`2kG?L~HUo z_f-SW6%F<0YUB{_x3P9!@gQNP^D0kM)AgRCHs+iw7Igsgoc&5V@=7we0Dp|h8fs0x zMS(>9<^zcD`wciOo(bfNwlQSi1*V+X>f;+Z*p13)sy9+X^LsetOE~e7pu1~4%Z-l; zUyf?JMK_$IhXb_K)r}!0Bz;0>Gd`bnPkBaD=_J$;&)V;|0GY#J`#vv$Wj_9-52(N6uNz(ro)~SOI0{Q9{`!*~amfz;uTq&w9kZ$c`+J^B(d}Nzr z-|q)2i+nY(&LY^K=5JP;A@=N$@%_rmTs47hm@cTlFg65N+~$`$E{l?Ixx1yMpJ}8r z-ER&)ae@7*Z~r!YMqOc)2@Cl?2ue8qH*1%8OyH(n*OV6p-^L2iS=6nl$9qi$=-d$G z3w=h0Q~K%mOpl)h59OaPaMX9%#OBZ5E`$lcX4^A8$h9n!N%BDl$j=pomUZ+E!C%158_=PEuK?@zB$GD=VUCe=j|Cwx6X);T&n51FQcv*@SOe|E6&C(Y1 zb$HB_D{Tvb#08-KKVcoIw;y4UKom^%^?A?oM)Hvr2349Y0G57prbG|>6Hn$EbL$G9 z04h8}9yS(}accf(QZnz&nq%@k{DidL@5}AL{xTLLfLf0(Q_KLPc<2s+NvB#-G5eOGUKYxIUD!2);mLZH=F(@!yVT0owH!SZTctBIu76B0*Bu;U?Do z_6Uy*pO9p~k;PjvVrJ?UWO^;knzB;$Caqk@m-7N zuW4g{lYTF*Sl1h97qbncK7Ed9!Xh>;O5i#=eJxHogc7Wj*iewQ?ixIN5729rpc8TC zM;+3M_>}dWRl({@Ki>Blp_D_4LfQ2|V|Vj=w&@}%>;^h~A z=JjQQ<)5Wb6t*%$V@$ikURjn&Us=-qrz}@A-OzFt!v|Ld(2w3Xi$S*Jq(SIRqOm99 zT~2y@@J3k#rk&u3kPV0TxCF&5>15_JQ_N(4E%cNfZ}?_zC{TGqOownP=#cxnNW}*l zwa(Vueq?`Sm2I!AdymMn->)6BsA64&K;OCUhqAA#zx~3nuS1m%%UpjiHxrycJ~2x; zmQZqxE+la>=U14}C+BZzE-u8zx~q(LOS#`=g>rl3ML%ym0{3Mr?;K^{=AYOBURFk5 z5$p&yqu0d*Y}S1uH6pwsMKy@ykQLW#ME3Uj_WElv`Ew^LuXERWC9x{0@nMadQ?f9& z9Tzs=H`}!kj=B>awp9f2SZZXEscKHG-!GuNevRCre`N@s*fw32AlN+UA8co!-pSh( z*Ev)v3Y*RP!PJv;yG~T;6NN_cidlrHANZ7HSq59_qs5Pjef3VY^#m4IMwbjZgdAtK z=~lv!0;v^U8wpD09l1)bC#lw|Sp;=A95??iryTbnn;e=DZCMlCA0QE1tH#iey|cO_ z37g!5L_o_ZH0+Wnmb6J%0``;Tj_P!bOAcM9$iXE?D}(w2D#SGQ6n4SDI&+B8RWEDR z0(%cf={Lg{AE1-v#thh?uvpS0*I%tn;^=_Hr*kuP9~DF1KTQtbYiB_T?JuK)c*oGO zTB3AGOs1PReE!61n=u}m;PzUKJAPN)o1r_86xpu!KX*SS-zm4Oi-J)?*os=seFMJA zu7#sw7J9dH1gThmr@TEjKbnJ8k=GVg#%mh~FldhS5T#R(e-S{IELuwuR864sxeoDb zt8OrGD18*T8PHAUZn7j;bkF<&A4fm7O)fUU$Th-3vS)!7p9ILGNaQ!)8JpV&bjyAQ z|NAC%U96j-R7r5bmjv-jv*v+Vi$RtE@7_`sO!IMG$*;=aLKcr4W~DMcw)z9wN^Gg{ zA7OqqC|vXHOZ&@)5T<6eM@$!)Xcg!1Z&98*>YZUbG7+2Zhw`&0qK*c*Dr8!l;7v)@ zUYKcPlXNy2#=5f6d-;$r>+U7X<=<3_h(Bo^57I*VpNMjUx6Zo1UU?_cy>RiP$S>h#+*MSs5 zxuD(9gJWm(0orvDyiKSGBU1p01oy1Rkax4-qo^J2+?M?n~gJE}E$^4jX0H zHmeQAOs0D&9ra17`4e&HZm^@{Gb0Ys;0Y)dt%fyalvS%$80^nebi15g=62d+iq2GD z3b-bM)<6uLCU4!Go0H?O7-B<+;~uq!D&C6IH7{{HWVtx(EqJLN@{o<6n>WE+$pG(B zE%GmANsHyXz#2bMB%H`oKjk&<+}NH92!Na}UO7dcou*`@us?@q|wwb1OYO!#`nQ!JEK@ zidq@FdR*9$WvkyJ-uNIWD<%UUw2`?bg-DR}lDX!%VIk;k*f^LXwHYF7O<2(ZN`F&N zx3_PKqO})V$D}6~O+rwkoZeVgO1f)`);_UMvm-hm{Zfd5j^CaxGV7v2>}KEO4bxq< zlV`5FY`P6SL(LWb$zp05%;@cLq2g4E7oade*}2+`-RIQW`PQ~XX_{XBeu4!!GgSctC2Ck=>;tpQ>m2#1SZ>; z@aw=DpHMMP+DbCcziGq8LC0XgrVFcENwVa6 z!~L*7?|%2jctwM89e(W&Q1Vy|xo2~9+@>@C5MCTe(N?z5>-$=WV_Q+AZRz!)`K3PQ z4h{pajwCVs>m^UyhkSN9l-`*Lumlw$8`0IThjnTOpadef_;Crj9r?Z4}(CWF`vr z0G&>^xYx61?oAtIH5cWIjGQA>iChgptPV!5y6jA-A|-T^1d!ctw>P(!i{<-FE^3Kd z`R4K%@@n#}`%HOCOG^hPCtqu6QS7huTU`A8`U6q>G37*OWA9wmdfb4;^)AJv|8gi4T+e3QXBJeOvQBh1{acS4yMam9|}E z-It=DVW}kds1%K`Q*Y7KgM~efE-=@I+jGu8cpxZeskIi1R}Nhrt&c?4UC83B2Gt&& z8Q|K^uxOv0Eg6fl&$1Z49-GZkQUFVQy+T`5a+XSfTL{hD_Uo)o5PBx=iqr&KJ%85N z=x9qil6F}3x%}5fd=GnhRx2g(@7}H`)*H^2ipbPRZsxQoZ%3c}XG~;Z`8(s5-~JBp6KL%+mYYhJ4)dPl3(f(8CS79==!qcStJ> zcS%{BS^qDJ5tQw17q#!N#>kgVoq4~LKWpwnD}YOa4M4-n{BH#6!J#?Mx57X@U%x_4 zf|9+gNFqn1=6CCRi6^a0UeoneRem?ljvpOxTHn2Qz+Rj0Kqe2zTRW)^UuSw{ztX?* zr{9xNY-Znb@vg6VGjm)o4-lgx=YYNfbHUNkF?D$Dc}x#>^!p=`3STd4BYk}uc6RpC z^72JNBCsN6eN|70^0SIgUlYVCTe zQJ%Z?Ml$Y(;jC8vhKQb+SSxC@_d<-NzV5QZu|AV>+e1@&5XsnB4xG%G&273BzL<9w=j)lD27m< zOhCAPw&ApTs-c=Em5ON1*MVik?A7r}=7>xyIwKzPD&v+TeXvrR!?5_v3c;VVo*!ROuRE{9F1zGqU8O+e=z0 zNPvC8KzJ@wdL2P)Bc~F~y8myQen_imczZSZY5ik1yZ@WMN>scp3>AtF)ZFbS z^?%OQVeK_Nm6XaW|7=3VC@WG(OlD_-hnz_1KpOmnqyVnVcDK>zxrbgz_ZE%4%a~9` zk;fXhPXN0ziGteuU=-NPnu?IL-MKm?*TZy=q$9nH~LF4O_(8{20FF(tuh&GE+ z@gaf$8!yX+qx{?D>>z!2;*fHK%F?y(%Owu9E7MRp|bMx4uEJK)0Wgj*|UzOGB z+!Grl5gSCNQIW*@66JiN`I%Ma_bexBho@?o$gF(hwEvXl|6UU>m3FMh}Pc!T|k>=C=rukzcykE0^j8^7; zO2F4ia8zPZV~BIOqfvaM)@*)B6D3oGlKIA+EIj6Asjc2=e2Yt?7{KSmt@AzU;%F?k zYe~liu!*9Uj4&D3^!pnwX%pf^3M_DZomPt(nArsLn=r^bC*>R2_+wssI_jNWO2ptZ zFd#Wi+UJma-IR^Ra{Oxwcp@6bYLqz%!>zm#g_)sciEr~e;8Nrfg*pY1(Z<#^-h|-F z!0&%!tb@TI$GFq~Ajn$`1YzR;@Lap$8do*zsMidfZVU@4R{)-Bnbr92k@u;d?=F+4 z@10qS)=qx=3{{p0*WxW*r+`g&nT%VN;wyC3x`KA80*#C(qJ75!q6capoG zr2XDEJi|JkyL@=#+_R~&dM=r5FtM*%+$fi9xc?my0Em}_!+u1C+F!i5m-Bvlo=`xI zB;Hq-?{cuZ5>XqCn zRIDSTXt6H2GEU$g1Q^t~jiA%wKm6%9zjWA`!Vl(LItcYkrkLm%J4eMBmAw?2Ile&C zPh+9Rd(qvi%axiCErYf|;R~4!NxBO!s@>CIcBP8;6!h%zin5E)jH#(Z%hEw1G4i;! z{1e&`Lag)D&F9M3FJ*9J7F$12gB*Kip}G&&yI#L@cpNqSS={bYe6reUmZtk9M@CM_ zdbHo2Y&+0R9snkYOY{9Z%__WWQmZkJZIG`74xdD=Gd__icif0F3)HZC zX5wR5k2laDt!eQ(kef}adbzk7ckNNR<5^VK7uLZD3S8OqZNj3eOpf@UAJEck zmWfLnUs%UrpWLu>vUP-o^;7&^=pF6<77JyYu-Kwd~+$H7A>>XE*^j{cW}JLBOTQq`Ht6pv;WnTPS# zV!PLU5AHCzQP1G5Sz56cy|HHQ4TVGnKAtOz0G@_8nq=W0v{RxP2_3taxZ>Ei za+3lfZzaE9I-O^hTU8YU@)oex@A@o5@;a+c(u^AL4 zsrCLFh>WbDJ-iRMYK%ikJ=uWWS^k829ZiC9JL?&1C+DJ2Qi+zJ7{_SmIz+O$3!r}{ zHzSv1t#n|%2Wq?<@W1P3H49YqEti7QZQls_+Shqmm3pkAu46MZz0+0pb)5;FeG**? z^}tL4O`Jnl65TNUblX!^Ij5b;{;~HWl+@JMQ)#I#k~&se$Ma0nxzQ)XgF^?Bfxv$c};==U?O;%r@XF;B9wh1I<@b$W>SuW7~!PnS@ zrG9!Ox#8Ty3b^3;q~4Dv&s_0D?p4p2>=W)`IK^LQ5rQ6kt}1}|+QkP+g9i80Y{=mH2`uSrAAlr6tpXPARZ_&C_IXDVF0`XAees3U|(IJ zRqu+a%t1+cIN`hOiE02cAXpv-2%XFyn5S3p#mob7PbmVLq?Ne1@9U<*Fb-HuyT!Yo ze$(h-rX2C`>@o6_@I=5Cp)o4a=4>==MVaVSF0^_Hu9gE%eZ?{Alb&Bno$Dy>{SnGaX%%@?3JejEmS@pg$xzhHxucN&1n4 z+X6W^<0o&%*4%A8jc!~w7T98OkcAg_ps#G%NNZfD!B)BNGg_;`xC#Qy!ci1M?G1Mj zBnfQtK;g3^k2%Ie1&|Gu9(*ptM3{Z3U^)&ZiGj)^yc|kD1({kIjOW4oCoj({X&2^x0}5^K^@K! z>yM9IRvLZZzLfw$bIOc7u}554&&WvhuEi*P+1~yDcH#`SeoF;hNpJ540ZM@wa)_Z^ z=NF_viTkm^%a<=lCPIg(9!C^Oq~lLuE2kTzt+S`_Wrf{dZ!?bDQ}B(L`Vu%Py_~1u zxs}iT?hx3{0)NJBUSHZK@Q&T*NwcD8p7l`!Oo!2!}x2jEnLgWs94yq;5qQ=KfGr)*)XPma--nPIzsq!{A=R(L;4QU*cFEotj^;v5}Kl;+G`a{q{m?TNr>9R-g?Fuh?em%(}K zd37d46k^9ZwFg5hF3$9dhpl4)Oo&(faR~<^N!icF9VuyOmXiEwjjgTO*pvceYRazd z{SlQoJ5-$BZSWo;i9zuOc>gRRGCajKmkK;+AYw^&(KOy-=C9#Up)R&nE`%-W6qPDy z2RWFOS;%~+XL}jb{Cz8XG#T&FUnxjAAUaK=J30PgNd*4Bx7-`MBYDo-n#MBt+n2&x zafh(%;L!jL%cS~j3_V94Wf2;)9tl_`3_c|>PZwGI$Hugp|A?W*%oxBA1153Nj@=Ez z{I{Bajai_H3b_S{P%8T;AODPA-FvH2Db9|HT|N=KJ4@k<5KW1rrJ5B0pVQL{{Be0} zaC<4-;z_pN-rixJKLCS6kk&(!LC$FPb)`|e3Ez5$>{H3Qr^Rmq1ScjnUsId0$V%>V zG&QQOHSD@Ihc{4DiwubP&yU@i)%?3V@AM!rgJLu)n@;~p^q#`? zoCdUxc%HV3NBIk@h|#Yh{g%=SglY_|hLL7|x#uU^TTi-5yr-Xbx@C~W<)PXtV_0;~ z-kD{ap1%{FowGCN_;q$JxCwcP0e|K^n2WU=%b+KT@-&WQ9Yr&SHAbyb!QrS=X@C4=q1FgH4P=!REgVfdkAS2qw5QGO`gr zWW}AFZISNs!bZEqt?D?Ky>UP6T`;Q9dXi`A*Ds^Mz1;Sm&Q72&?y?xbWUDVgZPwf? z{>V;03WwG!$j0D|*U5TDx0H?*t$L1i9<=R}e)iHZ{C2KB8}o1ktt(&cFaw^ z0ZzX;2$|0Ja#qBL@R$jbkq(1pwCpR797cbhh_Knj#pS#YhtZP-Q$NaPP7JbF)No5^ zG>m2V?~BYlWu2I#K(~vI`8=zpJ7kB}2U3;X>J6XS4!1q`C?PBJlR>8CTCxe=mv)JN zBA!m+c7`EO)i>kI`nXo;hX$zoKn^mka2?;rbID(%)G=CYi7E zC?}NHniEof%X0vEY|qA8`bqD0?flP4*%$Ad&(!XFLN#S9jp@lRKLj??$S<4tOtQ*i z$34kq$R*>r(0|zWBjmkib(2UpJ`Yg=Ww$#1!U2m;SM+lM=uPs#6^-xso@w%e^$C!0 zKNQ*i!hvqgxw;wDtnx0glYhT5acunb4Y7NfFf7Zh zLTI4P9a+{ml|11~R%n@&ftRx*i`JnrWQ;pU**wc_x98UUBVEKS%dEM@9itGDI|chR zvB|kuOeA;mt`9qe?t9SGHOs)3rJQiZrSy+kKej@3&B)AyabQ&^XjA&hyC0uF1fCye z;`%cE7?jAqd!4#&ScQ$nRFWkj{hj7#$a_on2szg<-7;$_L(t`&Csj48P?TYeF9(Y$ zLh6+U`6HTV1(VE` zPRL4(!wjpHz2F*`oCCzq>I4@wpMFTf8}CSaMPwFb`yh$Ix>;97ckFdh?>RlzS;Gmkw|yv^7~LfRVJV`f2Panz;wU-EKa^+onxN+}^!Tqi3$!cXp_71<9njEAhoRv2=D3q>1lom|@iZ zUryZ;rbcub!(t+xH8rfHzP^k5YL!`_6%r`zm>jhG;QGRl2C6NH@=PtXCo9;o%Ovrf zwCIi8RN$>s&4=z3-?n7rWynRS<)S#lp?Jegcwakye_G-vKX}B7JFuKV zo^L;R8fbecEqQ#iWbYC5!>`(1)$gM4>~3|v$~1*0nYWD3Id3w4S3S&hHB_k#VbxO? zo{c_os$Te;-j$2BFj_b9ka>(T(l3Y4PkthGblxETD?@yw?%#Tjqk@OupAyLCxS$Et zYBygJ``<*7jS##e>urlzcmDP2oWMfgBJOiF1mNU?SI#dM$fHJPLJe9!3$LM3I6`s) zv#SfcfsT~;fOXHW%aA=ut|nX~$8oU2^B)g_JQZ#IUVVh1T_CA*aY4sO(R3 zq-g?Ilh#7=OH41TR{tTZ?=>P`o_N>%nL2M{KlzTor%bgxmuR5AqsM;L0F@XuCpE1s z6X}PN@JBPo?hQM67TU;thY|#`3H4G?^k=tnB?t;o4#8bYq}xJ-p)c(EWJHRgy7Z}D0O2aonK{nXpsFc*X8CFl!^W|H6^$27vE){bD0 zGg)ouoULc5m9D#e71MWD3fWz9*r3r<)mM0RW!3QxW<|>HSo%NM{Sf2-q$V|<4<5y_ zl(KVXv0kjRVeAnDk0*H}g)1y9tX=Jp6*Z^+Tkl&Ir+SyoRA~UH@pCr{d#Ae2X{E}; zBiwa%c`k45wTQR3{t9In#6M%Hka>d?S06$d3XhvRGU!U$9;h?*(>BX|NE~4vBp$gO zQU)0ug-7H<-v#Drygkw+d26~~^p=Y9X_(U=dh#M$S@7yb8iZI2e{5+52q z8?O_^<>ST~+1s8h+<2Cz8gr|xM~RtU@#$(oC!dCcN-ZDQ#?KhaZk?Kv&vm6g%)OI7 zh~NDPj-&Nfg*BEa&^i>K-ICgWm`D##UwINO`*mKM;N;!VH_90lkDHI57Va+>hot_w zpbso>UWq+uT@5@BJgpYKI$Ya5}SW~w4;_sRT7xvA{;_DQpq7lJD2SEE2^QMTdev~3Kd6&zvqd|{iCuhDgrw1 z?lnJhgU8kZ7p0>&+d_z!4n7vxUK-pH@2oD`MW@6YyjdV?)=WTvXf(!{sRLt{ECD_B#K zNX@)MdwbWyKjRS3FYD(>eZz3@Fo7M|iPh0i#D)gX zlQX9}UlN~=$ig4-q68N7(x$FoCvsoZ#Pcj?JY+RsYQ~@94)zmieqzi-K0~BpUT!oT zxG<7!E|v(5RQzrgaCk3nNxeAthhx*@Xt@}c7&&dt&aM!>ad?J1^ks!OD*`gp`V`6d z&4umx4EMdTQLl9BoO5XpqHQE2923oeG?Nw1vbUP+e9nz3hT3^w@|lcWJmY_yk$8CR zt9cnI*V4qL^}$1l1P7AG9C3VBF^X@YM~ax>20$b+JwLCbilujyEEB*uw$7KH6jz(D z4m`skb`l9#eU3Ypl4!Zg4h>3AIKdnZlRp{ppIZ>SXPeDf4)Q$+$k~2oWH7Of#>c#7 zdxS0Gylo1U$A9ntu`R_Du&*HhxKUlZ(voPh9~RfKWVev{oiWYZ=V$2}!3?8u>;0z> ztQlwpABCNUl>OlPbH99e7-#e2+9@kR|MaSSg#mqbe!IevUlw^f$@_Krz(3YE-E){T zs5nW<`-I-Kt?P|RZ5hSIesDq?Hx&wrIKZqzW2Ksp%P~EKttU-SwXI& z#`W0(gY?@o7KMh?Nu90^df!}^x9@l<@RQ->V_hrvB7X3skjrNr#7@yamceIWgVqc! zv6e2HxU}n53K4<`85@UER?Kw@3m;tS*B+Ya?4>L;<9H>s+Pw<~0^E_>#$|8*qv*I3 zBXom33B1|4Hka0RcZepoV@B?kNb z{m6<{M3kh4@A#oPjPK0xaO~h>g7q}<217|UZNAy}2kuy2mBMQLYcYE_$G_$06(zeG z;oOq92szX= z{=wGCyVvu2Rf17HFNsmUwl}NrX6~JH_E((69i~xp3SLxk9-f5``i2YGI|Fvq=c*1l z7xint>axB(xG(n^fBSy6rRIqtoU9gBjS0dhA!0^0-CbrVO}F;asrA^!r-uH0cAYxc z!3D3P*vu!>>Bhtow~-`4hQ)FEOvr_V2vonZJW6#<8t(RdP2?^7lC@YjOD5a1ek5$( zJb>*}+GLWd*z*}f(J}F#Bt!2x(&9wlBe3lf~)X42!HeEgSyoUI|yI$KoFlhq435qdph-8((Unp&sV3whAukg`KiD(t@ATh*T2+^KoG=RJTG{lV zQdFWI%>ZLewhYT#GjbZ$$wi>a@UW~Jkp zYNGdWrli?@_zui76}AjOZhV`!eHmIRuu8YwStS zJ~dem2nIilkjtvk^E0$6`{Jl-b6!I5ThUbL6mkvO1RD~BfSBNR=H3vSD&_uC#}3gj zhpxcdN0tg~+squR)TE>Uhjb!ln(5s#;hggu=CexXEUb=A2gY3{_S*ZA%IiK)>IUX% zpO3cr#_VaE%3>uTHtHdHX_J4Hw1ejjMEp9epV(@qY{)8Hh8|V)6ySfUzTax z1Ylv_Yv=H??yw`3Onb;s*|9?luadKrTWE@-qf$dboPcl76MbI?l_U@c>JR$~52c;I z=Qgj7EWAufwW}82!b4+k%-+Lyma0ZdCWQ83uT2Q^Z*2X%r+>TR4#lv{tBT1n4WrM{ zmrSWSv`-7-9D=rC+QcPlNx&hbLJ(cO{TVA7xRqjt!r!OBp%RE+ zqfu3EYNcl(o_AbTE9&Ne;S-ssd#!PIJ}obs1M;qpphWHajtk)L3=Qc#Jw1KkooYs( zU$p#1AGxp1R4D0NIZ4vFh6`BtXpEr)C6sswhE>l<)8Ql}#t5s1R-aH-ynS zA<+>29CrOsCD0<6nc)Aibk<=_et#bq6ai_Gk`hsn?k*{5knS$&?vhrK0n#lnx*W|Y z>F(~1Z8Qv|pPTRR`Hu_aVwc-}&iTCKb)K zm#n}K$<^T|Sw^B-SdlETVvH_ger<|$=rvZ&^+q2Q6Ad+c6S}*QgQWJ_rbJcVK2edr z>!$MxWA?8u%%rRD(>yfhDXUTi;Z+`AP3#qwc(H={#@7NaW(Z{&$~{k9 zhW_p8O_bqp3^Ow8-)RWneh#|jxmB4U;#ZESyAa^!spm{e#>T@5P2iV!lTSWB5@=KN z`OjQvo-?HPmyJ`9W@#m53yaXqvN?!Q@Js6Gz>R!^5?vpi-9yDB@tRJSHseF5)z+M0zuwajH7PVmyhjZ$(+L zG69#a*vWtw_D=W!8-C0+{!_pM@au?^i_z*1Y=*D>nRu}>KeIsUs`i7Vitg;}>#DMO zfgei_bEGntZWY}fXt;i9ow%0B1`;y#!YKBNhWzK1=A^uFx$X>qJq#lvBJa8i#(H{s z{w7#Q%9*N z0G-Q_U*~5CpwW9@235=_vBwb^Yd*2=DS;|F9wl=7$t8$UHQ{F|IJrI~BhJXaEw zvqY^zr^xrqtfduSLL@?|O`ny`(14*uTHes;GoD>+j+?HzQQD4-qS~GECt0;%tm$y% zlf;6?!R{?Bgh0Vv49GFBzs&g}7R479x$e=-X3gLrI0 zKezd~whuRL^%^Wu@aKYhbRD>PYiZPQWM?rQ{7ROL1g+AMrQpTk1cLz1m8H0FciDXS z-j{3@m06COx|(=b_{RbQ35VI0O$^ES?i7dN#f;F04q_q@%T7^nzX- zsWY=F8v&x`biX}zA0F=|8HS4410MZcL&PAWWY}M%uQmsfo#qV%hE)%Pszy%_f(fGJ zS*7{N$hfpD$==xpKCp!C*NWr77>8yZE8GcH)yqk5C@ z7IsX)xZQS!PP|J_DPs;+TGH2TQZSaPkDhqlZKL2)31aNoCBW0#Ha^;?BgHA22}zN1 z-t^WxZ=vDQ^CzX8_J_&lubaGZQe*YA5Z~ zmRolWRrO+1Fqzw)S#{7Jfcq>sziB*|B4$8Kh3Z;V;eaPS_=~yU^hIwwpZV~REwBj%Ip?gQ2a4~Iv;O+3BI{P& z?jK_AJ7A#`W`#anwg; zN%y);q(Z+04!oUGxBnElhDIQ* z3UH{3WaM+G+Y16-VGV_aY!vJeE9*2SjQCKtW5ubPz}(Y(&UR3CPCRREB*c^z<@+lP zn@A}sab!|8;?=4w7g-MtA26Oq-rPp@O6+0H!9(m*qA_!NKvcqv*a(Rlc0w!(k(Cj} z=U}xr6z^jDtx}f-$-{hCwINY6R`v{)T)aN8kRlTzvBZ%zeuh&=Du$E82@X3SSX#59 z<>zgW^Y9aQK}kA&l{(ha0cNx-edRfi42jWv!8^3};KHNNf>e|_s_V%yN-xaMI1*R95 zq}Fj~YqphOg0Pht6$}Gtv3!X+os8(Cqldp~yr$0-2dgy*@EA>H#`}hJIWaqxVVF|6 zCBM~Q{ir?rHZ4s*?rry+&WazT65sY(r8dm=HCO*`ySwRJZOZjy9W!nwl=f1^KO5+Dbn9jW0j%!?5s``sT%j1 zGTdr+A03u;9$Kb+Ik;0>v=Bjw9t^#yWL=b{OMIX0g*2yn&#?Z_%g5K|db2=Q?gz>I zeTlaF`^DQ+Ez5};^)c(|ls_d~^+mt|M-0=d?dYg!NYJ;i;1D`>a&Q)$`gdiHj7@0f zgcDcj`k!DX1*=MaS%A_XSd1&hbP#4t{In5`sCuY9uHp8aSOw)>8R|xL3cl7V-)42* zB*XB|jlF?ZU^DaQ8wQ3_6T2WPE8B1nAFPy9=7Jv{ZCzGQK}pBs!y5fVPqc0h{*~Ph znGoS;cVnBV_JPKXN97?a+2L(?8tot;Ph#0i&<_mo3e1px9*^D`(W5w-MDMdvXGwEf zg&3g-a}s0`WwB8~M;QKNnqPx)+l3{~*FEb^@*u?T((&}lpMLNk+<*(2-PA{m?#p}=N2)+rPYzz&)lla-Wwii@fZ7fLww0S9Ww$Q$Pu z3{iAV8yZi%7_@*Fl{)=yZAIxNV5FSYJYdui(Coh>e6oq8e+LJpy9*9x_!yRnn&R}b z=>EVD0piA?Qj{4jUXC!fv}+D0+mU`#Ed{0nhXV|h(9oy%e(~-s>?Daum5Y7P_=+w9 z8#uYu`0~7xzCJmsvzx6e_A{S=-K5PF4-e$eRMz9a_ho0?G|+nq@K@|&4Z>bly^$Z9 z0GQ!@@*h{E?am0oqW2;bo8l1IBM4A=Y~D{djA8n~a;UXGsK&c-X3OjtZl#nqGs#U` z`iyjsT5tE;x%3^+%21iZAcHzSx370b4y?9I2z5PfF^4k6k~4+8oGpG+Hwy*t3x+Fc zuGCmFCIYGAU`58xxs<{EBwnZ=an*53H_)Q|0pt^D!qz?>p-c&9eEi*0CUVitjK=>q z9G}68XLKhlUfD8mR{~yzvt>X^Mb$nW4ZF-O7A2ObZQ$GaOrNUuf^+`)&hSwIuqx7q zhEnW_d~|dtm682B9bjHH6Vnv?a&{Qe{XRJv%&DuFmgX|S0JIh6Apux77YAL#yCHWL zG2e=;5&{h><5^I|1ko&kzq3z6Z7be?`J#S_{sSRJD~Cowm-HfZRaG$ zFI(7|ACu7z%dO^EXINZrG-Bsb)gM|aDzXkMl!5J~tLcjqD_pq_lLi3DeW8NA_b(?8Rc*?S9qdPiD5 z&H}nsFrqe6UcE?Wypg@MF}(3?XLCRp9e3Y!uaBV8N%Phuc>h#R`zuo)7?Hwd%{mYD zz1Uw?2r?FHgb16P3%HuoZk-8$-Q{31CB-spsY%mF$OKy*4o110+w6Hr9fTV%3yvVR9dZ*xV1mwq~b}AbUEc0A2-2LlGMq{EBz! z{jtSP7E=WKMiGaMZmfBL=($o2+T>Jqz)rQJzA4>NG~JjN-wTSnZ!@_@Qek#Z7cEqTW_Cdb%faM6 z{#70aA|f5sIMA#2`IvxQ6Xhcm$RRclWiZ#c{jlua6i^^v-4g8jKbHpud9P+Gd4HotZmhOp`M-zWqqUMaLhxc;GQixVb`xg8D;G6DxMXF&Qo9Q3oVU%&ohYm1sP0b~yFL!P4J zI`56qAUgJ^=2_~O2WMFH$*9Q0z14|I@Mv`(Hbz?4K72L?J=>F6DE8tK0EJGWe{z2f zbB|CI%v-T#o^A?*!{N>pk&1$w%aDAn&rH6Xy>R)QHs%5~8#sa-X7uNq+h_nWeO5DY zT5+3)xCzNz62f{>_djXTUjs~Ju01d3rmAkxy_V$O*cfeH~QN|(nJ(cNgU z(Mwwt@H|n2BVOw?+P}9`5e)CfBAJ|=mNX0y>Ff;MI?eM9krQ#9q}tu79z!BKJVfs= zimtH@DAXFRxRLXo%A!}y7yE);0hddoJ<;UeCU?G`POBq($A1F*>q>;+d_PSN(7_`g z5?y62)hOJCP=OboHfZz@bwm)Uv0zmj>*n@TJ~c<4-L$&ERn zMFvDQ^l9^}{dS9?dwV#;JBbqMogCKXk8b8z4%NGp6H7g}SBBi& zyd1oOKWNYF=b?$?>#DVNpFKJiL3^Wc1ra!iB^5O_r`((sIj=iqiAWV`q73d_?`-)Q zjqT^pf{ByVmWpEbA8Ik)$%^{jshX>qL@ub~gt=4I%Qj^=a*XSdv3 z{Bas(^~Kxo9B#6xA~WDqVddL7%E{MNp(nZBMCP;W+MIQwy-myoHcER#+JL)A0cR7o zMu@5A;pe6+yOOHsZYQrObKymYX>L!Db81c#!UjgAOP+y@B$y3bhPAS8mliF1j@O6bI3t{*b|qxOT8g{-efgI@#Zm&ImFK z_U-!;t0Xwi9BZrR>8h*MR~0MXa>~G}pgw<6rTAD`N}D+eT+MrYOa!CTHk_|==VXe0 z9sEhN3NZN4Q}xQuc(M%Z06_zqnoc?P7=8=`Q>oO8+MVkjWh0&B<9r_wdNxuJIcvRn zMki)149zNK#~wG}NnG%=XJw}QuUM^J%mwRa6E>iw$>vkI zHmaUhK*2gCyJ7fXHC$lJ*%?Xg-7qJ1TOhNZ7++C#Q{eKu+&A4FaVT-LMGKm3Hs^O z`4cIXvrv$cnmn|M^!XbtXIfSKCYh2?mU{tC?}*b)V%8hMGWz#&royn7%vv-)e^AS9 z-$g;U_F76S>rdLu%>4cwBswP;CCtYnYdXj%EvK#EvPIE6>MzLd>bxqJ5VJg+a-lMX&KDkm_M&KF5Em~?!rz`Aoj zsk}Y63Cg!N#k+edLpl^q;VHb9uzQg=@{97Fc_%G4F7^bkAMU8nMK`lS&DQ{Q+)4h@R5Yw6ody$8 zeO{-004zK^9G~n1juj-FV#p6vNqmAFVJ!q{KtXjgyvRcy*u=_;vS9#aB;Mg}-^XlG zB2C!8?wZRcT${Mu97x=C4;=`ba-2|#wrF)b&EfA)O7jx>X=9|cfqXIqq6(ZRNy%Qn z%N|s(r2l6K;}qls_e469iwSTs-Ufu)Xf0Q_vU)T@;c>qtiY~WsVzAxz#sW`)j!>}A zZLX7%w(h#^YA&i$dWs$vef}k-4fyj>h1+?izPP%jS^!%M@8!K*%kN%r-l3pmkqq&5 z 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%0D`8&%OHv&|{iNuIabZ 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%0D(K_0zyVlB^ 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 literal 0 HcmV?d00001 diff --git a/seerr-api.yml b/seerr-api.yml index bf9d882712..d2f42c9f34 100644 --- a/seerr-api.yml +++ b/seerr-api.yml @@ -5012,6 +5012,80 @@ paths: permissions: type: number example: 2 + /user/{userId}/settings/parental-controls: + get: + summary: Get parental control settings for a user + description: Returns parental control settings (content rating limits) for a specific user. Requires `MANAGE_USERS` permission. + tags: + - users + parameters: + - in: path + name: userId + required: true + schema: + type: number + responses: + '200': + description: User parental control settings returned + content: + application/json: + schema: + type: object + properties: + maxMovieRating: + type: string + nullable: true + example: 'PG-13' + description: Maximum allowed MPAA movie rating (G, PG, PG-13, R, NC-17) + maxTvRating: + type: string + nullable: true + example: 'TV-14' + description: Maximum allowed TV rating (TV-Y, TV-Y7, TV-G, TV-PG, TV-14, TV-MA) + post: + summary: Update parental control settings for a user + description: Updates and returns parental control settings for a specific user. Requires `MANAGE_USERS` permission. + tags: + - users + parameters: + - in: path + name: userId + required: true + schema: + type: number + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + maxMovieRating: + type: string + nullable: true + example: 'PG-13' + description: Maximum allowed MPAA movie rating (G, PG, PG-13, R, NC-17) + maxTvRating: + type: string + nullable: true + example: 'TV-14' + description: Maximum allowed TV rating (TV-Y, TV-Y7, TV-G, TV-PG, TV-14, TV-MA) + responses: + '200': + description: Updated user parental control settings returned + content: + application/json: + schema: + type: object + properties: + maxMovieRating: + type: string + nullable: true + example: 'PG-13' + maxTvRating: + type: string + nullable: true + example: 'TV-14' /user/{userId}/watch_data: get: summary: Get watch data diff --git a/server/constants/contentRatings.ts b/server/constants/contentRatings.ts new file mode 100644 index 0000000000..61a6cc1cf0 --- /dev/null +++ b/server/constants/contentRatings.ts @@ -0,0 +1,115 @@ +/** + * Content Rating Constants for Parental Controls + * + * Single source of truth for US content rating hierarchies and filtering logic. + * Lower index = more restrictive (suitable for younger audiences). + */ + +// MPAA Movie Ratings (US) +export const MOVIE_RATINGS = ['G', 'PG', 'PG-13', 'R', 'NC-17'] as const; +export type MovieRating = (typeof MOVIE_RATINGS)[number]; + +// TV Parental Guidelines Ratings (US) +export const TV_RATINGS = [ + 'TV-Y', + 'TV-Y7', + 'TV-G', + 'TV-PG', + 'TV-14', + 'TV-MA', +] as const; +export type TvRating = (typeof TV_RATINGS)[number]; + +// Values that indicate content has no rating +export const UNRATED_VALUES = ['NR', 'UR', 'Unrated', 'Not Rated', '']; + +/** Per-user content rating limits set by admins */ +export interface UserContentRatingLimits { + maxMovieRating?: string; + maxTvRating?: string; + blockUnrated?: boolean; +} + +/** + * Check if a movie should be filtered out based on rating. + * Returns true if the movie should be BLOCKED. + * + * Uses fail-closed approach: unknown/missing ratings are blocked + * when blockUnrated is true. + */ +export function shouldFilterMovie( + rating: string | undefined | null, + maxRating: string | undefined, + blockUnrated = false +): boolean { + if (!maxRating && !blockUnrated) return false; + + if (!rating || UNRATED_VALUES.includes(rating)) { + return blockUnrated; + } + + if (!maxRating) return false; + + const ratingIndex = MOVIE_RATINGS.indexOf(rating as MovieRating); + const maxIndex = MOVIE_RATINGS.indexOf(maxRating as MovieRating); + + // Unknown rating not in our hierarchy — treat as unrated + if (ratingIndex === -1) return blockUnrated; + if (maxIndex === -1) return false; + + return ratingIndex > maxIndex; +} + +/** + * Check if a TV show should be filtered out based on rating. + * Returns true if the show should be BLOCKED. + * + * Uses fail-closed approach: unknown/missing ratings are blocked + * when blockUnrated is true. + */ +export function shouldFilterTv( + rating: string | undefined | null, + maxRating: string | undefined, + blockUnrated = false +): boolean { + if (!maxRating && !blockUnrated) return false; + + if (!rating || UNRATED_VALUES.includes(rating)) { + return blockUnrated; + } + + if (!maxRating) return false; + + const ratingIndex = TV_RATINGS.indexOf(rating as TvRating); + const maxIndex = TV_RATINGS.indexOf(maxRating as TvRating); + + if (ratingIndex === -1) return blockUnrated; + if (maxIndex === -1) return false; + + return ratingIndex > maxIndex; +} + +/** Display options for movie rating dropdown (admin UI) */ +export function getMovieRatingOptions(): { value: string; label: string }[] { + return [ + { value: '', label: 'No Restriction' }, + { value: 'G', label: 'G - General Audiences' }, + { value: 'PG', label: 'PG - Parental Guidance Suggested' }, + { value: 'PG-13', label: 'PG-13 - Parents Strongly Cautioned' }, + { value: 'R', label: 'R - Restricted' }, + { value: 'NC-17', label: 'NC-17 - Adults Only' }, + ]; +} + +/** Display options for TV rating dropdown (admin UI) */ +export function getTvRatingOptions(): { value: string; label: string }[] { + return [ + { value: '', label: 'No Restriction' }, + { value: 'TV-Y', label: 'TV-Y - All Children' }, + { value: 'TV-Y7', label: 'TV-Y7 - Directed to Older Children' }, + { value: 'TV-G', label: 'TV-G - General Audience' }, + { value: 'TV-PG', label: 'TV-PG - Parental Guidance Suggested' }, + { value: 'TV-14', label: 'TV-14 - Parents Strongly Cautioned' }, + { value: 'TV-MA', label: 'TV-MA - Mature Audience Only' }, + ]; +} diff --git a/server/entity/UserSettings.ts b/server/entity/UserSettings.ts index 82671fe3b3..ab501d0d43 100644 --- a/server/entity/UserSettings.ts +++ b/server/entity/UserSettings.ts @@ -72,6 +72,17 @@ export class UserSettings { @Column({ nullable: true }) public watchlistSyncTv?: boolean; + // Per-user content rating limits (admin-enforced parental controls) + // Users cannot see or modify their own limits - only admins can set these + @Column({ nullable: true }) + public maxMovieRating?: string; // MPAA: "G", "PG", "PG-13", "R", "NC-17" (null = unrestricted) + + @Column({ nullable: true }) + public maxTvRating?: string; // TV Guidelines: "TV-Y", "TV-Y7", "TV-G", "TV-PG", "TV-14", "TV-MA" (null = unrestricted) + + @Column({ default: false }) + public blockUnrated?: boolean; // Block content with no rating (NR, unrated) + @Column({ type: 'text', nullable: true, diff --git a/server/interfaces/api/userSettingsInterfaces.ts b/server/interfaces/api/userSettingsInterfaces.ts index 327764618e..613a91f213 100644 --- a/server/interfaces/api/userSettingsInterfaces.ts +++ b/server/interfaces/api/userSettingsInterfaces.ts @@ -20,6 +20,12 @@ export interface UserSettingsGeneralResponse { watchlistSyncTv?: boolean; } +export interface UserSettingsParentalControlsResponse { + maxMovieRating?: string; + maxTvRating?: string; + blockUnrated?: boolean; +} + export type NotificationAgentTypes = Record; export interface UserSettingsNotificationsResponse { emailEnabled?: boolean; diff --git a/server/migration/postgres/1765557160380-AddUserContentRatingLimits.ts b/server/migration/postgres/1765557160380-AddUserContentRatingLimits.ts new file mode 100644 index 0000000000..8fec7c51c9 --- /dev/null +++ b/server/migration/postgres/1765557160380-AddUserContentRatingLimits.ts @@ -0,0 +1,23 @@ +import type { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddUserContentRatingLimits1765557160380 implements MigrationInterface { + name = 'AddUserContentRatingLimits1765557160380'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" ADD "maxMovieRating" character varying` + ); + await queryRunner.query( + `ALTER TABLE "user_settings" ADD "maxTvRating" character varying` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" DROP COLUMN "maxTvRating"` + ); + await queryRunner.query( + `ALTER TABLE "user_settings" DROP COLUMN "maxMovieRating"` + ); + } +} diff --git a/server/migration/postgres/1765557160381-AddBlockUnrated.ts b/server/migration/postgres/1765557160381-AddBlockUnrated.ts new file mode 100644 index 0000000000..352e8aeba9 --- /dev/null +++ b/server/migration/postgres/1765557160381-AddBlockUnrated.ts @@ -0,0 +1,17 @@ +import type { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddBlockUnrated1765557160381 implements MigrationInterface { + name = 'AddBlockUnrated1765557160381'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" ADD "blockUnrated" boolean DEFAULT false` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" DROP COLUMN "blockUnrated"` + ); + } +} diff --git a/server/migration/sqlite/1765557160380-AddUserContentRatingLimits.ts b/server/migration/sqlite/1765557160380-AddUserContentRatingLimits.ts new file mode 100644 index 0000000000..c80041eacc --- /dev/null +++ b/server/migration/sqlite/1765557160380-AddUserContentRatingLimits.ts @@ -0,0 +1,31 @@ +import type { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddUserContentRatingLimits1765557160380 implements MigrationInterface { + name = 'AddUserContentRatingLimits1765557160380'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "temporary_user_settings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "locale" varchar NOT NULL DEFAULT (''), "discoverRegion" varchar, "streamingRegion" varchar, "originalLanguage" varchar, "pgpKey" varchar, "discordId" varchar, "pushbulletAccessToken" varchar, "pushoverApplicationToken" varchar, "pushoverUserKey" varchar, "pushoverSound" varchar, "telegramChatId" varchar, "telegramMessageThreadId" varchar, "telegramSendSilently" boolean, "watchlistSyncMovies" boolean, "watchlistSyncTv" boolean, "notificationTypes" text, "userId" integer, "maxMovieRating" varchar, "maxTvRating" varchar, CONSTRAINT "REL_986a2b6d3c05eb4091bb8066f7" UNIQUE ("userId"), CONSTRAINT "FK_986a2b6d3c05eb4091bb8066f78" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)` + ); + await queryRunner.query( + `INSERT INTO "temporary_user_settings"("id", "locale", "discoverRegion", "streamingRegion", "originalLanguage", "pgpKey", "discordId", "pushbulletAccessToken", "pushoverApplicationToken", "pushoverUserKey", "pushoverSound", "telegramChatId", "telegramMessageThreadId", "telegramSendSilently", "watchlistSyncMovies", "watchlistSyncTv", "notificationTypes", "userId") SELECT "id", "locale", "discoverRegion", "streamingRegion", "originalLanguage", "pgpKey", "discordId", "pushbulletAccessToken", "pushoverApplicationToken", "pushoverUserKey", "pushoverSound", "telegramChatId", "telegramMessageThreadId", "telegramSendSilently", "watchlistSyncMovies", "watchlistSyncTv", "notificationTypes", "userId" FROM "user_settings"` + ); + await queryRunner.query(`DROP TABLE "user_settings"`); + await queryRunner.query( + `ALTER TABLE "temporary_user_settings" RENAME TO "user_settings"` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" RENAME TO "temporary_user_settings"` + ); + await queryRunner.query( + `CREATE TABLE "user_settings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "locale" varchar NOT NULL DEFAULT (''), "discoverRegion" varchar, "streamingRegion" varchar, "originalLanguage" varchar, "pgpKey" varchar, "discordId" varchar, "pushbulletAccessToken" varchar, "pushoverApplicationToken" varchar, "pushoverUserKey" varchar, "pushoverSound" varchar, "telegramChatId" varchar, "telegramMessageThreadId" varchar, "telegramSendSilently" boolean, "watchlistSyncMovies" boolean, "watchlistSyncTv" boolean, "notificationTypes" text, "userId" integer, CONSTRAINT "REL_986a2b6d3c05eb4091bb8066f7" UNIQUE ("userId"), CONSTRAINT "FK_986a2b6d3c05eb4091bb8066f78" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)` + ); + await queryRunner.query( + `INSERT INTO "user_settings"("id", "locale", "discoverRegion", "streamingRegion", "originalLanguage", "pgpKey", "discordId", "pushbulletAccessToken", "pushoverApplicationToken", "pushoverUserKey", "pushoverSound", "telegramChatId", "telegramMessageThreadId", "telegramSendSilently", "watchlistSyncMovies", "watchlistSyncTv", "notificationTypes", "userId") SELECT "id", "locale", "discoverRegion", "streamingRegion", "originalLanguage", "pgpKey", "discordId", "pushbulletAccessToken", "pushoverApplicationToken", "pushoverUserKey", "pushoverSound", "telegramChatId", "telegramMessageThreadId", "telegramSendSilently", "watchlistSyncMovies", "watchlistSyncTv", "notificationTypes", "userId" FROM "temporary_user_settings"` + ); + await queryRunner.query(`DROP TABLE "temporary_user_settings"`); + } +} diff --git a/server/migration/sqlite/1765557160381-AddBlockUnrated.ts b/server/migration/sqlite/1765557160381-AddBlockUnrated.ts new file mode 100644 index 0000000000..1aab254aa9 --- /dev/null +++ b/server/migration/sqlite/1765557160381-AddBlockUnrated.ts @@ -0,0 +1,17 @@ +import type { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddBlockUnrated1765557160381 implements MigrationInterface { + name = 'AddBlockUnrated1765557160381'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" ADD "blockUnrated" boolean DEFAULT (0)` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" DROP COLUMN "blockUnrated"` + ); + } +} diff --git a/server/routes/discover.ts b/server/routes/discover.ts index b40ba99619..aa7832d896 100644 --- a/server/routes/discover.ts +++ b/server/routes/discover.ts @@ -1,7 +1,16 @@ import PlexTvAPI from '@server/api/plextv'; import type { SortOptions } from '@server/api/themoviedb'; import TheMovieDb from '@server/api/themoviedb'; -import type { TmdbKeyword } from '@server/api/themoviedb/interfaces'; +import type { + TmdbKeyword, + TmdbMovieResult, + TmdbTvResult, +} from '@server/api/themoviedb/interfaces'; +import type { UserContentRatingLimits } from '@server/constants/contentRatings'; +import { + shouldFilterMovie, + shouldFilterTv, +} from '@server/constants/contentRatings'; import { MediaType } from '@server/constants/media'; import { getRepository } from '@server/datasource'; import Media from '@server/entity/Media'; @@ -49,6 +58,183 @@ export const createTmdbWithRegionLanguage = (user?: User): TheMovieDb => { }); }; +/** + * Get the user's content rating limits (admin-enforced parental controls) + * These limits are set by admins and users cannot see or modify them + */ +export const getUserContentRatingLimits = ( + user?: User +): UserContentRatingLimits => { + return { + maxMovieRating: user?.settings?.maxMovieRating ?? undefined, + maxTvRating: user?.settings?.maxTvRating ?? undefined, + blockUnrated: user?.settings?.blockUnrated ?? false, + }; +}; + +/** + * Apply certification limits to discover movie options + * Only applies if user has rating limits set and no explicit certification params + */ +const applyMovieCertificationLimits = ( + options: { + certification?: string; + certificationLte?: string; + certificationCountry?: string; + }, + limits: UserContentRatingLimits +): { certificationLte?: string; certificationCountry?: string } => { + // If user has a movie rating limit and no explicit certification filter + if ( + limits.maxMovieRating && + !options.certification && + !options.certificationLte + ) { + return { + certificationLte: limits.maxMovieRating, + certificationCountry: options.certificationCountry || 'US', + }; + } + return {}; +}; + +/** + * Apply certification limits to discover TV options + * Only applies if user has rating limits set and no explicit certification params + */ +const applyTvCertificationLimits = ( + options: { + certification?: string; + certificationLte?: string; + certificationCountry?: string; + }, + limits: UserContentRatingLimits +): { certificationLte?: string; certificationCountry?: string } => { + // If user has a TV rating limit and no explicit certification filter + if ( + limits.maxTvRating && + !options.certification && + !options.certificationLte + ) { + return { + certificationLte: limits.maxTvRating, + certificationCountry: options.certificationCountry || 'US', + }; + } + return {}; +}; + +/** Minimum results before triggering a backfill from the next TMDB page */ +const BACKFILL_THRESHOLD = 15; + +/** + * Post-filter discover results to remove unrated content. + * TMDB's certificationLte query param caps rated content but does NOT + * exclude items with no certification at all. This filter handles that gap. + * Only runs when blockUnrated is true — otherwise it's a no-op. + * + * When filtering drops results below BACKFILL_THRESHOLD, fetches one + * additional TMDB page to compensate for the gap. + */ +const filterMovieBatch = async ( + movies: TmdbMovieResult[], + tmdb: TheMovieDb, + limits: UserContentRatingLimits +): Promise => { + const settled = await Promise.allSettled( + movies.map(async (movie) => { + const details = await tmdb.getMovie({ movieId: movie.id }); + const usRelease = details.release_dates?.results?.find( + (r) => r.iso_3166_1 === 'US' + ); + const cert = usRelease?.release_dates?.find( + (rd) => rd.certification + )?.certification; + return { movie, cert }; + }) + ); + + const filtered: TmdbMovieResult[] = []; + for (const outcome of settled) { + if (outcome.status !== 'fulfilled') continue; + const { movie, cert } = outcome.value; + if (!shouldFilterMovie(cert, limits.maxMovieRating, true)) { + filtered.push(movie); + } + } + return filtered; +}; + +const postFilterDiscoverMovies = async ( + results: TmdbMovieResult[], + tmdb: TheMovieDb, + limits: UserContentRatingLimits, + fetchNextPage?: () => Promise +): Promise => { + if (!limits.blockUnrated) return results; + + const filtered = await filterMovieBatch(results, tmdb, limits); + + // Backfill: if too many results were removed, grab one more page + if (filtered.length < BACKFILL_THRESHOLD && fetchNextPage) { + const nextResults = await fetchNextPage(); + if (nextResults && nextResults.length > 0) { + const nextFiltered = await filterMovieBatch(nextResults, tmdb, limits); + filtered.push(...nextFiltered); + } + } + + return filtered; +}; + +const filterTvBatch = async ( + shows: TmdbTvResult[], + tmdb: TheMovieDb, + limits: UserContentRatingLimits +): Promise => { + const settled = await Promise.allSettled( + shows.map(async (show) => { + const details = await tmdb.getTvShow({ tvId: show.id }); + const usRating = details.content_ratings?.results?.find( + (r) => r.iso_3166_1 === 'US' + ); + return { show, cert: usRating?.rating }; + }) + ); + + const filtered: TmdbTvResult[] = []; + for (const outcome of settled) { + if (outcome.status !== 'fulfilled') continue; + const { show, cert } = outcome.value; + if (!shouldFilterTv(cert, limits.maxTvRating, true)) { + filtered.push(show); + } + } + return filtered; +}; + +const postFilterDiscoverTv = async ( + results: TmdbTvResult[], + tmdb: TheMovieDb, + limits: UserContentRatingLimits, + fetchNextPage?: () => Promise +): Promise => { + if (!limits.blockUnrated) return results; + + const filtered = await filterTvBatch(results, tmdb, limits); + + // Backfill: if too many results were removed, grab one more page + if (filtered.length < BACKFILL_THRESHOLD && fetchNextPage) { + const nextResults = await fetchNextPage(); + if (nextResults && nextResults.length > 0) { + const nextFiltered = await filterTvBatch(nextResults, tmdb, limits); + filtered.push(...nextFiltered); + } + } + + return filtered; +}; + const discoverRoutes = Router(); const QueryFilterOptions = z.object({ @@ -87,14 +273,24 @@ const ApiQuerySchema = QueryFilterOptions.omit({ discoverRoutes.get('/movies', async (req, res, next) => { const tmdb = createTmdbWithRegionLanguage(req.user); + const ratingLimits = getUserContentRatingLimits(req.user); try { const query = ApiQuerySchema.parse(req.query); const keywords = query.keywords; const excludeKeywords = query.excludeKeywords; - const data = await tmdb.getDiscoverMovies({ - page: Number(query.page), + // Apply user's content rating limits (parental controls) + const certificationOverrides = applyMovieCertificationLimits( + { + certification: query.certification, + certificationLte: query.certificationLte, + certificationCountry: query.certificationCountry, + }, + ratingLimits + ); + + const discoverOpts = { sortBy: query.sortBy as SortOptions, language: req.locale ?? query.language, originalLanguage: query.language, @@ -118,23 +314,48 @@ discoverRoutes.get('/movies', async (req, res, next) => { watchRegion: query.watchRegion, certification: query.certification, certificationGte: query.certificationGte, - certificationLte: query.certificationLte, - certificationCountry: query.certificationCountry, + certificationLte: + certificationOverrides.certificationLte ?? query.certificationLte, + certificationCountry: + certificationOverrides.certificationCountry ?? + query.certificationCountry, + }; + const currentPage = Number(query.page); + + const data = await tmdb.getDiscoverMovies({ + page: currentPage, + ...discoverOpts, }); + // Post-filter unrated content if blockUnrated is enabled + const filteredResults = await postFilterDiscoverMovies( + data.results, + tmdb, + ratingLimits, + currentPage < data.total_pages + ? async () => + ( + await tmdb.getDiscoverMovies({ + page: currentPage + 1, + ...discoverOpts, + }) + ).results + : undefined + ); + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); let keywordData: TmdbKeyword[] = []; if (keywords) { - const splitKeywords = keywords.split(','); - const keywordResults = await Promise.all( - splitKeywords.map(async (keywordId) => { - return await tmdb.getKeywordDetails({ keywordId: Number(keywordId) }); - }) + keywords + .split(',') + .map((keywordId) => + tmdb.getKeywordDetails({ keywordId: Number(keywordId) }) + ) ); keywordData = keywordResults.filter( @@ -147,12 +368,12 @@ discoverRoutes.get('/movies', async (req, res, next) => { totalPages: data.total_pages, totalResults: data.total_results, keywords: keywordData, - results: data.results.map((result) => + results: filteredResults.map((result) => mapMovieResult( result, media.find( - (req) => - req.tmdbId === result.id && req.mediaType === MediaType.MOVIE + (med) => + med.tmdbId === result.id && med.mediaType === MediaType.MOVIE ) ) ), @@ -173,6 +394,7 @@ discoverRoutes.get<{ language: string }>( '/movies/language/:language', async (req, res, next) => { const tmdb = createTmdbWithRegionLanguage(req.user); + const ratingLimits = getUserContentRatingLimits(req.user); try { const languages = await tmdb.getLanguages(); @@ -185,15 +407,43 @@ discoverRoutes.get<{ language: string }>( return next({ status: 404, message: 'Language not found.' }); } - const data = await tmdb.getDiscoverMovies({ - page: Number(req.query.page), + // Apply user's content rating limits (parental controls) + const certificationOverrides = applyMovieCertificationLimits( + {}, + ratingLimits + ); + + const langDiscoverOpts = { language: (req.query.language as string) ?? req.locale, originalLanguage: req.params.language, + certificationLte: certificationOverrides.certificationLte, + certificationCountry: certificationOverrides.certificationCountry, + }; + const langPage = Number(req.query.page); + + const data = await tmdb.getDiscoverMovies({ + page: langPage, + ...langDiscoverOpts, }); + const filteredResults = await postFilterDiscoverMovies( + data.results, + tmdb, + ratingLimits, + langPage < data.total_pages + ? async () => + ( + await tmdb.getDiscoverMovies({ + page: langPage + 1, + ...langDiscoverOpts, + }) + ).results + : undefined + ); + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); return res.status(200).json({ @@ -201,12 +451,12 @@ discoverRoutes.get<{ language: string }>( totalPages: data.total_pages, totalResults: data.total_results, language, - results: data.results.map((result) => + results: filteredResults.map((result) => mapMovieResult( result, media.find( - (req) => - req.tmdbId === result.id && req.mediaType === MediaType.MOVIE + (med) => + med.tmdbId === result.id && med.mediaType === MediaType.MOVIE ) ) ), @@ -229,6 +479,7 @@ discoverRoutes.get<{ genreId: string }>( '/movies/genre/:genreId', async (req, res, next) => { const tmdb = createTmdbWithRegionLanguage(req.user); + const ratingLimits = getUserContentRatingLimits(req.user); try { const genres = await tmdb.getMovieGenres({ @@ -243,15 +494,43 @@ discoverRoutes.get<{ genreId: string }>( return next({ status: 404, message: 'Genre not found.' }); } - const data = await tmdb.getDiscoverMovies({ - page: Number(req.query.page), + // Apply user's content rating limits (parental controls) + const certificationOverrides = applyMovieCertificationLimits( + {}, + ratingLimits + ); + + const genreDiscoverOpts = { language: (req.query.language as string) ?? req.locale, genre: req.params.genreId as string, + certificationLte: certificationOverrides.certificationLte, + certificationCountry: certificationOverrides.certificationCountry, + }; + const genrePage = Number(req.query.page); + + const data = await tmdb.getDiscoverMovies({ + page: genrePage, + ...genreDiscoverOpts, }); + const filteredResults = await postFilterDiscoverMovies( + data.results, + tmdb, + ratingLimits, + genrePage < data.total_pages + ? async () => + ( + await tmdb.getDiscoverMovies({ + page: genrePage + 1, + ...genreDiscoverOpts, + }) + ).results + : undefined + ); + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); return res.status(200).json({ @@ -259,12 +538,12 @@ discoverRoutes.get<{ genreId: string }>( totalPages: data.total_pages, totalResults: data.total_results, genre, - results: data.results.map((result) => + results: filteredResults.map((result) => mapMovieResult( result, media.find( - (req) => - req.tmdbId === result.id && req.mediaType === MediaType.MOVIE + (med) => + med.tmdbId === result.id && med.mediaType === MediaType.MOVIE ) ) ), @@ -287,19 +566,48 @@ discoverRoutes.get<{ studioId: string }>( '/movies/studio/:studioId', async (req, res, next) => { const tmdb = new TheMovieDb(); + const ratingLimits = getUserContentRatingLimits(req.user); try { const studio = await tmdb.getStudio(Number(req.params.studioId)); - const data = await tmdb.getDiscoverMovies({ - page: Number(req.query.page), + // Apply user's content rating limits (parental controls) + const certificationOverrides = applyMovieCertificationLimits( + {}, + ratingLimits + ); + + const studioDiscoverOpts = { language: (req.query.language as string) ?? req.locale, studio: req.params.studioId as string, + certificationLte: certificationOverrides.certificationLte, + certificationCountry: certificationOverrides.certificationCountry, + }; + const studioPage = Number(req.query.page); + + const data = await tmdb.getDiscoverMovies({ + page: studioPage, + ...studioDiscoverOpts, }); + const filteredResults = await postFilterDiscoverMovies( + data.results, + tmdb, + ratingLimits, + studioPage < data.total_pages + ? async () => + ( + await tmdb.getDiscoverMovies({ + page: studioPage + 1, + ...studioDiscoverOpts, + }) + ).results + : undefined + ); + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); return res.status(200).json({ @@ -307,7 +615,7 @@ discoverRoutes.get<{ studioId: string }>( totalPages: data.total_pages, totalResults: data.total_results, studio: mapProductionCompany(studio), - results: data.results.map((result) => + results: filteredResults.map((result) => mapMovieResult( result, media.find( @@ -333,6 +641,7 @@ discoverRoutes.get<{ studioId: string }>( discoverRoutes.get('/movies/upcoming', async (req, res, next) => { const tmdb = createTmdbWithRegionLanguage(req.user); + const ratingLimits = getUserContentRatingLimits(req.user); const now = new Date(); const offset = now.getTimezoneOffset(); @@ -340,23 +649,51 @@ discoverRoutes.get('/movies/upcoming', async (req, res, next) => { .toISOString() .split('T')[0]; + // Apply user's content rating limits (parental controls) + const certificationOverrides = applyMovieCertificationLimits( + {}, + ratingLimits + ); + + const upcomingMovieOpts = { + language: (req.query.language as string) ?? req.locale, + primaryReleaseDateGte: date, + certificationLte: certificationOverrides.certificationLte, + certificationCountry: certificationOverrides.certificationCountry, + }; + const upcomingMoviePage = Number(req.query.page); + try { const data = await tmdb.getDiscoverMovies({ - page: Number(req.query.page), - language: (req.query.language as string) ?? req.locale, - primaryReleaseDateGte: date, + page: upcomingMoviePage, + ...upcomingMovieOpts, }); + const filteredResults = await postFilterDiscoverMovies( + data.results, + tmdb, + ratingLimits, + upcomingMoviePage < data.total_pages + ? async () => + ( + await tmdb.getDiscoverMovies({ + page: upcomingMoviePage + 1, + ...upcomingMovieOpts, + }) + ).results + : undefined + ); + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); return res.status(200).json({ page: data.page, totalPages: data.total_pages, totalResults: data.total_results, - results: data.results.map((result) => + results: filteredResults.map((result) => mapMovieResult( result, media.find( @@ -380,13 +717,24 @@ discoverRoutes.get('/movies/upcoming', async (req, res, next) => { discoverRoutes.get('/tv', async (req, res, next) => { const tmdb = createTmdbWithRegionLanguage(req.user); + const ratingLimits = getUserContentRatingLimits(req.user); try { const query = ApiQuerySchema.parse(req.query); const keywords = query.keywords; const excludeKeywords = query.excludeKeywords; - const data = await tmdb.getDiscoverTv({ - page: Number(query.page), + + // Apply user's content rating limits (parental controls) + const certificationOverrides = applyTvCertificationLimits( + { + certification: query.certification, + certificationLte: query.certificationLte, + certificationCountry: query.certificationCountry, + }, + ratingLimits + ); + + const tvDiscoverOpts = { sortBy: query.sortBy as SortOptions, language: req.locale ?? query.language, genre: query.genre, @@ -411,23 +759,44 @@ discoverRoutes.get('/tv', async (req, res, next) => { withStatus: query.status, certification: query.certification, certificationGte: query.certificationGte, - certificationLte: query.certificationLte, - certificationCountry: query.certificationCountry, + certificationLte: + certificationOverrides.certificationLte ?? query.certificationLte, + certificationCountry: + certificationOverrides.certificationCountry ?? + query.certificationCountry, + }; + const tvPage = Number(query.page); + + const data = await tmdb.getDiscoverTv({ + page: tvPage, + ...tvDiscoverOpts, }); + // Post-filter unrated content if blockUnrated is enabled + const filteredResults = await postFilterDiscoverTv( + data.results, + tmdb, + ratingLimits, + tvPage < data.total_pages + ? async () => + (await tmdb.getDiscoverTv({ page: tvPage + 1, ...tvDiscoverOpts })) + .results + : undefined + ); + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); let keywordData: TmdbKeyword[] = []; if (keywords) { - const splitKeywords = keywords.split(','); - const keywordResults = await Promise.all( - splitKeywords.map(async (keywordId) => { - return await tmdb.getKeywordDetails({ keywordId: Number(keywordId) }); - }) + keywords + .split(',') + .map((keywordId) => + tmdb.getKeywordDetails({ keywordId: Number(keywordId) }) + ) ); keywordData = keywordResults.filter( @@ -440,7 +809,7 @@ discoverRoutes.get('/tv', async (req, res, next) => { totalPages: data.total_pages, totalResults: data.total_results, keywords: keywordData, - results: data.results.map((result) => + results: filteredResults.map((result) => mapTvResult( result, media.find( @@ -465,6 +834,7 @@ discoverRoutes.get<{ language: string }>( '/tv/language/:language', async (req, res, next) => { const tmdb = createTmdbWithRegionLanguage(req.user); + const ratingLimits = getUserContentRatingLimits(req.user); try { const languages = await tmdb.getLanguages(); @@ -477,15 +847,43 @@ discoverRoutes.get<{ language: string }>( return next({ status: 404, message: 'Language not found.' }); } - const data = await tmdb.getDiscoverTv({ - page: Number(req.query.page), + // Apply user's content rating limits (parental controls) + const certificationOverrides = applyTvCertificationLimits( + {}, + ratingLimits + ); + + const tvLangOpts = { language: (req.query.language as string) ?? req.locale, originalLanguage: req.params.language, + certificationLte: certificationOverrides.certificationLte, + certificationCountry: certificationOverrides.certificationCountry, + }; + const tvLangPage = Number(req.query.page); + + const data = await tmdb.getDiscoverTv({ + page: tvLangPage, + ...tvLangOpts, }); + const filteredResults = await postFilterDiscoverTv( + data.results, + tmdb, + ratingLimits, + tvLangPage < data.total_pages + ? async () => + ( + await tmdb.getDiscoverTv({ + page: tvLangPage + 1, + ...tvLangOpts, + }) + ).results + : undefined + ); + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); return res.status(200).json({ @@ -493,7 +891,7 @@ discoverRoutes.get<{ language: string }>( totalPages: data.total_pages, totalResults: data.total_results, language, - results: data.results.map((result) => + results: filteredResults.map((result) => mapTvResult( result, media.find( @@ -521,6 +919,7 @@ discoverRoutes.get<{ genreId: string }>( '/tv/genre/:genreId', async (req, res, next) => { const tmdb = createTmdbWithRegionLanguage(req.user); + const ratingLimits = getUserContentRatingLimits(req.user); try { const genres = await tmdb.getTvGenres({ @@ -535,15 +934,43 @@ discoverRoutes.get<{ genreId: string }>( return next({ status: 404, message: 'Genre not found.' }); } - const data = await tmdb.getDiscoverTv({ - page: Number(req.query.page), + // Apply user's content rating limits (parental controls) + const certificationOverrides = applyTvCertificationLimits( + {}, + ratingLimits + ); + + const tvGenreOpts = { language: (req.query.language as string) ?? req.locale, genre: req.params.genreId, + certificationLte: certificationOverrides.certificationLte, + certificationCountry: certificationOverrides.certificationCountry, + }; + const tvGenrePage = Number(req.query.page); + + const data = await tmdb.getDiscoverTv({ + page: tvGenrePage, + ...tvGenreOpts, }); + const filteredResults = await postFilterDiscoverTv( + data.results, + tmdb, + ratingLimits, + tvGenrePage < data.total_pages + ? async () => + ( + await tmdb.getDiscoverTv({ + page: tvGenrePage + 1, + ...tvGenreOpts, + }) + ).results + : undefined + ); + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); return res.status(200).json({ @@ -551,7 +978,7 @@ discoverRoutes.get<{ genreId: string }>( totalPages: data.total_pages, totalResults: data.total_results, genre, - results: data.results.map((result) => + results: filteredResults.map((result) => mapTvResult( result, media.find( @@ -579,19 +1006,48 @@ discoverRoutes.get<{ networkId: string }>( '/tv/network/:networkId', async (req, res, next) => { const tmdb = new TheMovieDb(); + const ratingLimits = getUserContentRatingLimits(req.user); try { const network = await tmdb.getNetwork(Number(req.params.networkId)); - const data = await tmdb.getDiscoverTv({ - page: Number(req.query.page), + // Apply user's content rating limits (parental controls) + const certificationOverrides = applyTvCertificationLimits( + {}, + ratingLimits + ); + + const tvNetworkOpts = { language: (req.query.language as string) ?? req.locale, network: Number(req.params.networkId), + certificationLte: certificationOverrides.certificationLte, + certificationCountry: certificationOverrides.certificationCountry, + }; + const tvNetworkPage = Number(req.query.page); + + const data = await tmdb.getDiscoverTv({ + page: tvNetworkPage, + ...tvNetworkOpts, }); + const filteredResults = await postFilterDiscoverTv( + data.results, + tmdb, + ratingLimits, + tvNetworkPage < data.total_pages + ? async () => + ( + await tmdb.getDiscoverTv({ + page: tvNetworkPage + 1, + ...tvNetworkOpts, + }) + ).results + : undefined + ); + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); return res.status(200).json({ @@ -599,7 +1055,7 @@ discoverRoutes.get<{ networkId: string }>( totalPages: data.total_pages, totalResults: data.total_results, network: mapNetwork(network), - results: data.results.map((result) => + results: filteredResults.map((result) => mapTvResult( result, media.find( @@ -625,6 +1081,7 @@ discoverRoutes.get<{ networkId: string }>( discoverRoutes.get('/tv/upcoming', async (req, res, next) => { const tmdb = createTmdbWithRegionLanguage(req.user); + const ratingLimits = getUserContentRatingLimits(req.user); const now = new Date(); const offset = now.getTimezoneOffset(); @@ -632,23 +1089,48 @@ discoverRoutes.get('/tv/upcoming', async (req, res, next) => { .toISOString() .split('T')[0]; + // Apply user's content rating limits (parental controls) + const certificationOverrides = applyTvCertificationLimits({}, ratingLimits); + + const upcomingTvOpts = { + language: (req.query.language as string) ?? req.locale, + firstAirDateGte: date, + certificationLte: certificationOverrides.certificationLte, + certificationCountry: certificationOverrides.certificationCountry, + }; + const upcomingTvPage = Number(req.query.page); + try { const data = await tmdb.getDiscoverTv({ - page: Number(req.query.page), - language: (req.query.language as string) ?? req.locale, - firstAirDateGte: date, + page: upcomingTvPage, + ...upcomingTvOpts, }); + const filteredResults = await postFilterDiscoverTv( + data.results, + tmdb, + ratingLimits, + upcomingTvPage < data.total_pages + ? async () => + ( + await tmdb.getDiscoverTv({ + page: upcomingTvPage + 1, + ...upcomingTvOpts, + }) + ).results + : undefined + ); + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); return res.status(200).json({ page: data.page, totalPages: data.total_pages, totalResults: data.total_results, - results: data.results.map((result) => + results: filteredResults.map((result) => mapTvResult( result, media.find( diff --git a/server/routes/search.ts b/server/routes/search.ts index ee2fd9eb89..7cb89082d0 100644 --- a/server/routes/search.ts +++ b/server/routes/search.ts @@ -1,17 +1,185 @@ import TheMovieDb from '@server/api/themoviedb'; -import type { TmdbSearchMultiResponse } from '@server/api/themoviedb/interfaces'; +import type { + TmdbCollectionResult, + TmdbMovieResult, + TmdbPersonResult, + TmdbSearchMultiResponse, + TmdbTvResult, +} from '@server/api/themoviedb/interfaces'; +import { + shouldFilterMovie, + shouldFilterTv, +} from '@server/constants/contentRatings'; import Media from '@server/entity/Media'; import { findSearchProvider } from '@server/lib/search'; import logger from '@server/logger'; import { mapSearchResults } from '@server/models/Search'; +import { getUserContentRatingLimits } from '@server/routes/discover'; import { Router } from 'express'; +type TmdbSearchResult = + | TmdbMovieResult + | TmdbTvResult + | TmdbPersonResult + | TmdbCollectionResult; + +/** + * Fetch US certification for a single search result. + * Returns the result paired with its certification, or null on failure. + */ +const getCertification = async ( + result: TmdbSearchResult, + tmdb: TheMovieDb +): Promise<{ result: TmdbSearchResult; certification?: string } | null> => { + try { + if (result.media_type === 'movie') { + const details = await tmdb.getMovie({ movieId: result.id }); + const usRelease = details.release_dates?.results?.find( + (r) => r.iso_3166_1 === 'US' + ); + return { + result, + certification: usRelease?.release_dates?.find((rd) => rd.certification) + ?.certification, + }; + } else if (result.media_type === 'tv') { + const details = await tmdb.getTvShow({ tvId: result.id }); + const usRating = details.content_ratings?.results?.find( + (r) => r.iso_3166_1 === 'US' + ); + return { result, certification: usRating?.rating }; + } + // Person/collection — no certification needed + return { result }; + } catch { + return null; // Fail closed — will be filtered out + } +}; + +/** Minimum results before triggering a backfill from the next TMDB page */ +const BACKFILL_THRESHOLD = 15; + +/** + * Filter a batch of search results by content rating. + * Fail-closed: if certification lookup fails, the result is blocked. + */ +const filterSearchBatch = async ( + results: TmdbSearchResult[], + tmdb: TheMovieDb, + maxMovieRating?: string, + maxTvRating?: string, + blockUnrated = false +): Promise => { + const settled = await Promise.allSettled( + results.map((r) => getCertification(r, tmdb)) + ); + + const filtered: TmdbSearchResult[] = []; + + for (const outcome of settled) { + if (outcome.status === 'rejected' || !outcome.value) { + continue; + } + + const { result, certification } = outcome.value; + + if (result.media_type === 'movie') { + if (!maxMovieRating && !blockUnrated) { + filtered.push(result); + continue; + } + if (shouldFilterMovie(certification, maxMovieRating, blockUnrated)) { + logger.debug( + `Filtering movie "${result.title}" (${ + certification || 'NO RATING' + }) — limit: ${maxMovieRating}`, + { label: 'Search' } + ); + continue; + } + } else if (result.media_type === 'tv') { + if (!maxTvRating && !blockUnrated) { + filtered.push(result); + continue; + } + if (shouldFilterTv(certification, maxTvRating, blockUnrated)) { + logger.debug( + `Filtering TV "${result.name}" (${ + certification || 'NO RATING' + }) — limit: ${maxTvRating}`, + { label: 'Search' } + ); + continue; + } + } + + filtered.push(result); + } + + return filtered; +}; + +/** + * Filter search results by user's content rating limits. + * Fetches certifications in parallel for performance. + * When filtering drops results below BACKFILL_THRESHOLD, + * fetches one additional TMDB page to compensate. + */ +const filterSearchResultsByRating = async ( + results: TmdbSearchResult[], + tmdb: TheMovieDb, + maxMovieRating?: string, + maxTvRating?: string, + blockUnrated = false, + fetchNextPage?: () => Promise +): Promise => { + if (!maxMovieRating && !maxTvRating && !blockUnrated) { + return results; + } + + const filtered = await filterSearchBatch( + results, + tmdb, + maxMovieRating, + maxTvRating, + blockUnrated + ); + + // Backfill: if too many results were removed, grab one more page + if (filtered.length < BACKFILL_THRESHOLD && fetchNextPage) { + const nextResults = await fetchNextPage(); + if (nextResults && nextResults.length > 0) { + const nextFiltered = await filterSearchBatch( + nextResults, + tmdb, + maxMovieRating, + maxTvRating, + blockUnrated + ); + filtered.push(...nextFiltered); + } + } + + return filtered; +}; + const searchRoutes = Router(); searchRoutes.get('/', async (req, res, next) => { const queryString = req.query.query as string; const searchProvider = findSearchProvider(queryString.toLowerCase()); let results: TmdbSearchMultiResponse; + const tmdb = new TheMovieDb(); + + const limits = getUserContentRatingLimits(req.user); + + const searchPage = Number(req.query.page) || 1; + const searchLang = (req.query.language as string) ?? req.locale; + const hasFilters = !!( + limits.maxMovieRating || + limits.maxTvRating || + limits.blockUnrated + ); try { if (searchProvider) { @@ -20,29 +188,51 @@ searchRoutes.get('/', async (req, res, next) => { .match(searchProvider.pattern) as RegExpMatchArray; results = await searchProvider.search({ id, - language: (req.query.language as string) ?? req.locale, + language: searchLang, query: queryString, }); } else { - const tmdb = new TheMovieDb(); - results = await tmdb.searchMulti({ query: queryString, - page: Number(req.query.page), - language: (req.query.language as string) ?? req.locale, + page: searchPage, + language: searchLang, }); } + const originalCount = results.results.length; + const filteredResults = await filterSearchResultsByRating( + results.results, + tmdb, + limits.maxMovieRating, + limits.maxTvRating, + limits.blockUnrated ?? false, + // Only backfill for non-provider multi-search with more pages available + !searchProvider && hasFilters && searchPage < results.total_pages + ? async () => { + const next = await tmdb.searchMulti({ + query: queryString, + page: searchPage + 1, + language: searchLang, + }); + return next.results; + } + : undefined + ); + const filteredCount = filteredResults.length; + const media = await Media.getRelatedMedia( req.user, - results.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); + // Estimate total counts based on the filter ratio from this page + const filterRatio = originalCount > 0 ? filteredCount / originalCount : 1; + return res.status(200).json({ page: results.page, - totalPages: results.total_pages, - totalResults: results.total_results, - results: mapSearchResults(results.results, media), + totalPages: Math.ceil(results.total_pages * filterRatio), + totalResults: Math.ceil(results.total_results * filterRatio), + results: mapSearchResults(filteredResults, media), }); } catch (e) { logger.debug('Something went wrong retrieving search results', { diff --git a/server/routes/user/usersettings.ts b/server/routes/user/usersettings.ts index 50ea7c5a5f..dd2b1288ef 100644 --- a/server/routes/user/usersettings.ts +++ b/server/routes/user/usersettings.ts @@ -9,6 +9,7 @@ import { UserSettings } from '@server/entity/UserSettings'; import type { UserSettingsGeneralResponse, UserSettingsNotificationsResponse, + UserSettingsParentalControlsResponse, } from '@server/interfaces/api/userSettingsInterfaces'; import { Permission } from '@server/lib/permissions'; import { getSettings } from '@server/lib/settings'; @@ -728,4 +729,94 @@ userSettingsRoutes.post< } ); +// Parental Controls settings - admin only +userSettingsRoutes.get<{ id: string }, UserSettingsParentalControlsResponse>( + '/parental-controls', + isAuthenticated(Permission.MANAGE_USERS), + async (req, res, next) => { + const userRepository = getRepository(User); + + try { + const user = await userRepository.findOne({ + where: { id: Number(req.params.id) }, + }); + + if (!user) { + return next({ status: 404, message: 'User not found.' }); + } + + return res.status(200).json({ + maxMovieRating: user.settings?.maxMovieRating ?? undefined, + maxTvRating: user.settings?.maxTvRating ?? undefined, + blockUnrated: user.settings?.blockUnrated ?? false, + }); + } catch (e) { + next({ status: 500, message: e.message }); + } + } +); + +userSettingsRoutes.post< + { id: string }, + UserSettingsParentalControlsResponse, + UserSettingsParentalControlsResponse +>( + '/parental-controls', + isAuthenticated(Permission.MANAGE_USERS), + async (req, res, next) => { + const userRepository = getRepository(User); + + try { + const user = await userRepository.findOne({ + where: { id: Number(req.params.id) }, + }); + + if (!user) { + return next({ status: 404, message: 'User not found.' }); + } + + // "Owner" user (id=1) parental controls cannot be set + if (user.id === 1) { + return next({ + status: 403, + message: + 'Cannot set parental controls for the primary administrator.', + }); + } + + // Users with MANAGE_USERS permission cannot have parental controls set on them + if (user.hasPermission(Permission.MANAGE_USERS)) { + return next({ + status: 403, + message: + 'Cannot set parental controls for users with admin permissions.', + }); + } + + if (!user.settings) { + user.settings = new UserSettings({ + user: user, + maxMovieRating: req.body.maxMovieRating || undefined, + maxTvRating: req.body.maxTvRating || undefined, + blockUnrated: req.body.blockUnrated ?? false, + }); + } else { + user.settings.maxMovieRating = req.body.maxMovieRating || undefined; + user.settings.maxTvRating = req.body.maxTvRating || undefined; + user.settings.blockUnrated = req.body.blockUnrated ?? false; + } + + await userRepository.save(user); + + return res.status(200).json({ + maxMovieRating: user.settings.maxMovieRating, + maxTvRating: user.settings.maxTvRating, + blockUnrated: user.settings.blockUnrated ?? false, + }); + } catch (e) { + next({ status: 500, message: e.message }); + } + } +); + export default userSettingsRoutes; diff --git a/src/components/UserProfile/UserSettings/UserParentalControlsSettings/index.tsx b/src/components/UserProfile/UserSettings/UserParentalControlsSettings/index.tsx new file mode 100644 index 0000000000..5854280579 --- /dev/null +++ b/src/components/UserProfile/UserSettings/UserParentalControlsSettings/index.tsx @@ -0,0 +1,216 @@ +import Button from '@app/components/Common/Button'; +import LoadingSpinner from '@app/components/Common/LoadingSpinner'; +import PageTitle from '@app/components/Common/PageTitle'; +import { useUser } from '@app/hooks/useUser'; +import globalMessages from '@app/i18n/globalMessages'; +import ErrorPage from '@app/pages/_error'; +import defineMessages from '@app/utils/defineMessages'; +import { ArrowDownOnSquareIcon } from '@heroicons/react/24/outline'; +import type { UserSettingsParentalControlsResponse } from '@server/interfaces/api/userSettingsInterfaces'; +import axios from 'axios'; +import { Field, Form, Formik } from 'formik'; +import { useRouter } from 'next/router'; +import { useIntl } from 'react-intl'; +import { useToasts } from 'react-toast-notifications'; +import useSWR from 'swr'; + +const messages = defineMessages( + 'components.UserProfile.UserSettings.UserParentalControlsSettings', + { + parentalcontrols: 'Parental Controls', + parentalcontrolssettings: 'Content Rating Limits', + parentalcontrolsdescription: + 'Set maximum content ratings for this user. Content above these ratings will be hidden from discover and search results.', + maxmovierating: 'Max Movie Rating', + maxmovieratingTip: + 'Movies above this rating will be hidden from this user (MPAA ratings)', + maxtvrating: 'Max TV Rating', + maxtvratingTip: + 'TV shows above this rating will be hidden from this user (TV Parental Guidelines)', + norestriction: 'No Restriction', + blockunrated: 'Block Unrated Content', + blockunratedTip: + 'Block content that has no rating (NR, Unrated). When disabled, unrated content is allowed through.', + toastSettingsSuccess: 'Parental control settings saved successfully!', + toastSettingsFailure: 'Something went wrong while saving settings.', + } +); + +const MOVIE_RATINGS = [ + { value: '', label: 'No Restriction' }, + { value: 'G', label: 'G - General Audiences' }, + { value: 'PG', label: 'PG - Parental Guidance Suggested' }, + { value: 'PG-13', label: 'PG-13 - Parents Strongly Cautioned' }, + { value: 'R', label: 'R - Restricted' }, + { value: 'NC-17', label: 'NC-17 - Adults Only' }, +]; + +const TV_RATINGS = [ + { value: '', label: 'No Restriction' }, + { value: 'TV-Y', label: 'TV-Y - All Children' }, + { value: 'TV-Y7', label: 'TV-Y7 - Directed to Older Children' }, + { value: 'TV-G', label: 'TV-G - General Audience' }, + { value: 'TV-PG', label: 'TV-PG - Parental Guidance Suggested' }, + { value: 'TV-14', label: 'TV-14 - Parents Strongly Cautioned' }, + { value: 'TV-MA', label: 'TV-MA - Mature Audience Only' }, +]; + +const UserParentalControlsSettings = () => { + const intl = useIntl(); + const { addToast } = useToasts(); + const router = useRouter(); + const { user } = useUser({ + id: Number(router.query.userId), + }); + const { + data, + error, + mutate: revalidate, + } = useSWR( + user ? `/api/v1/user/${user?.id}/settings/parental-controls` : null + ); + + if (!data && !error) { + return ; + } + + if (!data) { + return ; + } + + return ( + <> + +

+ { + try { + await axios.post( + `/api/v1/user/${user?.id}/settings/parental-controls`, + { + maxMovieRating: values.maxMovieRating || undefined, + maxTvRating: values.maxTvRating || undefined, + blockUnrated: values.blockUnrated, + } + ); + + addToast(intl.formatMessage(messages.toastSettingsSuccess), { + autoDismiss: true, + appearance: 'success', + }); + } catch (e) { + addToast(intl.formatMessage(messages.toastSettingsFailure), { + autoDismiss: true, + appearance: 'error', + }); + } finally { + revalidate(); + } + }} + > + {({ isSubmitting, isValid }) => { + return ( +
+
+ +
+
+ + {MOVIE_RATINGS.map((rating) => ( + + ))} + +
+
+
+
+ +
+
+ + {TV_RATINGS.map((rating) => ( + + ))} + +
+
+
+
+ +
+ +
+
+
+
+ + + +
+
+
+ ); + }} +
+ + ); +}; + +export default UserParentalControlsSettings; diff --git a/src/components/UserProfile/UserSettings/index.tsx b/src/components/UserProfile/UserSettings/index.tsx index cada6e41a3..d10b02c94a 100644 --- a/src/components/UserProfile/UserSettings/index.tsx +++ b/src/components/UserProfile/UserSettings/index.tsx @@ -21,6 +21,7 @@ const messages = defineMessages('components.UserProfile.UserSettings', { menuLinkedAccounts: 'Linked Accounts', menuNotifications: 'Notifications', menuPermissions: 'Permissions', + menuParentalControls: 'Parental Controls', unauthorizedDescription: "You do not have permission to modify this user's settings.", }); @@ -87,6 +88,17 @@ const UserSettings = ({ children }: UserSettingsProps) => { requiredPermission: Permission.MANAGE_USERS, hidden: currentUser?.id !== 1 && currentUser?.id === user.id, }, + { + text: intl.formatMessage(messages.menuParentalControls), + route: '/settings/parental-controls', + regex: /\/settings\/parental-controls/, + requiredPermission: Permission.MANAGE_USERS, + // Hide for owner user (id=1), users viewing their own profile, or admin users + hidden: + user.id === 1 || + currentUser?.id === user.id || + hasPermission(Permission.MANAGE_USERS, user.permissions ?? 0), + }, ]; if (currentUser?.id !== 1 && user.id === 1) { diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index d2b4453de2..bfc2c707e4 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -1502,6 +1502,18 @@ "components.UserProfile.UserSettings.UserNotificationSettings.validationTelegramChatId": "You must provide a valid chat ID", "components.UserProfile.UserSettings.UserNotificationSettings.validationTelegramMessageThreadId": "The thread/topic ID must be a positive whole number", "components.UserProfile.UserSettings.UserNotificationSettings.webpush": "Web Push", + "components.UserProfile.UserSettings.UserParentalControlsSettings.blockunrated": "Block Unrated Content", + "components.UserProfile.UserSettings.UserParentalControlsSettings.blockunratedTip": "Block content that has no rating (NR, Unrated). When disabled, unrated content is allowed through.", + "components.UserProfile.UserSettings.UserParentalControlsSettings.maxmovierating": "Max Movie Rating", + "components.UserProfile.UserSettings.UserParentalControlsSettings.maxmovieratingTip": "Movies above this rating will be hidden from this user (MPAA ratings)", + "components.UserProfile.UserSettings.UserParentalControlsSettings.maxtvrating": "Max TV Rating", + "components.UserProfile.UserSettings.UserParentalControlsSettings.maxtvratingTip": "TV shows above this rating will be hidden from this user (TV Parental Guidelines)", + "components.UserProfile.UserSettings.UserParentalControlsSettings.norestriction": "No Restriction", + "components.UserProfile.UserSettings.UserParentalControlsSettings.parentalcontrols": "Parental Controls", + "components.UserProfile.UserSettings.UserParentalControlsSettings.parentalcontrolsdescription": "Set maximum content ratings for this user. Content above these ratings will be hidden from discover and search results.", + "components.UserProfile.UserSettings.UserParentalControlsSettings.parentalcontrolssettings": "Content Rating Limits", + "components.UserProfile.UserSettings.UserParentalControlsSettings.toastSettingsFailure": "Something went wrong while saving settings.", + "components.UserProfile.UserSettings.UserParentalControlsSettings.toastSettingsSuccess": "Parental control settings saved successfully!", "components.UserProfile.UserSettings.UserPasswordChange.confirmpassword": "Confirm Password", "components.UserProfile.UserSettings.UserPasswordChange.currentpassword": "Current Password", "components.UserProfile.UserSettings.UserPasswordChange.newpassword": "New Password", @@ -1525,6 +1537,7 @@ "components.UserProfile.UserSettings.menuGeneralSettings": "General", "components.UserProfile.UserSettings.menuLinkedAccounts": "Linked Accounts", "components.UserProfile.UserSettings.menuNotifications": "Notifications", + "components.UserProfile.UserSettings.menuParentalControls": "Parental Controls", "components.UserProfile.UserSettings.menuPermissions": "Permissions", "components.UserProfile.UserSettings.unauthorizedDescription": "You do not have permission to modify this user's settings.", "components.UserProfile.emptywatchlist": "Media added to your Plex Watchlist will appear here.", diff --git a/src/pages/users/[userId]/settings/parental-controls.tsx b/src/pages/users/[userId]/settings/parental-controls.tsx new file mode 100644 index 0000000000..f3bbe61117 --- /dev/null +++ b/src/pages/users/[userId]/settings/parental-controls.tsx @@ -0,0 +1,16 @@ +import UserSettings from '@app/components/UserProfile/UserSettings'; +import UserParentalControlsSettings from '@app/components/UserProfile/UserSettings/UserParentalControlsSettings'; +import useRouteGuard from '@app/hooks/useRouteGuard'; +import { Permission } from '@app/hooks/useUser'; +import type { NextPage } from 'next'; + +const UserSettingsParentalControlsPage: NextPage = () => { + useRouteGuard(Permission.MANAGE_USERS); + return ( + + + + ); +}; + +export default UserSettingsParentalControlsPage; From 3b64d9edff92cedff16cdda297ec0256dc5d3153 Mon Sep 17 00:00:00 2001 From: Derrick Date: Thu, 19 Feb 2026 22:00:20 -0600 Subject: [PATCH 2/3] feat: update to inlcude trending filter and improve rating fallback --- server/constants/contentRatings.ts | 1 + server/entity/UserSettings.ts | 3 + .../interfaces/api/userSettingsInterfaces.ts | 1 + .../postgres/1770627987305-AddBlockAdult.ts | 17 ++ .../sqlite/1770627987305-AddBlockAdult.ts | 17 ++ server/routes/discover.ts | 175 +++++++++++++++--- server/routes/user/index.ts | 46 ++++- server/routes/user/usersettings.ts | 4 + src/components/UserList/BulkEditModal.tsx | 115 ++++++++++++ .../UserParentalControlsSettings/index.tsx | 21 +++ 10 files changed, 364 insertions(+), 36 deletions(-) create mode 100644 server/migration/postgres/1770627987305-AddBlockAdult.ts create mode 100644 server/migration/sqlite/1770627987305-AddBlockAdult.ts diff --git a/server/constants/contentRatings.ts b/server/constants/contentRatings.ts index 61a6cc1cf0..a4a22acb2b 100644 --- a/server/constants/contentRatings.ts +++ b/server/constants/contentRatings.ts @@ -28,6 +28,7 @@ export interface UserContentRatingLimits { maxMovieRating?: string; maxTvRating?: string; blockUnrated?: boolean; + blockAdult?: boolean; } /** diff --git a/server/entity/UserSettings.ts b/server/entity/UserSettings.ts index ab501d0d43..46366157cd 100644 --- a/server/entity/UserSettings.ts +++ b/server/entity/UserSettings.ts @@ -83,6 +83,9 @@ export class UserSettings { @Column({ default: false }) public blockUnrated?: boolean; // Block content with no rating (NR, unrated) + @Column({ default: false }) + public blockAdult?: boolean; // Block adult content (TMDB adult flag) + @Column({ type: 'text', nullable: true, diff --git a/server/interfaces/api/userSettingsInterfaces.ts b/server/interfaces/api/userSettingsInterfaces.ts index 613a91f213..d9e6954d00 100644 --- a/server/interfaces/api/userSettingsInterfaces.ts +++ b/server/interfaces/api/userSettingsInterfaces.ts @@ -24,6 +24,7 @@ export interface UserSettingsParentalControlsResponse { maxMovieRating?: string; maxTvRating?: string; blockUnrated?: boolean; + blockAdult?: boolean; } export type NotificationAgentTypes = Record; diff --git a/server/migration/postgres/1770627987305-AddBlockAdult.ts b/server/migration/postgres/1770627987305-AddBlockAdult.ts new file mode 100644 index 0000000000..98ea02cde9 --- /dev/null +++ b/server/migration/postgres/1770627987305-AddBlockAdult.ts @@ -0,0 +1,17 @@ +import type { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddBlockAdult1770627987305 implements MigrationInterface { + name = 'AddBlockAdult1770627987305'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" ADD "blockAdult" boolean DEFAULT false` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" DROP COLUMN "blockAdult"` + ); + } +} diff --git a/server/migration/sqlite/1770627987305-AddBlockAdult.ts b/server/migration/sqlite/1770627987305-AddBlockAdult.ts new file mode 100644 index 0000000000..57adc1e6c5 --- /dev/null +++ b/server/migration/sqlite/1770627987305-AddBlockAdult.ts @@ -0,0 +1,17 @@ +import type { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddBlockAdult1770627987305 implements MigrationInterface { + name = 'AddBlockAdult1770627987305'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" ADD "blockAdult" boolean DEFAULT (0)` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user_settings" DROP COLUMN "blockAdult"` + ); + } +} diff --git a/server/routes/discover.ts b/server/routes/discover.ts index aa7832d896..9563aa8f5a 100644 --- a/server/routes/discover.ts +++ b/server/routes/discover.ts @@ -8,8 +8,11 @@ import type { } from '@server/api/themoviedb/interfaces'; import type { UserContentRatingLimits } from '@server/constants/contentRatings'; import { + MOVIE_RATINGS, shouldFilterMovie, shouldFilterTv, + UNRATED_VALUES, + type MovieRating, } from '@server/constants/contentRatings'; import { MediaType } from '@server/constants/media'; import { getRepository } from '@server/datasource'; @@ -42,15 +45,15 @@ export const createTmdbWithRegionLanguage = (user?: User): TheMovieDb => { user?.settings?.streamingRegion === 'all' ? '' : user?.settings?.streamingRegion - ? user?.settings?.streamingRegion - : settings.main.discoverRegion; + ? user?.settings?.streamingRegion + : settings.main.discoverRegion; const originalLanguage = user?.settings?.originalLanguage === 'all' ? '' : user?.settings?.originalLanguage - ? user?.settings?.originalLanguage - : settings.main.originalLanguage; + ? user?.settings?.originalLanguage + : settings.main.originalLanguage; return new TheMovieDb({ discoverRegion, @@ -69,6 +72,7 @@ export const getUserContentRatingLimits = ( maxMovieRating: user?.settings?.maxMovieRating ?? undefined, maxTvRating: user?.settings?.maxTvRating ?? undefined, blockUnrated: user?.settings?.blockUnrated ?? false, + blockAdult: user?.settings?.blockAdult ?? false, }; }; @@ -136,6 +140,60 @@ const BACKFILL_THRESHOLD = 15; * When filtering drops results below BACKFILL_THRESHOLD, fetches one * additional TMDB page to compensate for the gap. */ +/** + * Extract the best US movie certification from release dates. + * Collects ALL US release date certifications, excludes NR/unrated + * (so unrated director's cuts don't override a theatrical R rating), + * and returns the most restrictive one found. + * Falls back to international ratings if no US rating exists. + */ +const getMovieCertFromDetails = ( + releaseDates: { + iso_3166_1: string; + release_dates: { certification: string }[]; + }[] +): string | undefined => { + const usRelease = releaseDates.find((r) => r.iso_3166_1 === 'US'); + const usCerts: string[] = []; + + if (usRelease?.release_dates) { + for (const rd of usRelease.release_dates) { + if (rd.certification && !UNRATED_VALUES.includes(rd.certification)) { + usCerts.push(rd.certification); + } + } + } + + if (usCerts.length > 0) { + // Return the most restrictive US rating + let best = usCerts[0]; + let bestIdx = MOVIE_RATINGS.indexOf(best as MovieRating); + for (const c of usCerts) { + const idx = MOVIE_RATINGS.indexOf(c as MovieRating); + if (idx > bestIdx) { + bestIdx = idx; + best = c; + } + } + return best; + } + + // Fallback: check all countries for a known MPAA-equivalent rating + for (const release of releaseDates) { + for (const rd of release.release_dates || []) { + if ( + rd.certification && + !UNRATED_VALUES.includes(rd.certification) && + MOVIE_RATINGS.indexOf(rd.certification as MovieRating) !== -1 + ) { + return rd.certification; + } + } + } + + return undefined; +}; + const filterMovieBatch = async ( movies: TmdbMovieResult[], tmdb: TheMovieDb, @@ -144,22 +202,27 @@ const filterMovieBatch = async ( const settled = await Promise.allSettled( movies.map(async (movie) => { const details = await tmdb.getMovie({ movieId: movie.id }); - const usRelease = details.release_dates?.results?.find( - (r) => r.iso_3166_1 === 'US' + const cert = getMovieCertFromDetails( + details.release_dates?.results ?? [] ); - const cert = usRelease?.release_dates?.find( - (rd) => rd.certification - )?.certification; - return { movie, cert }; + return { movie, cert, title: details.title }; }) ); const filtered: TmdbMovieResult[] = []; for (const outcome of settled) { if (outcome.status !== 'fulfilled') continue; - const { movie, cert } = outcome.value; + const { movie, cert, title } = outcome.value; if (!shouldFilterMovie(cert, limits.maxMovieRating, true)) { filtered.push(movie); + } else { + logger.debug('Blocked movie by rating (post-filter)', { + label: 'Content Filtering', + movieId: movie.id, + movieTitle: title, + certification: cert ?? 'unrated', + maxRating: limits.maxMovieRating, + }); } } return filtered; @@ -171,15 +234,23 @@ const postFilterDiscoverMovies = async ( limits: UserContentRatingLimits, fetchNextPage?: () => Promise ): Promise => { - if (!limits.blockUnrated) return results; + // Free in-memory filter: remove TMDB adult-flagged content + let filtered = limits.blockAdult + ? results.filter((movie) => !movie.adult) + : results; - const filtered = await filterMovieBatch(results, tmdb, limits); + if (!limits.blockUnrated) return filtered; + + filtered = await filterMovieBatch(filtered, tmdb, limits); // Backfill: if too many results were removed, grab one more page if (filtered.length < BACKFILL_THRESHOLD && fetchNextPage) { const nextResults = await fetchNextPage(); if (nextResults && nextResults.length > 0) { - const nextFiltered = await filterMovieBatch(nextResults, tmdb, limits); + const nextInput = limits.blockAdult + ? nextResults.filter((movie) => !movie.adult) + : nextResults; + const nextFiltered = await filterMovieBatch(nextInput, tmdb, limits); filtered.push(...nextFiltered); } } @@ -198,16 +269,24 @@ const filterTvBatch = async ( const usRating = details.content_ratings?.results?.find( (r) => r.iso_3166_1 === 'US' ); - return { show, cert: usRating?.rating }; + return { show, cert: usRating?.rating, title: details.name }; }) ); const filtered: TmdbTvResult[] = []; for (const outcome of settled) { if (outcome.status !== 'fulfilled') continue; - const { show, cert } = outcome.value; + const { show, cert, title } = outcome.value; if (!shouldFilterTv(cert, limits.maxTvRating, true)) { filtered.push(show); + } else { + logger.debug('Blocked TV show by rating (post-filter)', { + label: 'Content Filtering', + tvId: show.id, + tvTitle: title, + certification: cert ?? 'unrated', + maxRating: limits.maxTvRating, + }); } } return filtered; @@ -779,8 +858,9 @@ discoverRoutes.get('/tv', async (req, res, next) => { ratingLimits, tvPage < data.total_pages ? async () => - (await tmdb.getDiscoverTv({ page: tvPage + 1, ...tvDiscoverOpts })) - .results + ( + await tmdb.getDiscoverTv({ page: tvPage + 1, ...tvDiscoverOpts }) + ).results : undefined ); @@ -1153,6 +1233,12 @@ discoverRoutes.get('/tv/upcoming', async (req, res, next) => { discoverRoutes.get('/trending', async (req, res, next) => { const tmdb = createTmdbWithRegionLanguage(req.user); + const ratingLimits = getUserContentRatingLimits(req.user); + const hasLimits = + ratingLimits.maxMovieRating || + ratingLimits.maxTvRating || + ratingLimits.blockUnrated || + ratingLimits.blockAdult; try { const data = await tmdb.getAllTrending({ @@ -1160,16 +1246,45 @@ discoverRoutes.get('/trending', async (req, res, next) => { language: (req.query.language as string) ?? req.locale, }); + // Post-filter trending results if user has any parental controls + let filteredResults = data.results; + if (hasLimits) { + const movieResults = data.results.filter(isMovie) as TmdbMovieResult[]; + const tvResults = data.results.filter( + (r) => !isMovie(r) && !isPerson(r) && !isCollection(r) + ) as TmdbTvResult[]; + const otherResults = data.results.filter( + (r) => isPerson(r) || isCollection(r) + ); + + const filteredMovies = await postFilterDiscoverMovies( + movieResults, + tmdb, + ratingLimits + ); + const filteredTv = await postFilterDiscoverTv( + tvResults, + tmdb, + ratingLimits + ); + + filteredResults = [ + ...filteredMovies, + ...filteredTv, + ...otherResults, + ] as typeof data.results; + } + const media = await Media.getRelatedMedia( req.user, - data.results.map((result) => result.id) + filteredResults.map((result) => result.id) ); return res.status(200).json({ page: data.page, totalPages: data.total_pages, totalResults: data.total_results, - results: data.results.map((result) => + results: filteredResults.map((result) => isMovie(result) ? mapMovieResult( result, @@ -1179,16 +1294,16 @@ discoverRoutes.get('/trending', async (req, res, next) => { ) ) : isPerson(result) - ? mapPersonResult(result) - : isCollection(result) - ? mapCollectionResult(result) - : mapTvResult( - result, - media.find( - (med) => - med.tmdbId === result.id && med.mediaType === MediaType.TV - ) - ) + ? mapPersonResult(result) + : isCollection(result) + ? mapCollectionResult(result) + : mapTvResult( + result, + media.find( + (med) => + med.tmdbId === result.id && med.mediaType === MediaType.TV + ) + ) ), }); } catch (e) { diff --git a/server/routes/user/index.ts b/server/routes/user/index.ts index b7733c92ad..52b2f87062 100644 --- a/server/routes/user/index.ts +++ b/server/routes/user/index.ts @@ -9,6 +9,7 @@ import Media from '@server/entity/Media'; import { MediaRequest } from '@server/entity/MediaRequest'; import { User } from '@server/entity/User'; import { UserPushSubscription } from '@server/entity/UserPushSubscription'; +import { UserSettings } from '@server/entity/UserSettings'; import { Watchlist } from '@server/entity/Watchlist'; import type { WatchlistResponse } from '@server/interfaces/api/discoverInterfaces'; import type { @@ -17,7 +18,7 @@ import type { UserResultsResponse, UserWatchDataResponse, } from '@server/interfaces/api/userInterfaces'; -import { Permission, hasPermission } from '@server/lib/permissions'; +import { hasPermission, Permission } from '@server/lib/permissions'; import { getSettings } from '@server/lib/settings'; import logger from '@server/logger'; import { isAuthenticated } from '@server/middleware/auth'; @@ -437,7 +438,14 @@ export const canMakePermissionsChange = ( router.put< Record, Partial[], - { ids: string[]; permissions: number } + { + ids: string[]; + permissions: number; + maxMovieRating?: string; + maxTvRating?: string; + blockUnrated?: boolean; + blockAdult?: boolean; + } >('/', isAuthenticated(Permission.MANAGE_USERS), async (req, res, next) => { try { const isOwner = req.user?.id === 1; @@ -457,14 +465,40 @@ router.put< isOwner ? req.body.ids : req.body.ids.filter((id) => Number(id) !== 1) ), }, + relations: ['settings'], }); const updatedUsers = await Promise.all( users.map(async (user) => { - return userRepository.save({ - ...user, - ...{ permissions: req.body.permissions }, - }); + // Update permissions + user.permissions = req.body.permissions; + + // Update parental controls if provided + if ( + req.body.maxMovieRating !== undefined || + req.body.maxTvRating !== undefined || + req.body.blockUnrated !== undefined || + req.body.blockAdult !== undefined + ) { + if (!user.settings) { + user.settings = new UserSettings({ user }); + } + const settings = user.settings; + if (req.body.maxMovieRating !== undefined) { + settings.maxMovieRating = req.body.maxMovieRating || undefined; + } + if (req.body.maxTvRating !== undefined) { + settings.maxTvRating = req.body.maxTvRating || undefined; + } + if (req.body.blockUnrated !== undefined) { + settings.blockUnrated = req.body.blockUnrated; + } + if (req.body.blockAdult !== undefined) { + settings.blockAdult = req.body.blockAdult; + } + } + + return userRepository.save(user); }) ); diff --git a/server/routes/user/usersettings.ts b/server/routes/user/usersettings.ts index dd2b1288ef..ed2ebe4553 100644 --- a/server/routes/user/usersettings.ts +++ b/server/routes/user/usersettings.ts @@ -749,6 +749,7 @@ userSettingsRoutes.get<{ id: string }, UserSettingsParentalControlsResponse>( maxMovieRating: user.settings?.maxMovieRating ?? undefined, maxTvRating: user.settings?.maxTvRating ?? undefined, blockUnrated: user.settings?.blockUnrated ?? false, + blockAdult: user.settings?.blockAdult ?? false, }); } catch (e) { next({ status: 500, message: e.message }); @@ -799,11 +800,13 @@ userSettingsRoutes.post< maxMovieRating: req.body.maxMovieRating || undefined, maxTvRating: req.body.maxTvRating || undefined, blockUnrated: req.body.blockUnrated ?? false, + blockAdult: req.body.blockAdult ?? false, }); } else { user.settings.maxMovieRating = req.body.maxMovieRating || undefined; user.settings.maxTvRating = req.body.maxTvRating || undefined; user.settings.blockUnrated = req.body.blockUnrated ?? false; + user.settings.blockAdult = req.body.blockAdult ?? false; } await userRepository.save(user); @@ -812,6 +815,7 @@ userSettingsRoutes.post< maxMovieRating: user.settings.maxMovieRating, maxTvRating: user.settings.maxTvRating, blockUnrated: user.settings.blockUnrated ?? false, + blockAdult: user.settings.blockAdult ?? false, }); } catch (e) { next({ status: 500, message: e.message }); diff --git a/src/components/UserList/BulkEditModal.tsx b/src/components/UserList/BulkEditModal.tsx index d5f72ab952..016ef58c96 100644 --- a/src/components/UserList/BulkEditModal.tsx +++ b/src/components/UserList/BulkEditModal.tsx @@ -22,8 +22,33 @@ const messages = defineMessages('components.UserList', { userssaved: 'User permissions saved successfully!', userfail: 'Something went wrong while saving user permissions.', edituser: 'Edit User Permissions', + contentfiltering: 'Content Filtering', + maxmovierating: 'Max Movie Rating', + maxtvrating: 'Max TV Rating', + norestriction: 'No Restriction', + blockunrated: 'Block Unrated Content', + blockadult: 'Block Adult Content', }); +const MOVIE_RATINGS = [ + { value: '', label: 'No Restriction' }, + { value: 'G', label: 'G - General Audiences' }, + { value: 'PG', label: 'PG - Parental Guidance Suggested' }, + { value: 'PG-13', label: 'PG-13 - Parents Strongly Cautioned' }, + { value: 'R', label: 'R - Restricted' }, + { value: 'NC-17', label: 'NC-17 - Adults Only' }, +]; + +const TV_RATINGS = [ + { value: '', label: 'No Restriction' }, + { value: 'TV-Y', label: 'TV-Y - All Children' }, + { value: 'TV-Y7', label: 'TV-Y7 - Directed to Older Children' }, + { value: 'TV-G', label: 'TV-G - General Audience' }, + { value: 'TV-PG', label: 'TV-PG - Parental Guidance Suggested' }, + { value: 'TV-14', label: 'TV-14 - Parents Strongly Cautioned' }, + { value: 'TV-MA', label: 'TV-MA - Mature Audience Only' }, +]; + const BulkEditModal = ({ selectedUserIds, users, @@ -35,6 +60,14 @@ const BulkEditModal = ({ const intl = useIntl(); const { addToast } = useToasts(); const [currentPermission, setCurrentPermission] = useState(0); + const [currentMaxMovieRating, setCurrentMaxMovieRating] = useState< + string | undefined + >(undefined); + const [currentMaxTvRating, setCurrentMaxTvRating] = useState< + string | undefined + >(undefined); + const [currentBlockUnrated, setCurrentBlockUnrated] = useState(false); + const [currentBlockAdult, setCurrentBlockAdult] = useState(false); const [isSaving, setIsSaving] = useState(false); useEffect(() => { @@ -49,6 +82,10 @@ const BulkEditModal = ({ const { data: updated } = await axios.put(`/api/v1/user`, { ids: selectedUserIds, permissions: currentPermission, + maxMovieRating: currentMaxMovieRating || '', + maxTvRating: currentMaxTvRating || '', + blockUnrated: currentBlockUnrated, + blockAdult: currentBlockAdult, }); if (onComplete) { onComplete(updated); @@ -104,6 +141,84 @@ const BulkEditModal = ({ onUpdate={(newPermission) => setCurrentPermission(newPermission)} /> + {hasPermission( + Permission.MANAGE_USERS, + currentUser?.permissions ?? 0 + ) && ( +
+

+ {intl.formatMessage(messages.contentfiltering)} +

+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ setCurrentBlockUnrated(e.target.checked)} + className="rounded-md" + /> + +
+
+ setCurrentBlockAdult(e.target.checked)} + className="rounded-md" + /> + +
+
+ )} ); }; diff --git a/src/components/UserProfile/UserSettings/UserParentalControlsSettings/index.tsx b/src/components/UserProfile/UserSettings/UserParentalControlsSettings/index.tsx index 5854280579..10350de45c 100644 --- a/src/components/UserProfile/UserSettings/UserParentalControlsSettings/index.tsx +++ b/src/components/UserProfile/UserSettings/UserParentalControlsSettings/index.tsx @@ -31,6 +31,9 @@ const messages = defineMessages( blockunrated: 'Block Unrated Content', blockunratedTip: 'Block content that has no rating (NR, Unrated). When disabled, unrated content is allowed through.', + blockadult: 'Block Adult Content', + blockadultTip: + 'Block content flagged as adult by TMDB. This is separate from content ratings and covers explicit/pornographic content.', toastSettingsSuccess: 'Parental control settings saved successfully!', toastSettingsFailure: 'Something went wrong while saving settings.', } @@ -99,6 +102,7 @@ const UserParentalControlsSettings = () => { maxMovieRating: data?.maxMovieRating ?? '', maxTvRating: data?.maxTvRating ?? '', blockUnrated: data?.blockUnrated ?? false, + blockAdult: data?.blockAdult ?? false, }} enableReinitialize onSubmit={async (values) => { @@ -109,6 +113,7 @@ const UserParentalControlsSettings = () => { maxMovieRating: values.maxMovieRating || undefined, maxTvRating: values.maxTvRating || undefined, blockUnrated: values.blockUnrated, + blockAdult: values.blockAdult, } ); @@ -187,6 +192,22 @@ const UserParentalControlsSettings = () => { /> +
+ +
+ +
+
From 415d4ff62ce8d366293b1ddbfd39ec02a3c1f604 Mon Sep 17 00:00:00 2001 From: Derrick Date: Fri, 20 Feb 2026 01:00:59 -0600 Subject: [PATCH 3/3] fix: post-filter rating check was gated behind blockUnrated flag Critical bug: postFilterDiscoverMovies and postFilterDiscoverTv had an early return that only ran the rating post-filter when blockUnrated was enabled. Routes like /trending that lack TMDB certification.lte pre-filter rely entirely on post-filtering, so R-rated movies and TV-MA shows passed through unfiltered when a user had a max rating set but blockUnrated was false. Fixes: postFilterDiscoverMovies runs when maxMovieRating OR blockUnrated is set. postFilterDiscoverTv runs when maxTvRating OR blockUnrated is set. filterMovieBatch and filterTvBatch use actual limits.blockUnrated instead of hardcoded true. --- server/routes/discover.ts | 185 +++++++++++++++++++++----------------- 1 file changed, 101 insertions(+), 84 deletions(-) diff --git a/server/routes/discover.ts b/server/routes/discover.ts index 9563aa8f5a..09df7c3356 100644 --- a/server/routes/discover.ts +++ b/server/routes/discover.ts @@ -9,9 +9,9 @@ import type { import type { UserContentRatingLimits } from '@server/constants/contentRatings'; import { MOVIE_RATINGS, + UNRATED_VALUES, shouldFilterMovie, shouldFilterTv, - UNRATED_VALUES, type MovieRating, } from '@server/constants/contentRatings'; import { MediaType } from '@server/constants/media'; @@ -45,15 +45,15 @@ export const createTmdbWithRegionLanguage = (user?: User): TheMovieDb => { user?.settings?.streamingRegion === 'all' ? '' : user?.settings?.streamingRegion - ? user?.settings?.streamingRegion - : settings.main.discoverRegion; + ? user?.settings?.streamingRegion + : settings.main.discoverRegion; const originalLanguage = user?.settings?.originalLanguage === 'all' ? '' : user?.settings?.originalLanguage - ? user?.settings?.originalLanguage - : settings.main.originalLanguage; + ? user?.settings?.originalLanguage + : settings.main.originalLanguage; return new TheMovieDb({ discoverRegion, @@ -213,7 +213,7 @@ const filterMovieBatch = async ( for (const outcome of settled) { if (outcome.status !== 'fulfilled') continue; const { movie, cert, title } = outcome.value; - if (!shouldFilterMovie(cert, limits.maxMovieRating, true)) { + if (!shouldFilterMovie(cert, limits.maxMovieRating, limits.blockUnrated)) { filtered.push(movie); } else { logger.debug('Blocked movie by rating (post-filter)', { @@ -232,14 +232,21 @@ const postFilterDiscoverMovies = async ( results: TmdbMovieResult[], tmdb: TheMovieDb, limits: UserContentRatingLimits, - fetchNextPage?: () => Promise + fetchNextPage?: () => Promise, + preFiltered = true ): Promise => { // Free in-memory filter: remove TMDB adult-flagged content let filtered = limits.blockAdult ? results.filter((movie) => !movie.adult) : results; - if (!limits.blockUnrated) return filtered; + // When certification.lte was already applied (preFiltered=true), + // only run expensive per-item checks for blockUnrated. + // When not pre-filtered (e.g. trending), also check maxRating. + const needsPostFilter = preFiltered + ? limits.blockUnrated + : limits.blockUnrated || !!limits.maxMovieRating; + if (!needsPostFilter) return filtered; filtered = await filterMovieBatch(filtered, tmdb, limits); @@ -277,7 +284,7 @@ const filterTvBatch = async ( for (const outcome of settled) { if (outcome.status !== 'fulfilled') continue; const { show, cert, title } = outcome.value; - if (!shouldFilterTv(cert, limits.maxTvRating, true)) { + if (!shouldFilterTv(cert, limits.maxTvRating, limits.blockUnrated)) { filtered.push(show); } else { logger.debug('Blocked TV show by rating (post-filter)', { @@ -296,9 +303,16 @@ const postFilterDiscoverTv = async ( results: TmdbTvResult[], tmdb: TheMovieDb, limits: UserContentRatingLimits, - fetchNextPage?: () => Promise + fetchNextPage?: () => Promise, + preFiltered = true ): Promise => { - if (!limits.blockUnrated) return results; + // When certification.lte was already applied (preFiltered=true), + // only run expensive per-item checks for blockUnrated. + // When not pre-filtered (e.g. trending), also check maxRating. + const needsPostFilter = preFiltered + ? limits.blockUnrated + : limits.blockUnrated || !!limits.maxTvRating; + if (!needsPostFilter) return results; const filtered = await filterTvBatch(results, tmdb, limits); @@ -413,12 +427,12 @@ discoverRoutes.get('/movies', async (req, res, next) => { ratingLimits, currentPage < data.total_pages ? async () => - ( - await tmdb.getDiscoverMovies({ - page: currentPage + 1, - ...discoverOpts, - }) - ).results + ( + await tmdb.getDiscoverMovies({ + page: currentPage + 1, + ...discoverOpts, + }) + ).results : undefined ); @@ -511,12 +525,12 @@ discoverRoutes.get<{ language: string }>( ratingLimits, langPage < data.total_pages ? async () => - ( - await tmdb.getDiscoverMovies({ - page: langPage + 1, - ...langDiscoverOpts, - }) - ).results + ( + await tmdb.getDiscoverMovies({ + page: langPage + 1, + ...langDiscoverOpts, + }) + ).results : undefined ); @@ -598,12 +612,12 @@ discoverRoutes.get<{ genreId: string }>( ratingLimits, genrePage < data.total_pages ? async () => - ( - await tmdb.getDiscoverMovies({ - page: genrePage + 1, - ...genreDiscoverOpts, - }) - ).results + ( + await tmdb.getDiscoverMovies({ + page: genrePage + 1, + ...genreDiscoverOpts, + }) + ).results : undefined ); @@ -675,12 +689,12 @@ discoverRoutes.get<{ studioId: string }>( ratingLimits, studioPage < data.total_pages ? async () => - ( - await tmdb.getDiscoverMovies({ - page: studioPage + 1, - ...studioDiscoverOpts, - }) - ).results + ( + await tmdb.getDiscoverMovies({ + page: studioPage + 1, + ...studioDiscoverOpts, + }) + ).results : undefined ); @@ -754,12 +768,12 @@ discoverRoutes.get('/movies/upcoming', async (req, res, next) => { ratingLimits, upcomingMoviePage < data.total_pages ? async () => - ( - await tmdb.getDiscoverMovies({ - page: upcomingMoviePage + 1, - ...upcomingMovieOpts, - }) - ).results + ( + await tmdb.getDiscoverMovies({ + page: upcomingMoviePage + 1, + ...upcomingMovieOpts, + }) + ).results : undefined ); @@ -858,9 +872,8 @@ discoverRoutes.get('/tv', async (req, res, next) => { ratingLimits, tvPage < data.total_pages ? async () => - ( - await tmdb.getDiscoverTv({ page: tvPage + 1, ...tvDiscoverOpts }) - ).results + (await tmdb.getDiscoverTv({ page: tvPage + 1, ...tvDiscoverOpts })) + .results : undefined ); @@ -952,12 +965,12 @@ discoverRoutes.get<{ language: string }>( ratingLimits, tvLangPage < data.total_pages ? async () => - ( - await tmdb.getDiscoverTv({ - page: tvLangPage + 1, - ...tvLangOpts, - }) - ).results + ( + await tmdb.getDiscoverTv({ + page: tvLangPage + 1, + ...tvLangOpts, + }) + ).results : undefined ); @@ -1039,12 +1052,12 @@ discoverRoutes.get<{ genreId: string }>( ratingLimits, tvGenrePage < data.total_pages ? async () => - ( - await tmdb.getDiscoverTv({ - page: tvGenrePage + 1, - ...tvGenreOpts, - }) - ).results + ( + await tmdb.getDiscoverTv({ + page: tvGenrePage + 1, + ...tvGenreOpts, + }) + ).results : undefined ); @@ -1116,12 +1129,12 @@ discoverRoutes.get<{ networkId: string }>( ratingLimits, tvNetworkPage < data.total_pages ? async () => - ( - await tmdb.getDiscoverTv({ - page: tvNetworkPage + 1, - ...tvNetworkOpts, - }) - ).results + ( + await tmdb.getDiscoverTv({ + page: tvNetworkPage + 1, + ...tvNetworkOpts, + }) + ).results : undefined ); @@ -1192,12 +1205,12 @@ discoverRoutes.get('/tv/upcoming', async (req, res, next) => { ratingLimits, upcomingTvPage < data.total_pages ? async () => - ( - await tmdb.getDiscoverTv({ - page: upcomingTvPage + 1, - ...upcomingTvOpts, - }) - ).results + ( + await tmdb.getDiscoverTv({ + page: upcomingTvPage + 1, + ...upcomingTvOpts, + }) + ).results : undefined ); @@ -1260,12 +1273,16 @@ discoverRoutes.get('/trending', async (req, res, next) => { const filteredMovies = await postFilterDiscoverMovies( movieResults, tmdb, - ratingLimits + ratingLimits, + undefined, + false // trending has no certification.lte pre-filter ); const filteredTv = await postFilterDiscoverTv( tvResults, tmdb, - ratingLimits + ratingLimits, + undefined, + false // trending has no certification.lte pre-filter ); filteredResults = [ @@ -1287,23 +1304,23 @@ discoverRoutes.get('/trending', async (req, res, next) => { results: filteredResults.map((result) => isMovie(result) ? mapMovieResult( - result, - media.find( - (med) => - med.tmdbId === result.id && med.mediaType === MediaType.MOVIE - ) + result, + media.find( + (med) => + med.tmdbId === result.id && med.mediaType === MediaType.MOVIE ) + ) : isPerson(result) - ? mapPersonResult(result) - : isCollection(result) - ? mapCollectionResult(result) - : mapTvResult( - result, - media.find( - (med) => - med.tmdbId === result.id && med.mediaType === MediaType.TV + ? mapPersonResult(result) + : isCollection(result) + ? mapCollectionResult(result) + : mapTvResult( + result, + media.find( + (med) => + med.tmdbId === result.id && med.mediaType === MediaType.TV + ) ) - ) ), }); } catch (e) {