From b030f616ac60ae0310fa23f3d9201bd3421b4df3 Mon Sep 17 00:00:00 2001 From: Pierre d'Herbemont Date: Tue, 2 Feb 2010 22:36:33 +0100 Subject: [PATCH] Remove vlc_app. Unfinished, and doesn't belong here. --- .../vlc_app/English.lproj/InfoPlist.strings | Bin 202 -> 0 bytes .../English.lproj/MainMenu.nib/classes.nib | 165 - .../English.lproj/MainMenu.nib/info.nib | 16 - .../MainMenu.nib/keyedobjects.nib | Bin 14320 -> 0 bytes .../vlc_app/English.lproj/MainWindow.xib | 4474 ----------------- .../vlc_app/Icons/applications-internet.png | Bin 1397 -> 0 bytes .../macosx/vlc_app/Icons/dialog-error.png | Bin 653 -> 0 bytes projects/macosx/vlc_app/Info.plist | 28 - projects/macosx/vlc_app/Sources/AppleRemote.h | 199 - projects/macosx/vlc_app/Sources/AppleRemote.m | 726 --- .../macosx/vlc_app/Sources/ImageAndTextCell.h | 42 - .../macosx/vlc_app/Sources/ImageAndTextCell.m | 126 - .../macosx/vlc_app/Sources/VLCAppAdditions.h | 132 - .../macosx/vlc_app/Sources/VLCAppAdditions.m | 334 -- .../macosx/vlc_app/Sources/VLCAppBindings.h | 39 - .../macosx/vlc_app/Sources/VLCAppBindings.m | 261 - .../vlc_app/Sources/VLCBrowsableVideoView.h | 84 - .../vlc_app/Sources/VLCBrowsableVideoView.m | 938 ---- .../macosx/vlc_app/Sources/VLCController.h | 38 - .../macosx/vlc_app/Sources/VLCController.m | 105 - .../vlc_app/Sources/VLCExceptionHandler.h | 32 - .../vlc_app/Sources/VLCExceptionHandler.m | 85 - .../Sources/VLCFullScreenControllerWindow.h | 57 - .../Sources/VLCFullScreenControllerWindow.m | 288 -- .../macosx/vlc_app/Sources/VLCMainWindow.h | 30 - .../macosx/vlc_app/Sources/VLCMainWindow.m | 34 - .../vlc_app/Sources/VLCMainWindowController.h | 81 - .../vlc_app/Sources/VLCMainWindowController.m | 407 -- .../vlc_app/Sources/VLCMediaArrayController.h | 39 - .../vlc_app/Sources/VLCMediaArrayController.m | 91 - .../macosx/vlc_app/Sources/VLCMediaLayer.h | 32 - .../macosx/vlc_app/Sources/VLCMediaLayer.m | 217 - .../vlc_app/Sources/VLCMediaListLayer.h | 34 - .../vlc_app/Sources/VLCMediaListLayer.m | 347 -- .../vlc_app/Sources/VLCValueTransformer.h | 42 - .../vlc_app/Sources/VLCValueTransformer.m | 117 - .../vlc_app/VLC.xcodeproj/project.pbxproj | 825 --- projects/macosx/vlc_app/VLC_Prefix.pch | 7 - projects/macosx/vlc_app/main.m | 14 - 39 files changed, 10486 deletions(-) delete mode 100644 projects/macosx/vlc_app/English.lproj/InfoPlist.strings delete mode 100644 projects/macosx/vlc_app/English.lproj/MainMenu.nib/classes.nib delete mode 100644 projects/macosx/vlc_app/English.lproj/MainMenu.nib/info.nib delete mode 100644 projects/macosx/vlc_app/English.lproj/MainMenu.nib/keyedobjects.nib delete mode 100644 projects/macosx/vlc_app/English.lproj/MainWindow.xib delete mode 100644 projects/macosx/vlc_app/Icons/applications-internet.png delete mode 100644 projects/macosx/vlc_app/Icons/dialog-error.png delete mode 100644 projects/macosx/vlc_app/Info.plist delete mode 100644 projects/macosx/vlc_app/Sources/AppleRemote.h delete mode 100644 projects/macosx/vlc_app/Sources/AppleRemote.m delete mode 100644 projects/macosx/vlc_app/Sources/ImageAndTextCell.h delete mode 100644 projects/macosx/vlc_app/Sources/ImageAndTextCell.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCAppAdditions.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCAppAdditions.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCAppBindings.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCAppBindings.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCBrowsableVideoView.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCBrowsableVideoView.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCController.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCController.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCExceptionHandler.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCExceptionHandler.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCFullScreenControllerWindow.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCFullScreenControllerWindow.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCMainWindow.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCMainWindow.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCMainWindowController.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCMainWindowController.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCMediaArrayController.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCMediaArrayController.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCMediaLayer.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCMediaLayer.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCMediaListLayer.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCMediaListLayer.m delete mode 100644 projects/macosx/vlc_app/Sources/VLCValueTransformer.h delete mode 100644 projects/macosx/vlc_app/Sources/VLCValueTransformer.m delete mode 100644 projects/macosx/vlc_app/VLC.xcodeproj/project.pbxproj delete mode 100644 projects/macosx/vlc_app/VLC_Prefix.pch delete mode 100644 projects/macosx/vlc_app/main.m diff --git a/projects/macosx/vlc_app/English.lproj/InfoPlist.strings b/projects/macosx/vlc_app/English.lproj/InfoPlist.strings deleted file mode 100644 index 414ca3b2f5e172a126dc6cbaee8e9f490a11acf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmW-ZO%B0e6h+V2D#Wl6#Kb_1Oh_OP - - - - IBClasses - - - CLASS - NSView - LANGUAGE - ObjC - SUPERCLASS - NSResponder - - - ACTIONS - - addPlaylist - id - mediaListViewItemDoubleClicked - id - newMainWindow - id - - CLASS - VLCController - LANGUAGE - ObjC - OUTLETS - - categoriesListView - id - fillScreenButton - id - mediaListItemFetchedStatus - id - mediaListItemsCount - id - mediaListSearchField - id - mediaListView - id - videoView - VLCBrowsableVideoView - - SUPERCLASS - NSObject - - - ACTIONS - - mediaListViewItemDoubleClicked - id - videoViewItemClicked - id - - CLASS - VLCMainWindowController - LANGUAGE - ObjC - OUTLETS - - addPlaylistButton - NSButton - categoriesListView - NSOutlineView - categoriesTreeController - NSTreeController - controller - VLCController - mainSplitView - VLCOneSplitView - mediaArrayController - VLCMediaArrayController - mediaListView - NSTableView - mediaPlayer - VLCMediaPlayer - mediaPlayerBackwardPrevButton - NSButton - mediaPlayerForwardNextButton - NSButton - mediaPlayerPlayPauseStopButton - NSButton - removePlaylistButton - NSButton - toolbarMediaAudioVolume - NSView - toolbarMediaControl - NSView - toolbarMediaDescription - NSView - videoView - VLCBrowsableVideoView - - SUPERCLASS - NSWindowController - - - CLASS - FirstResponder - LANGUAGE - ObjC - SUPERCLASS - NSObject - - - CLASS - VLCOneSplitView - LANGUAGE - ObjC - SUPERCLASS - NSSplitView - - - CLASS - VLCMediaArrayController - LANGUAGE - ObjC - SUPERCLASS - NSArrayController - - - ACTIONS - - moveDown - id - moveUp - id - - CLASS - VLCBrowsableVideoView - LANGUAGE - ObjC - OUTLETS - - mainWindowController - VLCMainWindowController - selectedObject - id - target - id - - SUPERCLASS - VLCVideoView - - - CLASS - VLCVideoView - LANGUAGE - ObjC - SUPERCLASS - NSView - - - CLASS - VLCMediaPlayer - LANGUAGE - ObjC - - - IBVersion - 1 - - diff --git a/projects/macosx/vlc_app/English.lproj/MainMenu.nib/info.nib b/projects/macosx/vlc_app/English.lproj/MainMenu.nib/info.nib deleted file mode 100644 index a2db77c154..0000000000 --- a/projects/macosx/vlc_app/English.lproj/MainMenu.nib/info.nib +++ /dev/null @@ -1,16 +0,0 @@ - - - - - IBFramework Version - 629 - IBOldestOS - 5 - IBOpenObjects - - IBSystem Version - 9B18 - targetFramework - IBCocoaFramework - - diff --git a/projects/macosx/vlc_app/English.lproj/MainMenu.nib/keyedobjects.nib b/projects/macosx/vlc_app/English.lproj/MainMenu.nib/keyedobjects.nib deleted file mode 100644 index b55f85ae402ad14b2416ff344749593f89fb215b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14320 zcmc(FcX$+47x%rhGqcI=W_PyN>`n^V%mhMLnjoD30YX9uH7sF;NRkcNjYyL_bfov* zMNmMHBBE3&B8UYn*!8tiM5GC*@SWM+ki|DVkKgFMmHTpVzgT6`MqW_?8(|72*^q=%!^xyP7`aXjg%utMip&5o@ z86^|P#4{>J&1jeeM$70JjxjP8W;F9P^9}PY^Bwaa=6mJ`=11ly=4a*?<^pq(xx`#% zer2vOzcE*t-;?hlexwG!Q5uI&y=*!w zup*nm)@JLlnQUFQ9$TMnz&2zXv5ncs*vHu>Y*V%w+njB|KEbwRTd{4}_H3tKsb!TV zCEsuclz_BIhd88124qAgWJVTbMK)wd4&+2Gl!)BOgLssLl2HmuMYT{G@}hJkAQ5Gt z+Nci7M0HWU{BF5D1A$O}YEg+V7#z?ow|iu1!`cmo7jav8+#k&Ml~np+#NI8pby1N& z7%U!KTv8kw)xCH~bPk?v8z?J-yZ{*^*soh|H(#kgDAR%K4i)fYWT0ZWd{=~`JkuBW z0Rj0ECc+OqicyqyphCX0L!c~_?JM&Q^;Z;fT({i(VvwiA-@CYMNMK|{?x-GBq|}YN&*p zp9NPmKn+nNP&BNZtO#L>If#0~#C96R0I>74}1RWyl9A=7y;hbjy8k5m7Wkr!{J`9<@QO27(}!!BC(y zG6^=yYST7Q6!1OpgDhHm)B$w_7eq66ki@NxkjX-wH=xd_3u*;MsbcI8^#ZQ`P~^#M z)QxQ1&bd){)C1+9o+uaPpiO%{+P zWCdA!4&*OG0aT7gpbFU>fy#;^fA4O&U44W7CB#b9#Bv_)386~#3>t}^MWfJYGzN`D zRSK~u8>jeL|B&zxSV-CavPxnm2?kh}h-eMt@87>qbi_zBva}&I2~9>*&{T*L z`Od76zcfg8k{`&A;H*&2v+_+1&--H4zDbDk8DOmk^nnDSVeKNmz;8kT2wqkXepatVb(QD=JIdL04ts#3jw z?y$f}J}(d`8SH~hXAA{~4lVIVf6H@aF)YrZkAOuw$*76Nr@-QTj8*~>BMRm9f}EK% zx>qH9HIq&KZFF6E(D&#E2>o{cV5qn(oUDL6Me30HH8J=Z82l1ta0$#-m(&Y0$c%O0 z74#dr3Nim0IYIUobSfU==kvR^%^B8f7+l7vatr+dyc&|nYT|S^##;A)Q{$+$8p#e0 zuQH4=1zdh67YaE?c#ZJ6<^GZqIY@j#zE7Z%&l^<^%ibL^s2sq>WtD--VEDH16L4>} zKv;?6K%ge1Sq%bVb&NoArkXn$2)WM*a-a-NFHvS?gX-4J$J4_}Et6pFDePQuB+_({^XCdReUIGh#} zCap=EXqdDOl#j|O>Qw|^FIDbksA{WR>*nDmX?JV+68jCF~cC9_ZK!GX$<97}~-P(R)Nh$GO0%2gwPG-n}};@^Np7v2Vz?u<$!qmX^z@ zC)ZyR!9O`qgCIrzvXH;x!B|#V6sEMU@cUww#sly`TnNJSCV8Y!P2vm&af+grlq0Mc z$q$R;7}(7}QdXOfK%X4I6JacZhXej77yvWTD9I*5cKDa z91vYD;h!;7XW*GYbqE<+6V*A@LgED=ibjwIZO;mRP)mNioxErXJlM!L6f$A{ai(dzw-XYJLKMSw07>IKCp*-9y8m$x+Bz z z4(KtNOsh$YzkvMT5%NebdQ-^MF!4qMAFgjX%?B3Aps=dmRVzTTloIGaPiECXpHiW5 zlsbm~3^Fr9zZj5xIUx5E_>&zz6dc|Rz?B?T9brot{6}7;Oq5*M=8*X{v4O%y*`sXa zL^hYq3$t+)WEYnemqJy`DTP3eMw2||3sqLYaEuMO1yNK{$$*lI1lC-ncr$AbEW+t13MOVTcCM6MS4*CI=B**BnAr zOG++nE6JLgIJ5z|+eS?zC)!nHby#XmUQa(Dw7$J6;48)qU8!s!wvN0|6R{pZEGLH8 zda@xxtZ$?o$yhnZ*EblhS8yG{_EaCL?*^(b)i1n*jBfl|1BxC6JCE>pc=JaMpazob z+qpKloEij54W^24OUjQ;=n~#d6;n@B!*Lfhf+|DjsB&rqRY3)*5FQA4atmd`1E|r| z7-}qj58b22Qv`3t9-Kj=2_w=OJRGW0dyph&EztSU{6u>#&ae4yE82U51W!B2OVMcBOkR$uSkx=jc4`M?_lx8zxs)HN+XI6U0?`C3I|Nz`)T@M!Zp^8@ zWTR|nCAAn2q=M)KHi19JQG?M2(7Xv~kO#I%1xsxQt#=SRNH5Dy9YfDh$78n2n<0iy zqRsG$Y?rsdW*{q=>o50J_+VQHyWgx}yW*hSl^6nAxZ>siNtfqB9RVZLzQH|UcB8YLA9IQ&A^m{{rJC&{;w9nKMdX23D&!gRQ9qdk9|7D|o*iH9*-5hPW{@FJQo+9ez~%oJP7cdm zy*$p;q~?53b3u%npOY^lYW8XWYnQAC^?V+UggQE5h6w99; zCB!|9tAzlOJ^&#aL6;@cr_+#M3aU_NRjhqPHf{(P?OWlp*|0#~e@3#c+4akrpGJ;-=yj1$!!Jq~;Fu0rbi$3qm)c$WN}thf9Uxj^geH#a+dpav#*zEf?^8 zMLYjfzRHqNuzJr8MY8%wz@)KMNCsapb`QoT$PbN4@zV}S{sqO%$ z&cIjz#u~xZ+3<7U!E@c=p3U%g24X7{@<8|Sj7+r={Au7%=9dZM4x*{DN_*KVZL0w$ z<)?}x029jSe*?@A6_f!c9sqiq{&#>0*4PXCq^|gO6k^r|hQm`7Iht)Va3NqURY>T{ifq0n_whTR!o<+~5=g@QMdGvgG0lko3 zL@%b7&`arM^m2Lyy^>x6hr2=`HkDdK>);y`A1c zze?|aXCcU3NKp&(J(TC|H^jq{%`WStjK0&`tpQPWRPtm98 zcj+_qd*lyto7^FH$)Dse@;A9h?n@X+7)u!5pD83vOPG-`ygE}#I8MUx5>`oAEn$s> z6C|u91rpXtn3J$x!UhQ&C2W$gS;7_xTP19huwB9q2|Fe1l5nDg-4galn3r%8xhUae z38zRnRl>C-oF-wfgwrJ~NLZ9`hJJ~C0tj+^(0(h!VM(cP{NHQ+*rboN%(Pi zaUka+UVan9r$^dZ!o!0RfCz(J%$@RnOz86f2=|NG?e%*wTBmW$^<#xxxYZP8Rn?)5 zZQ%-i!yM89Gz$G9mol6H*5(-25Bi)!fU}`&z-wi&>)=rqfEPa;rQqQW?;}th5@H0Z z5ADeqvj5e;1h%@Ed3ZksBl?(;Fv|FcUF0_j{}__XUo2m+d4z6y6=oCqhpDDV2*!xm z0DAW^3?FWE0vl7zWVn+fTW&yv*aNr4-c;3LfM<;{&qmSAKLnS{=|7lM6*m~R$2=eI zC{*>PV6IBP=nIEf?Hk3Y*93a@F;r@3-2tswi-#McFqRhc)Wf}>*moOnqc!Hn7`z2D zk+4sHcreyfRXq*3*BwLUzhAReg=*AXv8zOWVF1r3$2?zi4-9UKjWyYg53jcx*1-d8 zRwckc1Fb1w#~9Al-Cm#_yP(3}llwt19&50e-XP4_Vn~H;6MfYJQxBOfx{HbRdBgr4 zic9?7Am4ptnS5FyDTY*yZxUf;n;)^V|Em*+K!8{^tD8G85xaUG4iuR5L{JSc!xp{@ zxA4_iikx}-ox=3Rt6}?#(@0J3-r-HLZ1gMWF$oEK4T!);Sd6VLuvqH zj=8qURnJGYL_Me?84CacdRlHWAwS@u5;$A%6w0M4p#B%YX@fp;a|uo$45G%P-V{N% z;JiW3gZ5G`hL#e=Mp{a6MxlSWnN%0`lFnwcx`!K5&yz?)sxO?D zkXuph;S7b`44Y0=a6)1SG!|L_8cTr_6G5^auva>qs5t&m8!XZUdpz9!lAB*yF>SBe z(2{r-+7XlC6ov;7n%wY`n_ac5yfZfJ5oR3o95bFFjKoY}CNh(l$;=dHDl?6l&OFb| zU}iG2nAyx6W-c?2na?a>7BY*N#mo|BDYJ}O&a7ZoGOL)?%o=7bvyNHMY+znsHZm_V zo0!eaOU%p67G^86jd_LH&g@`bWp*;VnBB}C<~3$7^E$JSd4qYA+0Ptc4l;+B!^{!p zE#@e5j5*GnVBTgrggZ$%OTwKc+(p7&C7dncZW8V; z;T{ssk#J85=SnzF!o4J%FX7%224vGm!hI#&Ps05rJV3$&C0r=sK@#>!c(89CgEZUKP}Zu{zG42qzj61_E<{0iJZWXtN zdyd=0y{V^s+(bP!fIF(Ep5mr)bGa?tVeSRa$nEF0b33{ITr)j2n0s1J6>%rIxAoK@ zZZiibuKe60Jypo%=&AnP6wbz3xlY^$?se`27tm7!xv|_hZZ@}$OXQkxL%A+oEp86? z4mXcGz>VkL)l&uBRz0QTmUG9srQt|M*=%cQBt@f|ZC9Oh*pA_AIG@F4v7Ohmox@%6 ztTvG|Rqf!MD~f~TcFAz8u0EXNY6a(6d%_{8rxaTiI~9M^G_9uXbOzm#?nV3PQhE$M z1wi@^0M#GDiO0X;w4w>lCfXS%<7SeW6s8vAWkjY9QxfIBzJxX~HIOc5oCsh8@R_ zXC-zbJDHuzPG@JZv)DQ8Jaz%Qh+V=iV^^@N*fs1rb_2VS-Ne4cZeh2v+u2vyUF;tA zE%r2fj{TVZl>LmotE7|`WstTWWvc3_8mMwry;QwbeN_Ea15|~oa#e*Y zqTc>D>YnO6b-ubl-B(?xE>VwCk5P|Pk5{i%uUEgIeo?(y{jz$i`l$Lx^)>Yk^)2;n zja}o^Bx*dGBu$E@mPXXn)-=$x(zMpJ)wI_fPk1I_YQpq{840rz<|OP$*qN|9;kAU<6W&PJpKvFEv;p> zaaxr&Lt95%S6g4(P}^AhxVELXgEm*&OWRx9M>|?OR{NZmXeVeVX{TssYG-R#YG2ZB z(Qeaj*M6WqtNlp(iT1qqbM2SfU$wt!f7f2u-qazTO(*Cwbaixfb@g>Ub$PmcU4gEz zuD@=eZm6zU7t%?(iMq+Usk+U&mvvipujqE@cItNPj_8i+j_cmmeWm+GcR_bccUyN? z_ZOGMc{zd0;OcO7x%yl~t}*u{*9LM&F*lqm+ zWw>pOH>!;ZMx9Y_Y+!6;e9YLy*v#0%*wWb1ILKIP3>ZfkgT{r%#m1$^<;Io9)yB2P zjmAyJZN@i@`;7;UhmGGEzc>D9{MmTHc**#y@wV}c!EwyCk{annK5Vbfct zW2O_PlcrOqcTMk^J}{j%ePsH?bl&v2=}Xhsrf*IEG5uir$@GiqqUo~fis`E9n(2n= zmg%X4=e}l_bkXFSRS{uvvja@vSeAhSh`xe zS$bG{TEjdj0>lEuW z>+{x`*4fs%*7??j)&tf<)+5%ptjDa!t#4c3v7WYGwqCJbwO+H{u->xXw&`s~TMJuD z+mp7|wzjr*whp#Vw$8SotCFjG5ZPoN&6}LyY~0&AKAaNe{cWM{EO0Dx zEOjh*>~ehR_}cNU<2%RqjvpL9Ieu|mbgG>RPMuTlG&;>rt24=&;_T||=Ir6@>CAKH zI}4nBo&B9Y=hMy-XQgwbbAoe{bBc4C^Lgh?=N{)?=RW6~&I8Uv&LhsF&g0Hg&U4O> zonJe@b>4CQ>HOPy--TTY7voa8;$3Q2f=lPpyPCOLxLUfNbhUA{b9Hcaa&>m)y862Y zy8N!8u4314SI9NaHQx2SYo=?qYp!d)YoY6a>yYb+>!|Cv>uuLNuG6kFu3N6#uDhKv zo$f@p$DQO(ao2Kt-GV#AUB_M5UEkf%-PrxOyQ#am`w4d|cWZZBcYAk7cb2=0JKNpe zo#W1R_j31k_i^`g4{#T{eeNQ+-#ye_>>lnebqCxd+(CDxd!&1mdyIRWd%Rn6PjpXq zPjyds&v4IjFLp2WBzaOiwLD&r;K}gR@znLy_cZi0_B`%s>S^wI!qdvr+SAt4-qX>O z<>}(d_H_5;cyc|xJiR@AJpDWaJcS;gr^w^?4D}RyhI>jq0nZ3e&{OFd=^5o2;~D1} z?~yzcJ(E3CJ<~liJhMD=Jo7vYJc~R_Jj*;QJgYowJnK9gJR3cmJUcu)`R4o+d@H^+ z-BD=%}VW` zDy1$+eKGZ5>Z#OEQh%$Ztd&%&MXlUgg|$j*&8>By)+e>DrP8*aqIc;{@ z+_ZUV%hOh-tx9__ZL_!38}N?s2ECQuk={|>G2U_B@m|S0(L32Y)jQog!#m46$2-rv zz`Mx1#JkM9!n?}5#=FkD!MoAB$@`Lbi+7uMyZ2S^F7F=iUhh8do8AN7L*66aqu%4* zx4rLpPkYaJ-}ip#J?H({`>FRc?-$;$yx(}g^M3FB(fhOag7=d5SMP7$-@VtpH@$y& z?|A?8{_VY=j?)$COu8~XK3$!jkgiMDryJAF>DF|6x-&g7-IJb_o|0ZG-J33?XQbCj zubbW^y;=Hwff5)YPEZS4K`)pDtKbk41zt!I(gZ=MEz}hn2#tj%LUW;|&{}9GbQC%Z z*+LH?SI8Io2>pdZVX)vAh6%%kGGT-e5=IK6g>eEACJIx8>B3B5jxb+XBrFwH2&;v4 z!VAJC;bmc)utV4-ye8}u_6vuEw}j)uN#V5cp75dYk?^VTx$u?nt?<3@lW;+}Ec_;1 z6K)E(g+GORA{J>;DXPQ-krR!gMYM}9(IX~{sbZQ~SFA5K6dQ|=i%rGm;uB&kv9;J% zY%g{cv&1f9w%A?F5p%^}VsEjJ*k3FZePWU57l(?);&8E442UDdpjau66i16=#qpvf zP7+i_=5PN_>#Cq+$Qc2cZz$&z2Y0UKOv4H^o21 pI~i04oxx;iGq? - - - 1050 - 9C31 - 629 - 949.26 - 352.00 - - YES - - - - - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - VLCController - - - FirstResponder - - - NSApplication - - - 4367 - 2 - {{40, 316}, {725, 396}} - 813170688 - VLC - VLCMainWindow - - - D7626A9E-3B8B-4E3F-93AC-FC634CD74063 - - - YES - NO - YES - YES - 2 - 1 - - YES - - YES - NSToolbarFlexibleSpaceItem - NSToolbarSpaceItem - - - YES - - NSToolbarFlexibleSpaceItem - - Flexible Space - - - - - - {1, 5} - {20000, 32} - YES - YES - -1 - YES - 0 - - YES - YES - - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - - NSMenuMixedState - - - - - NSToolbarSpaceItem - - Space - - - - - - {32, 5} - {32, 32} - YES - YES - -1 - YES - 0 - - YES - YES - - - 1048576 - 2147483647 - - - - - - - - YES - - - - - YES - - - - - YES - - - {372, 300} - - - 8466 - - YES - - - 292 - {{22, 7}, {96, 12}} - - - YES - - -2079981824 - 262144 - - - LucidaGrande - 9.000000e+00 - 3614 - - - 1.024000e+03 - 0.000000e+00 - 2.530864e+01 - 0.000000e+00 - 0 - 1 - NO - NO - - - - - 290 - {{146, 6}, {438, 14}} - - - YES - - 67239488 - 138544128 - %{value1}@ items - - - 1.100000e+01 - 3100 - - name - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2OQA - - - - 6 - - controlTextColor - - 3 - MAA - - - - - - - 289 - {{684, 3}, {19, 18}} - - - YES - - 67239424 - 134348800 - - - - -1228652289 - 32 - - - NSListViewTemplate - - - - 200 - 25 - - - - - 256 - - YES - - YES - Apple PDF pasteboard type - Apple PICT pasteboard type - Apple PNG pasteboard type - NSFilenamesPboardType - NeXT Encapsulated PostScript v1.2 pasteboard type - NeXT TIFF v4.0 pasteboard type - - - {{7, 7}, {7, 11}} - - - YES - - 130560 - 33554432 - - - volume_low - - 2 - 2 - 0 - NO - - YES - - - - 256 - - YES - - YES - - - - - - - - - {{126, 6}, {15, 13}} - - - YES - - 130560 - 33554432 - - - volume_high - - 2 - 2 - 0 - NO - - YES - - - - 1313 - - {{555, 5}, {16, 16}} - - - 20746 - 1.600000e+01 - 1.000000e+02 - - - - 289 - {{579, 3}, {96, 19}} - - - YES - - 343014976 - 268567552 - - - - YES - 1 - - 6 - - textBackgroundColor - - 3 - MQA - - - - - 130560 - 0 - search - _searchFieldSearch: - - - 138690815 - 0 - - 400 - 75 - - - 130560 - 0 - clear - - YES - - YES - - YES - AXDescription - NSAccessibilityEncodedAttributesValueType - - - YES - cancel - - - - - _searchFieldCancel: - - - 138690815 - 0 - - 400 - 75 - - 255 - - - - - 274 - - YES - - - 274 - {496, 371} - - - VLCBrowsableVideoView - - - - 274 - - YES - - - 274 - - YES - - - 292 - {{36, 2}, {19, 18}} - - - YES - - 67239424 - 134348800 - - - - -2033958657 - 32 - - - NSRemoveTemplate - - - - 200 - 25 - - - - - 292 - {{14, 2}, {19, 18}} - - - YES - - 67239424 - 134348800 - - - - -2033958657 - 32 - - - NSAddTemplate - - - - 200 - 25 - - - - - 274 - - YES - - - 2304 - - YES - - - 4352 - {226, 142} - - - YES - - - -2147483392 - {{190, 0}, {16, 17}} - - - YES - - - 2.242993e+02 - 3.729932e+01 - 1.000000e+03 - - 75628032 - 0 - - - - 3 - MC4zMzMzMzI5OQA - - - 6 - - headerTextColor - - - - - 1411513920 - 132096 - Text Cell - - - - 6 - - controlBackgroundColor - - - - - 1 - YES - - - YES - compare: - - - - 2.000000e+00 - 3.000000e+00 - - - 6 - - gridColor - - 3 - MC41AA - - - 1.700000e+01 - 37748736 - 4 - 15 - 0 - YES - NO - - - {{1, 1}, {226, 142}} - - - - - - 4 - - - - -2147483392 - {{190, 1}, {15, 124}} - - - - _doScroller: - 9.920000e-01 - - - - -2147483392 - {{-100, -100}, {195, 15}} - - - 1 - - - 9.952607e-01 - - - {{0, 20}, {228, 144}} - - - - 530 - - - - QSAAAEEgAABBoAAAQaAAAA - - - {228, 164} - - - NSView - - - - 274 - - YES - - - 2304 - - YES - - - 256 - {226, 188} - - - YES - - - 256 - {226, 17} - - - - - - - -2147483392 - {{-26, 0}, {16, 17}} - - - - - YES - - state - 2.000000e+01 - 2.000000e+01 - 2.000000e+01 - - 75628032 - 0 - - - - 3 - MC4zMzMzMzI5OQA - - - - - 67239424 - 33685504 - - 549453824 - {16, 16} - - YES - - YES - - - - TU0AKgAAA4yAACBQOCQWDQeDgGBiooCYAHlYtoAIt/wJqwN+QiNRuOQUJQoACdTloALMzqwAFx4voAMa -BvKOzGDgSaAyaAQGAGdDcbB0BF1KksIFBBMV/M1tPoLttx01IO2oMyCAKqAZ/1d+gatBMO10iBKwCwFW -MPAezB6Bht6WsKG0cvMHEoQwJRMqBK5xhQAOq+I5qX86wN/A7CB4hYdpVQBA8BAMBgDHAUABEJBUAA8I -A4AP8D5oBO9uQ8i6EBO52ABnNYEABsCAxABT7FgsLaEp/bd7YoDFMqFV7jIdEgBB4RCTJhIGgAgi8TgA -CMBWgBlhsUgByLhBAAnjh4AB9O13gBss96ABoBw4ABYrdduhae8V1d/u6CFEqFd2lQsFoJFopicgp7Hm -gR5jcN7xA45IRhuZoAAoB6Mn4dp1gAdJsu6YZ+CaABknKfp/k/EIVnxEhroIJYmieagjiaJoVjaMoxgA -daYAAcxrk8ABhGGeoAAqaRSAAKQzgmAB2m4cgAAYBICAAfp5HiABbG0FQAG+B4cAATEti0ckvFOgghzE -WwdiEJAkkCOo3IEahAAAeQDQobRhn8zYAm6AAXhUzRkFycIABUEoDgABACyiXJiAVGYXDOABM0eR5oUk -OSCBzSxLhcGgfDQTBJEQgRyjyABum8CIAGeah8AAJwcHMAB/Hmc4AGaX9XA+CgDAACAJpgYpfO6dAczc -UBRFIXpgWQIiCBZZg3hWF4ckgUhQEtV5uDYABqHaKIAHOZBKgAIoiBGABvGSaIAHqCIoSUcRaAADoMVc -aJpoUYYHCoABfmGZBxlxf60LSDYNiAHQfCMX5LkmRcKm5VRvHMYoAB+DReAAAwD0UVpKmCABpnqC4ABm -BptgAJQfgSABwmdVw7Gch0egUfVkGBRSBsIBwQiKI4lm8GIZBWABtmxkoPH0qQ8DqIyBH3Hp+nccoAAC -fh+H+fp1VkepyHYf5znAdR/j4YoCFOXBtHwPiBz+gadACAYlbgdx77md56Hkd50EqLYCBiFAXBMAZ/n4 -fSKnweXCvCAB5nVN50nRKxwnwfxQGOABkE6aYAC6gZxqmqmbAAfbbn8CYphcAxKEmO4bCcc5yncfZxm+ -dh5G8cO8G4dJ9nEbTTm6cEomucaYGyfM6nsgZ084mQAAwG4NAANQDMeBJnVkXB6oydqBnygdVIF74AfD -8PuoFOqBoCAADwEAAAMAAAABABAAAAEBAAMAAAABABAAAAECAAMAAAAEAAAERgEDAAMAAAABAAUAAAEG -AAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABCAAAAAEX -AAQAAAABAAADhAEcAAMAAAABAAEAAAE9AAMAAAABAAIAAAFSAAMAAAABAAEAAAFTAAMAAAAEAAAETodz -AAcAABEcAAAEVgAAAAAACAAIAAgACAABAAEAAQABAAARHGFwcGwCAAAAbW50clJHQiBYWVogB9gAAQAD -AAIAIgAnYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsO7iqjXGJ -P8XCIM/+9UYrgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOclhZWgAAASwAAAAUZ1hZWgAA -AUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAAAXwAAAAsclRSQwAAAagAAAAOZ1RSQwAA -AbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAYSbmRpbgAAB+wAAAY+ZGVzYwAADiwAAABkZHNjbQAA -DpAAAAI+bW1vZAAAENAAAAAoY3BydAAAEPgAAAAkWFlaIAAAAAAAAGBVAAA3OwAAB39YWVogAAAAAAAA -cUgAALFlAAAg1lhZWiAAAAAAAAAlOQAAF3sAAKrPWFlaIAAAAAAAAPNSAAEAAAABFs9zZjMyAAAAAAAB -DEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAA -AAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAADAQAAAgAAADEAqwFCAeICrQOkBMwGEgeZ -CVELLw08D2wRwBQcFoMY8htEHZAfvCHJI7UlhSc6KMUqRiu+LS0uojAYMYwy/DRoNdI3OTijOgQ7YDzA -Phw/cUDFQhZDZkS1RgRHS0iWSd1LHkw+TVJOcE+EUJlRtFLNU+VU/lYWVy5YQ1lVWm1bflyPXZxep1+v -YLhhvGK+Y79kv2W9Zrlns2iwaa9qq2uobKVtom6gb6BwnXGecqNzpXSpdbF2u3fDeM5523rqe/x9DX4e -fzKAQoFFgkGDPIQ4hTWGMIcsiCeJI4oeixiMFI0PjgqPBpACkP6R+ZLzk++U65XoluSX35jamdaa0pvR -nNCd057Zn+Cg6aHzov6kDqUfpjKnSKhdqXOqiauhrLqt0q7qsAKxG7Iys0e0W7Vgtlq3VbhUuVC6S7tH -vEG9O742vzLALsErwiXDIMQbxRfGE8cOyAvJCMoCyvvL9czwzezO68/i0NzRzdLB07LUotWN1nbXX9hG -2SnaCtru287cq92J3mffReAj4QHh4uLD46XkfeVD5frmqOdU6ADoqelR6fjqmus769vsdu0O7aXuOO7J -71bv4vBp8PHxdPH48nny+vN58/f0dfTz9Wz15vZg9tv3UvfJ+ED4tvks+aL6GPqN+wL7ePvv/Gb83v1X -/dH+S/7G/zX/mv//AAAAJAB8AQIBiwI1AwED9AUPBmMH1wmMC2sNeg+hEekUNRaNGNobDR0rHxkg/iKw -JEQlqSb9KEYpiSrSLB4tbC64MAAxTjKTM+E1JzZsN7U4+Do5O3c8sT3sPydAXkGPQsJD8kUbRiFHHUgb -SRZKEEsNTApNBE4BTvxP91DyUexS6VPlVOFV3FbWV9FYzVnIWsJbvVy5XbRepV+JYGxhTmIvYw5j7GTK -Zalmh2dlaEVpKGoKauxr0my7baNuj299cG5xYnJYc0x0RnU8diZ3C3fueNR5u3qie4t8cX1dfkV/LoAZ -gQOB7YLYg8KEroWVhnuHZYhMiTOKGIr8i+GMzI3DjsCPupC3kbaStJO0lLSVs5a5l8GYyZnXmuWb950L -niOfPqBcoX2ioaPJpPOmHKdDqFGpTapJq0isRK1Arj2vOrA3sTayN7M5tD21QbZGt064V7lium27fbyO -vZy+q7+8wM/B3sLgw9rE2MXRxs/HzcjLycnKxMvIzMnNyc7Kz9TQ2tHf0unT9NUA1g3XHNgt2UHaVNtf -3FjdQN4i3wHf3+C74ZjicuNK5CHk+OXM5p7nb+g/6Q7p2uqn63LsPe0J7dHunO9l8C3w8/GM8iTyuvNQ -8+j0f/UX9a32Q/bZ93H4Cvif+TX5zPpj+vv7kfwo/MD9V/3u/oP/E/+J//8AAAATAEMAigDoAV8B7QKj -A3sEdgWYBucIZQn/C84NuA+iEZcTdRVFFvEYghn5G0YcdB2RHqgfvSDMIdwi6iP+JQomFCcfKCQpMSo0 -KzQsOi09LjkvOjAzMTMyMDMuNCY1JjYfNxI35DiuOXQ6ODr2O7Y8dD0tPeY+nT9SQANAs0FjQhFCvkNr -RBZEwkVvRhtGyEd1SCRI1kmPSlFLGkvfTKJNZE4jTuBPnFBYUQ9RyVKDUztT8lSrVWdWIFbcV5pYWVkc -Wd9apFtrXC5c5V2YXkpe/V+xYGVhG2HSYoljQGP3ZK9lZ2YfZtdnj2hIaP5ps2pqax5r0myFbTdt6G6Z -b0lv+nCtcWByFnLNc4R0PXT3dbN2cXcwd/F4s3l2ejl6/3vGfI19VX4dfud/sIB3gUOCDILWg6KEdYVF -hhiG7YfEiJyJd4pWizaMGIz7jd2Ow4+okJGRdJJck0OUJ5UKle2W0Ze5mLaZsJqum6ecpZ2jnqGfn6Ca -oZ6in6OfpKClqqawp7Wov6nKqtar46zyrgOvF7AqsT2yUrNrtIa1o7bCt+W5ELo6u2e8mL3QvwjAQ8GE -wsXECsVQxpnH3ckoynPLuc0Gzk3PlNDb0ifTd9TI1h/Xd9jV2kDbtN0z3rXgRuHg45DlTecW6Prq7Oz3 -7x7xYvO59jL40fua/jn//wAAbmRpbgAAAAAAAAY2AACXVgAAV/4AAFPkAACLUgAAJyoAABaoAABQDQAA -VDkAAtwoAAJUegABlwoAAwEAAAIAAAAQACgAPwBVAGoAgACUAKgAuwDPAOIA9QEIARsBLgFBAVQBZwF7 -AY8BowG4Ac0B4gH4Ag8CJwI/AlgCcgKNAqoCyALnAwkDKwNQA3cDoAPNA/0ELgRhBJYEzQUEBTwFdQWv -BesGKAZnBqcG6QcsB28HtQf9CEcIkQjcCSoJegnLCh4KcwrJCyALeQvTDDEMjgztDU8NtA4nDp8PFA+P -EAwQiBEFEYUSBxKKEw8TlhQgFK0VOBXJFlsW8ReKGCcYxBlmGgwatBtfHA0cvR1zHige3R+WIFAhDSHL -IosjSiQOJNElkiZXJx0n4iimKW4qNir9K8UsjS1VLiAu7C+2MIgxZzJLMzI0GjUCNe822zfLOLs5sDql -O5o8lT2OPoo/hkCFQYlCi0OQRJRFnEamR7JIv0nPSttL60z4TgNPD1AbUSVSM1M9VEVVUFZYV2BYbFl3 -WoRbj1ycXateu1/NYN9h8mMLZCVlQ2Z5Z7lo9Goua3Fss232bz9wh3HQcxp0ZHWydwR4VXmoevp8Un2p -fv6AW4G7gxyEfYXehzyIp4oQi4eM/I53j/eRgJMPlJ+WOZfbmXqbIpzSnoCgMqHno5ylUKcDqLiqiqym -ruSxL7OEtea4XbrhvYTAO8MRxgPJF8xFz4fS5NZK2dPdYOEL5MXohuxZ8CPz7ves+2v//wAAABYAMgBN -AGcAgACXAK4AxQDaAO8BBAEYASwBQQFVAWoBfgGTAagBvgHUAeoCAQIYAjECSwJlAoECnQK9At0C/gMh -A0gDcQOdA88EBAQ9BHgEtgT0BTMFcwW0BfYGOwaBBscHEQdaB6QH8ghBCJAI4Qk1CYoJ4Qo7CpYK8gtQ -C7AMFAx4DN4NRw20DjMOtw87D8QQTxDZEWcR+BKJEx4TtBRNFOgVgxYhFsEXZBgJGK8ZVxoCGq8bXRwM -HMEdiB5RHx4f7yDEIZwidiNSJDIlESXwJtMntiiWKXoqXCs9LB4s/i3eLsIvoTCIMX8yfDN7NHc1eDZ3 -N3w4fDmDOos7kTyePag+uD/GQNxB9kMNRCtFSUZuR5VIuknQSt5L800GThlPLlBDUVhSclOFVJhVrVa9 -V85Y3lntWvpcBV0PXhhfIGAmYStiLmM2ZDtlSWZ5Z7lo82ota29ssG3wbzVwenG8cv90QXWDdsh4C3lN -eo97z30TflB/j4DTgheDWoScheKHO4iiigSLcYzXjj+PqJESkoOT6ZVUlsKYMJmUmv6cbJ3TnzygpKIM -o3Ok2aY+p6GpCaqGrCit4q+isWmzNbT/tti4tbqTvH2+bcBgwlvEX8ZjyHLKfcyVzqjQxtLo1bXYkttv -3kzhN+Qj5wrqA+z87/Ty+PX0+P78Ev//AAAAKQBQAHIAkgCwAM0A6AECARwBNgFOAWcBfwGYAbIBzAHm -AgICHwI+Al0CgAKkAssC9QMiA1UDjgPMBA8EUwSbBOYFMgWBBdAGJAZ6BtIHLgeJB+oITgiyCRkJhQnx -CmMK1AtIC74MOQyyDTENtQ5VDvwPqhBgERgR2xKiE3AUSBUlFggW8RfhGNMZyhrEG8AcuB2iHocfdCBn -IWEiYSNnJHUlgyaYJ7EoyCnlKwAsGy00Lk8vaDCJMcczDDRRNZk24DgqOXc6xjwXPWw+xUAeQYNC6ERW -RcdHQUi/SkNLxk1JTspQTFHOU09UzFZKV8ZZQ1rBXDxduV83YLZiNGO8ZT1mx2hPacprTWzLbkdvxHE8 -crB0I3WVdwt4fXnye2J83X5Sf8uBTYLQhFaF2oc7iKKKBItxjNeOP4+okRKSg5PplVSWwpgwmZSa/pxs -ndOfPKCkogyjc6TZpj6noakJqnKr1q04rpmv+bFYsrW0CbVftrW4CLlXuqK77b05voC/w8EKwk3DksTV -xhbHX8ihyePLKMxyzbTO/tBK0ZbS49Qu1XTWudgB2ULahdvG3QLeN99m4JLht+Lb4/7lGeYv50LoS+lR -6lHrTuxK7TnuJu8N7/Xw0/Gw8oTzV/Qh9Or1sPZz9zT37fim+Vf6Bvq0+1n7/vyj/UX96P8j//8AAGRl -c2MAAAAAAAAACkNvbG9yIExDRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAABIAAAAMbmJOTwAA -ABIAAADocHRQVAAAABYAAAD6c3ZTRQAAABAAAAEQZmlGSQAAABAAAAEgZGFESwAAABwAAAEwemhDTgAA -AAwAAAFMZnJGUgAAABIAAAFYamFKUAAAAA4AAAFqZW5VUwAAABIAAAF4cGxQTAAAABIAAAGKcHRCUgAA -ABgAAAGcZXNFUwAAABIAAAG0emhUVwAAAA4AAAHGcnVSVQAAACQAAAHUa29LUgAAAAwAAAH4ZGVERQAA -ABAAAAIEbmxOTAAAABYAAAIUaXRJVAAAABQAAAIqAEYAYQByAGcAZQAtAEwAQwBEAEwAQwBEACAAYQAg -AEMAbwByAGUAcwBGAOQAcgBnAC0ATABDAEQAVgDkAHIAaQAtAEwAQwBEAEwAQwBEAC0AZgBhAHIAdgBl -AHMAawDmAHIAbV9pgnIAIABMAEMARADJAGMAcgBhAG4AIABMAEMARDCrMOkw/AAgAEwAQwBEAEMAbwBs -AG8AcgAgAEwAQwBEAEsAbwBsAG8AcgAgAEwAQwBEAEwAQwBEACAAQwBvAGwAbwByAGkAZABvAEwAQwBE -ACAAYwBvAGwAbwByX2mCcm2yZnaYb3k6VmgEJgQyBDUEQgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1 -BDnO7LfsACAATABDAEQARgBhAHIAYgAtAEwAQwBEAEsAbABlAHUAcgBlAG4ALQBMAEMARABMAEMARAAg -AGMAbwBsAG8AcgBpAABtbW9kAAAAAAAABhAAAJxbAAAAAMBUuKEAAAAAAAAAAAAAAAAAAAAAdGV4dAAA -AABDb3B5cmlnaHQgQXBwbGUsIEluYy4sIDIwMDgAA - - NSCalibratedRGBColorSpace - 8 - 24 - 0 - - - - - 3 - MCAwAA - - - - - 1.100000e+01 - 16 - - 0 - 0 - 0 - NO - - 3 - YES - YES - - - - title - 2.000000e+02 - 4.000000e+01 - 1.000000e+03 - - 75628032 - 0 - - - - - - - 337772096 - 2048 - - - - - - - 3 - YES - YES - - - - 3.000000e+00 - 2.000000e+00 - - - 1.600000e+01 - 1455423488 - 1 - 4 - 15 - 0 - YES - - - {{1, 17}, {226, 188}} - - - - - - 4 - - - - -2147483392 - {{224, 17}, {15, 102}} - - - - - 9.914530e-01 - - - - -2147483392 - {{1, 119}, {223, 15}} - - - 1 - - - 9.958159e-01 - - - - 2304 - - YES - - - {{1, 0}, {226, 17}} - - - - - - 4 - - - - {{0, 165}, {228, 206}} - - - - 562 - - - - - - QSAAAEEgAABBkAAAQZAAAA - - - {{497, 0}, {228, 371}} - - - 2 - - - {{0, 25}, {725, 371}} - - - YES - 2 - - - {725, 396} - - - - {{0, 0}, {1280, 778}} - {372, 341} - - - - 266 - - YES - - - 289 - {{141, 0}, {46, 13}} - - - YES - - -2079195584 - 71304192 - 00:00 - - - 1.000000e+01 - 2843 - - - - - 1 - MCAwIDAAA - - - - - - 290 - {{8, -1}, {125, 15}} - - - YES - - 67501824 - 131072 - - - - - Helvetica - 1.200000e+01 - 16 - - - 1.000000e+04 - 0.000000e+00 - 3.000000e+00 - 0.000000e+00 - 0 - 1 - NO - NO - - - - {192, 15} - - - - - - - 266 - - YES - - - 288 - {{185, -1}, {40, 25}} - - - YES - - 67239424 - 134348800 - - - - -926662401 - 268435619 - - - NSEnterFullScreenTemplate - - - - NSExitFullScreenTemplate - - - f - 400 - 75 - - - - - 288 - {{-2, 0}, {20, 20}} - - - YES - - 67239424 - 134217728 - - - - -931921665 - 2 - - - - - - - 200 - 25 - - - - - 288 - {{228, -1}, {40, 25}} - - - YES - - 67239424 - 134348800 - - - - -1228128001 - 268435619 - - - l - 400 - 75 - - - - - 288 - {{142, -1}, {40, 25}} - - - YES - - 67239424 - 134348800 - Fit - - - -1232846593 - 268435619 - - e - 400 - 75 - - - - - 288 - {{121, 0}, {20, 20}} - - - YES - - 67239424 - 134217728 - - - - -931921665 - 2 - - - - - - - 200 - 25 - - - - - 288 - {{16, 3}, {103, 15}} - - - YES - - 67501824 - 131072 - - - - - - 1.024000e+03 - 0.000000e+00 - 8.000000e+00 - 0.000000e+00 - 0 - 1 - NO - NO - - - - {274, 23} - - - - - - - 266 - - YES - - - 288 - {{10, 6}, {20, 20}} - - YES - - 604634624 - 134217728 - - - - 139723007 - 66 - - - skip_previous_active - - - - skip_previous_blue - - - - - - 200 - 25 - - - - - 288 - {{34, 2}, {28, 28}} - - YES - - 67239424 - 134217728 - - - - 1.200000e+01 - 16 - - - 139723007 - 66 - - - play - - - - play_blue - - - - 200 - 25 - - - - - 288 - {{66, 6}, {20, 20}} - - YES - - 604634624 - 134217728 - - - - 138674431 - 130 - - - skip_forward_active - - - - skip_forward_blue - - - - - - 200 - 25 - - - - {97, 32} - - - - YES - - - 129 - 2 - {{110, 267}, {549, 87}} - -260571136 - Window - VLCFullScreenControllerWindow - - View - - {3.40282e+38, 3.40282e+38} - {213, 5} - - - 256 - - YES - - - 256 - - YES - - YES - - - - - - - - - {549, 87} - - - YES - - 130560 - 33554432 - - - fs_background - - 2 - 2 - 0 - NO - - YES - - - - 256 - - YES - - YES - - - - - - - - - {{313, 14}, {43, 19}} - - - YES - - 130560 - 33554432 - 2 - 2 - 0 - NO - - YES - - - - 256 - {{98, 64}, {352, 14}} - - - YES - - 67239424 - 138412032 - VLC Full Screen.avi - - - - - 6 - - headerColor - - - - - - - 256 - {{486, 64}, {50, 14}} - - - YES - - 67239424 - 71303168 - 1:23:45 - - - - - - - - - 256 - - YES - - YES - - - - - - - - - {{124, 17}, {15, 13}} - - - YES - - 130560 - 33554432 - - - fs_volume_max - - 2 - 2 - 0 - NO - - YES - - - - 256 - - YES - - YES - - - - - - - - - {{16, 18}, {7, 11}} - - - YES - - 130560 - 33554432 - - - fs_volume_mute - - 2 - 2 - 0 - NO - - YES - - - - 268 - {{25, 16}, {96, 15}} - - - YES - - -2080244224 - 131072 - - - - 1.024000e+03 - 0.000000e+00 - 2.530864e+01 - 0.000000e+00 - 0 - 1 - NO - NO - - - - - 268 - {{14, 45}, {521, 21}} - - - YES - - -2080244224 - 0 - - - - 1.000000e+04 - 0.000000e+00 - 2.130000e+01 - 0.000000e+00 - 0 - 1 - NO - NO - - - - - 268 - {{325, 7}, {55, 32}} - - - YES - - 67239424 - 134217728 - Button - - - 1.300000e+01 - 1044 - - - -2042347265 - 1 - - - fs_forward - - - - fs_forward_highlight - - - - 200 - 25 - - - - - 268 - {{267, 7}, {55, 32}} - - - YES - - -2080244224 - 134217728 - - - - -2041822977 - 1 - - - fs_play - - - - fs_play_highlight - - - - 200 - 25 - - - - - 268 - {{207, 6}, {55, 32}} - - - YES - - -2080244224 - 134217728 - - - - -2041822977 - 1 - - - fs_rewind - - - - fs_rewind_highlight - - - - 200 - 25 - - - - - 288 - {{505, 13}, {25, 25}} - - - YES - - 67239424 - 134217728 - - - - -931905281 - 2 - - - fs_exit_fullscreen_highlight - - - - fs_exit_fullscreen - - - - 400 - 75 - - - - - 288 - {{458, 13}, {40, 25}} - - - YES - - -2079719936 - 134348800 - - - - 914637055 - 163 - - - 400 - 75 - - - - {549, 87} - - - - {{0, 0}, {1280, 778}} - {213, 27} - {3.40282e+38, 3.40282e+38} - - - VLCMediaPlayer - - - - YES - metaDictionary.title - @count - metaDictionary.stateAsImage - stateAsImage - se - count - firstIndex - intValue - filterPredicate - desc - - YES - - YES - YES - YES - YES - YES - - - VLCMainWindowController - - - - - YES - - - initialFirstResponder - - - - 58 - - - - mediaPositionSlider - - - - 421 - - - - mediaPlayerPlayPauseStopButton - - - - 440 - - - - mediaPlayerForwardNextButton - - - - 441 - - - - mediaPlayerBackwardPrevButton - - - - 442 - - - - mediaReadingProgressText - - - - 447 - - - - mediaDescriptionText - - - - 448 - - - - volumeSlider - - - - 449 - - - - fullScreenButton - - - - 454 - - - - fillScreenButton - - - - 456 - - - - value: audio.volume - - - - - - - value - audio.volume - 2 - - - 507 - - - - window - - - - 515 - - - - - - - - 516 - - - - - - - - 517 - - - - - - - - 518 - - - - value: mediaPlayer.audio.volume - - - - - - - - mediaPlayer.audio.volume - 2 - - - 522 - - - - mediaPlayer - - - - 525 - - - - value: navigatorViewVisible - - - - - - - - navigatorViewVisible - 2 - - - 527 - - - - videoView - - - - 537 - - - - - - - - - - - - - 2 - - - 541 - - - - mainWindowController - - - - 545 - - - - toolbarMediaAudioVolume - - - - 547 - - - - toolbarMediaControl - - - - 548 - - - - toolbarMediaDescription - - - - 549 - - - - delegate - - - - 561 - - - - dataSource - - - - 562 - - - - controller - - - - 579 - - - - - - - - 585 - - - - categoriesListView - - - - 586 - - - - displayPatternValue1: arrangedObjects.@count - - - - - - - displayPatternValue1 - arrangedObjects.@count - - YES - - YES - NSDisplayPattern - NSMultipleValuesPlaceholder - NSNoSelectionPlaceholder - NSNotApplicablePlaceholder - NSNullPlaceholder - NSRaisesForNotApplicableKeys - - - YES - - - - - - - - - 2 - - - 621 - - - - representedFilename: mediaPlayer.media.url - - - - - - - representedFilename - mediaPlayer.media.url - - NSValueTransformerName - URLToRepresentedFileNameTransformer - - 2 - - - 630 - - - - title: mediaPlayer.description - - - - - - - - mediaPlayer.description - - 2 - - - 633 - - - - mainSplitView - - - - 682 - - - - mediaListView - - - - 683 - - - - content: arrangedObjects - - - - - - - content - arrangedObjects - 2 - - - 684 - - - - value: arrangedObjects.metaDictionary.title - - - - - - - - arrangedObjects.metaDictionary.title - - YES - - YES - NSAllowsEditingMultipleValuesSelection - NSAlwaysPresentsApplicationModalAlerts - NSConditionallySetsEditable - NSConditionallySetsEnabled - NSContinuouslyUpdatesValue - NSCreatesSortDescriptor - - - - - - NSValidatesImmediately - - - YES - - - - - - - - - - No Title - - - - - 2 - - - 687 - - - - mediaArrayController - - - - 688 - - - - - - - - 689 - - - - - - - - 690 - - - - selectionIndexes: selectionIndexes - - - - - - - selectionIndexes - - - 2 - - - 692 - - - - predicate: filterPredicate - - - - - - - predicate - - - YES - - YES - - NSDisplayName - NSPredicateFormat - - - - - YES - - - metaDictionary.title contains[c] $value - - - - - 2 - - - 696 - - - - value: mediaPlayer.time.stringValue - - - - - - - - mediaPlayer.time.stringValue - 2 - - - 699 - - - - value: mediaPlayer.position - - - - - - - - mediaPlayer.position - - - Float10000FoldTransformer - - 2 - - - 702 - - - - enabled: mediaPlayer.media - - - - - - - enabled - mediaPlayer.media - - YES - - YES - - - - - YES - - NSIsNotNil - - - 2 - - - 710 - - - - enabled2: mediaPlayer.seekable - - - - - - - enabled2 - mediaPlayer.seekable - - YES - - YES - - - - - - - YES - - - - - - - - 2 - - - 713 - - - - - - - - - - - - - - - - - 2 - - - 716 - - - - displayPatternValue2: arrangedObjects.@count - - - - - - - displayPatternValue2 - - - - - - - 2 - - - 717 - - - - value: videoView.videoLayer.fillScreen - - - - - - - - videoView.videoLayer.fillScreen - 2 - - - 718 - - - - value: videoView.fullScreen - - - - - - - - videoView.fullScreen - 2 - - - 720 - - - - hidden: categoriesTreeController.selection.currentlyFetchingItems - - - - - - - hidden - categoriesTreeController.selection.currentlyFetchingItems - - NSValueTransformerName - NSNegateBoolean - - 2 - - - 734 - - - - animate: categoriesTreeController.selection.currentlyFetchingItems - - - - - - - animate - categoriesTreeController.selection.currentlyFetchingItems - 2 - - - 738 - - - - - YES - - 0 - - YES - - - - - - -2 - - - RmlsZSdzIE93bmVyA - - - -1 - - - First Responder - - - -3 - - - Application - - - 3 - - - YES - - - - - - - - 4 - - - YES - - - - - - - - - - - - - 289 - - - YES - - - - - ToolbarMediaDescription - - - 291 - - - YES - - - - - - - 293 - - - YES - - - - mediaReadingProgressSlider - - - 310 - - - - - 312 - - - - - 314 - - - YES - - - - - - - - - ToolbarMediaAudioVolume - - - 315 - - - YES - - - - audioVolumeSlider - - - 316 - - - YES - - - - - - 317 - - - YES - - - - - - - 319 - - - YES - - - - playlistToggleButton - - - 320 - - - YES - - - - - - 322 - - - YES - - - - - - - 331 - - - - - 333 - - - - - 334 - - - - - 336 - - - - - 337 - - - - - 338 - - - - - 339 - - - YES - - - - - - ToolbarMediaControl - - - 343 - - - YES - - - - - - 346 - - - YES - - - - - - 351 - - - YES - - - - - - 352 - - - - - 357 - - - - - 360 - - - - - 373 - - - - - 393 - - - YES - - - - FullScreenControllerWindow - - - 394 - - - YES - - - - - - - - - - - - - - - - - - 395 - - - YES - - - - - - 396 - - - YES - - - - - - 398 - - - YES - - - - - - 403 - - - YES - - - - - - 404 - - - YES - - - - - - 405 - - - YES - - - - - - 406 - - - YES - - - - - - 407 - - - YES - - - - - - 408 - - - - - 409 - - - - - 410 - - - - - 411 - - - - - 412 - - - - - 417 - - - - - 419 - - - - - 420 - - - - - 424 - - - - - 428 - - - YES - - - - - - 429 - - - - - 430 - - - YES - - - - - - 431 - - - - - 432 - - - YES - - - - - - 433 - - - - - 450 - - - YES - - - - - - - 451 - - - YES - - - - - - - 452 - - - - - 453 - - - - - 508 - - - - - 513 - - - - - 553 - - - YES - - - - - - - 558 - - - - - 559 - - - - - 491 - - - YES - - - - - - 494 - - - - - 502 - - - YES - - - - - - 503 - - - - - 486 - - - YES - - - - - - 487 - - - - - 490 - - - YES - - - - - - 495 - - - - - 492 - - - YES - - - - - - 493 - - - - - 674 - - - - - 675 - - - YES - - - - - - 676 - - - - - 681 - - - YES - - - - - - - 192 - - - - - 671 - - - YES - - - - - - - 670 - - - YES - - - - - - - - 648 - - - YES - - - - - - - - - 659 - - - - - 651 - - - YES - - - - - - - 650 - - - - - 649 - - - - - 654 - - - YES - - - - - - 653 - - - YES - - - - - - 660 - - - - - 655 - - - - - 172 - - - YES - - - - - - - - 666 - - - YES - - - - - - 668 - - - YES - - - - - - 669 - - - - - 667 - - - - - 173 - - - - - 174 - - - - - 175 - - - YES - - - - - - 176 - - - YES - - - - - - 177 - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 172.IBPluginDependency - 172.ImportedFromIB2 - 173.IBShouldRemoveOnLegacySave - 174.IBShouldRemoveOnLegacySave - 175.IBPluginDependency - 175.ImportedFromIB2 - 176.IBPluginDependency - 176.ImportedFromIB2 - 177.IBShouldRemoveOnLegacySave - 192.IBPluginDependency - 289.editorWindowContentRectSynchronizationRect - 291.IBPluginDependency - 291.ImportedFromIB2 - 293.IBPluginDependency - 293.ImportedFromIB2 - 3.IBPluginDependency - 3.IBWindowTemplateEditedContentRect - 3.ImportedFromIB2 - 3.NSWindowTemplate.visibleAtLaunch - 3.editorWindowContentRectSynchronizationRect - 3.windowTemplate.hasMinSize - 3.windowTemplate.minSize - 314.IBViewEditorWindowController.showingLayoutRectangles - 314.editorWindowContentRectSynchronizationRect - 315.IBPluginDependency - 315.ImportedFromIB2 - 316.IBPluginDependency - 316.ImportedFromIB2 - 317.IBPluginDependency - 317.ImportedFromIB2 - 319.IBPluginDependency - 319.ImportedFromIB2 - 320.IBPluginDependency - 320.ImportedFromIB2 - 322.IBPluginDependency - 322.ImportedFromIB2 - 339.editorWindowContentRectSynchronizationRect - 343.IBPluginDependency - 343.ImportedFromIB2 - 346.IBPluginDependency - 346.ImportedFromIB2 - 351.IBPluginDependency - 351.ImportedFromIB2 - 393.IBPluginDependency - 393.IBWindowTemplateEditedContentRect - 393.ImportedFromIB2 - 393.editorWindowContentRectSynchronizationRect - 393.windowTemplate.hasMaxSize - 393.windowTemplate.hasMinSize - 393.windowTemplate.maxSize - 393.windowTemplate.minSize - 394.IBPluginDependency - 394.ImportedFromIB2 - 395.CustomClassName - 395.IBPluginDependency - 396.CustomClassName - 396.IBPluginDependency - 398.IBPluginDependency - 398.ImportedFromIB2 - 4.IBPluginDependency - 4.ImportedFromIB2 - 403.IBPluginDependency - 403.ImportedFromIB2 - 404.IBPluginDependency - 404.ImportedFromIB2 - 405.IBPluginDependency - 405.ImportedFromIB2 - 406.IBPluginDependency - 406.ImportedFromIB2 - 407.IBPluginDependency - 407.ImportedFromIB2 - 419.IBPluginDependency - 420.IBPluginDependency - 424.IBPluginDependency - 428.IBPluginDependency - 429.IBPluginDependency - 430.IBPluginDependency - 431.IBPluginDependency - 432.IBPluginDependency - 433.IBPluginDependency - 450.IBPluginDependency - 450.ImportedFromIB2 - 451.IBPluginDependency - 451.ImportedFromIB2 - 486.IBPluginDependency - 487.IBPluginDependency - 490.IBPluginDependency - 490.ImportedFromIB2 - 491.IBPluginDependency - 492.IBPluginDependency - 492.ImportedFromIB2 - 494.IBPluginDependency - 502.IBPluginDependency - 502.ImportedFromIB2 - 508.CustomClassName - 508.IBPluginDependency - 513.IBPluginDependency - 553.IBPluginDependency - 553.editorWindowContentRectSynchronizationRect - 558.IBPluginDependency - 559.IBPluginDependency - 648.IBPluginDependency - 649.IBPluginDependency - 650.IBPluginDependency - 651.IBPluginDependency - 653.IBPluginDependency - 654.IBPluginDependency - 655.IBPluginDependency - 660.IBPluginDependency - 666.IBPluginDependency - 667.IBPluginDependency - 668.IBPluginDependency - 669.IBPluginDependency - 674.IBPluginDependency - 674.ImportedFromIB2 - 675.IBPluginDependency - 676.IBPluginDependency - 681.CustomClassName - - - YES - - - - - - - - - - - - - - {{200, 676}, {192, 15}} - - - - - - {{76, 341}, {725, 396}} - - - {{76, 341}, {725, 396}} - - {372, 300} - - {{176, 555}, {274, 23}} - - - - - - - - - - - - - {{144, 644}, {97, 32}} - - - - - - - - {{170, 364}, {549, 87}} - - - - - {3.40282e+38, 3.40282e+38} - {213, 5} - - - VLCImageCustomizedSlider - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VLCMediaArrayController - - - - {{163, 790}, {617, 0}} - - - - - - - - - - - - - - - - - - - VLCOneSplitView - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 738 - - - - YES - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - IBProjectSource - Sources/VLCAppAdditions.h - - - - - VLCVideoView - - YES - - YES - moveDown: - moveUp: - - - YES - id - - - - - YES - - YES - - - YES - - - - IBUserSource - - - - - VLCBrowsableVideoView - - - backToMediaListView: - id - - - YES - - YES - mainWindowController - selectedObject - target - - - YES - VLCMainWindowController - - - - - - - Sources/VLCBrowsableVideoView.h - - - - VLCMediaArrayController - NSArrayController - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - Sources/VLCMediaArrayController.h - - - - VLCFullScreenControllerWindow - NSPanel - - YES - - YES - - - YES - - - - YES - - YES - fillScreenButton - fullScreenButton - mainWindowController - mediaDescriptionText - mediaPlayerBackwardPrevButton - mediaPlayerForwardNextButton - mediaPlayerPlayPauseStopButton - mediaPositionSlider - mediaReadingProgressText - volumeSlider - - - YES - - - VLCMainWindowController - NSTextField - NSButton - - - VLCImageCustomizedSlider - - VLCImageCustomizedSlider - - - - - Sources/VLCFullScreenControllerWindow.h - - - - VLCOneSplitView - NSSplitView - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - Sources/VLCAppAdditions.h - - - - VLCMainWindow - NSWindow - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - Sources/VLCMainWindow.h - - - - VLCMainWindowController - NSWindowController - - YES - - YES - mediaListViewItemDoubleClicked: - videoViewItemClicked: - - - YES - - - - - - YES - - YES - addPlaylistButton - categoriesListView - controller - mainSplitView - mediaArrayController - mediaListView - mediaPlayer - mediaPlayerBackwardPrevButton - mediaPlayerForwardNextButton - mediaPlayerPlayPauseStopButton - removePlaylistButton - toolbarMediaAudioVolume - toolbarMediaControl - toolbarMediaDescription - videoView - - - YES - - NSOutlineView - VLCController - VLCOneSplitView - VLCMediaArrayController - NSTableView - VLCMediaPlayer - - - - - - - - VLCBrowsableVideoView - - - - - Sources/VLCMainWindowController.h - - - - VLCImageCustomizedSlider - NSSlider - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - Sources/VLCAppAdditions.h - - - - NSImageView - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - Sources/VLCAppAdditions.h - - - - VLCController - NSObject - - YES - - YES - addPlaylist: - newMainWindow: - - - YES - - - - - - YES - - YES - - - YES - - - - - Sources/VLCController.h - - - - VLCMediaPlayer - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - Sources/VLCAppBindings.h - - - - - 0 - ../../VLC.xcodeproj - 3 - - YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEDVQALAAwAMQA1ADYAPAA9 -AEIAWgBbAFwAXQB2AHoAfgCHAIgAiQCHAKsArACtAK4ArwCrAMEAxgDHAMgAywDPANAA0wDWAIgA5gDn -AOgA6QDxAPMA9wD8AP8BBAEHAQoBDQEOAAsBHAEnATMBNACrAU0BVQFWAVkBXQFjAWwBbQF6AXsBgAGB -AYsBjAGNAZIBlAGZAZoBnQGgAaMBrAGtAcIBxgHHAcoBzQHaAeMB5AHlAeYB5wHoAekB7QHuAfgB/AH9 -AgACAwINAhYCFwIbAh8CIAItAi8CMgIzAjYCPgI/AlECVgJXAloCZgJnAmgCcQJyAnYCfgJ/AoAAbwKB -AoIChQKIApYClwKYAp0CpAKlAqYCqQKwArUCvQLDAssCzALVAtkC2gLiAuMC6wLvAvADAwMJAxgDHAM7 -AzwDQQNCA0UDSQNeA2UDaANtA24DcQN6A3sDgAOBA4cDiAOLA44DkwOUA5cDmgObA54DqAOpA6oDrQO2 -A7cDuAO7AWEDvAPMA9QD3gPiA/ID8wP6BAQEBQQIBA4EDwQUBB4EHwQlBCcELQQ1BDYEOgCaBD8ESgRL -BEwEUARTBFUEWQRjBGQEagRzBHUEdgR/BIAEiQSKBI4EjwSQBJEEkwSUBJcACwSYBJoEmwScBJ8E1QTd -BOAE4QTpBPAE8QT/BQQFCAUJBQ0FDgUQBREFFQUaBSoFKwUsBS0FMAUxBTIACwU5BUkFUwVcBV0FYQVl -BWYFcAV5BXoFfQWFBYYFjgWPBZQFlQWdBZ4FpgWnBbEFugW7Bb8FwwXEBc4F1wXYBdwF4AXhBewBXwXt -Be4F9wFfBgEGAgYLBg8GEAYYBhkGIwYkBikGLQYuBjIGMwY7BjwGRgZKBksGTwZQBlgGWQZiBmYGZwZr -BmwGdAZ1Bn8GgwaEBogGiQaRBpIGnAVcAAsEmgadBTAGngafBqQGqQaqBq8GsgazBrQGuQa6Br8ACwbH -BswG1AbVBt4G3wbjBusG7Ab0BvYACwb3BvgG/Qb+BwMHBAcJBxwHHQceBysHLActBy4HLwcwBzEHMgcz -BzQHNQc3BzkHOgc/B0AHRQdMB00HWAdbB18HYAdkB2UHZgdrB2wHcQd2B3cHfAd9B4IHiAePB5AHmQed -B54HogejB6UHpgenB6wHsQeyB7cHvAe9B8IHxwfIB80H0gfTB9gH2QfeB98H5AflB+oACwfyB/sIAwgE -CA8IEwgUCBgIGQgaCCIIIwgtCC8INwg4CEEIQghKCEsIUwhUCFwIXQhmCGgIcAhxCHkIewALCHwIfQiC -CIMIjQiOCI8IkAiTCJwInQieCJ8IpQimCKcIqQixCLIIswjBCMIIwwjECMUIxgjHCM8I0AjRCNII4gjj -COQI5QjmCOcI7wjwCPEI8gj6CPsJBQkGCQcJCACmCRQJHAkdCI8JHgilCSQJJQksCS0JLgk1CTYJNwk/ -CUUJTglPCVAJVgldCV4JXwlmCWcJaAlvCXAJcQl4CX8JgAmBCYkJigmLCacJqAmpCaoJqwmsCa0JtAm1 -CbYJtwm/CcAJwQnJCcoJywnMCdIJ0wnbCdwJ3QpDCkcKSwpOCk8KtQscC4MLhAuFC4YLhwuIC4kLiguL -C4wLjQuOC48LkAuRC5ILkwuUC5ULlguXC5gLmQuaC5sLnAudC54LnwugC6ELogujC6QLpQumC6cLqAup -C6oLqwusC60LrguvC7ALsQuyC7MLtAu1C7YLtwu4C7kLugu7C7wLvQu+C78LwAvBC8ILwwvEC8ULxgvH -C8gLyQvKC8sLzAvNC84LzwvQC9EL0gvTC9QL1QvWC9cL2AvZC9oL2wvcC90L3gvfC+AL4QviC+ML6gvx -DIsNJQ0mDScNKA0pDSoNKw0sDS0NLg0vDTANMQ0yDTMNNA01DTYNNw04DTkNOg07DTwNPQ0+DT8NQA1B -DUINQw1EDUUNRg1HDUgNSQ1KDUsDwg1MDU0NTg1PDVANUQ1SDVMNVAGoDVUNVg1XDVgNWQ1aDVsNXA1d -DV4NXw1gDWENYg1jDWQNZQ1mDWcNaA1pDWoNaw1sDW0NbgGQDW8NcA1xDXINcw10DXUNdg13DXgNeQ16 -DXsNfA19DX4Nfw2ADYENgg2DDYQNhQ2GDYcNiA2JDYoNiw2MDY0Njg2PDZANkQ2SDZMNlA2VDZYNlw2Y -DZkNmg2bDZwNnQ2eDZ8NoA2hDaINow2kDaUNpg2nDagNqQ2qDasNrA2tDa4Nrw2wDbENsgMQDbMNtA21 -DbYNtw24DbsNvg3BVSRudWxs3xASAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8A -IAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwVk5TUm9vdFYkY2xhc3NdTlNPYmplY3RzS2V5 -c18QD05TQ2xhc3Nlc1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0eU9pZHNWYWx1ZXNdTlNDb25uZWN0aW9u -c1tOU05hbWVzS2V5c1tOU0ZyYW1ld29ya11OU0NsYXNzZXNLZXlzWk5TT2lkc0tleXNdTlNOYW1lc1Zh -bHVlc18QGU5TQWNjZXNzaWJpbGl0eUNvbm5lY3RvcnNdTlNGb250TWFuYWdlcl8QEE5TVmlzaWJsZVdp -bmRvd3NfEA9OU09iamVjdHNWYWx1ZXNfEBdOU0FjY2Vzc2liaWxpdHlPaWRzS2V5c1lOU05leHRPaWRc -TlNPaWRzVmFsdWVzgAKBA1SBAk6BAreBA1OA9IECVIAFgQK2gQK4gQJVgQNRgACABoECU4EDUhEC5IEC -udIADgAyADMANFtOU0NsYXNzTmFtZYAEgANdVkxDQ29udHJvbGxlctIANwA4ADkAOlgkY2xhc3Nlc1ok -Y2xhc3NuYW1logA6ADteTlNDdXN0b21PYmplY3RYTlNPYmplY3RfEBBJQkNvY29hRnJhbWV3b3Jr0gAO -AD4APwBAWk5TLm9iamVjdHOAW6EAQYAH3ABDAA4ARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIA -UwBUAFUAVgBXAFgAWVxOU1dpbmRvd1ZpZXdcTlNTY3JlZW5SZWN0XU5TV2luZG93VGl0bGVZTlNXVEZs -YWdzXU5TV2luZG93Q2xhc3NfEBZOU1dpbmRvd0NvbnRlbnRNaW5TaXplXE5TV2luZG93UmVjdF8QD05T -V2luZG93QmFja2luZ18QEU5TV2luZG93U3R5bGVNYXNrWU5TTWluU2l6ZVtOU1ZpZXdDbGFzc4AwgPOA -8YAJEjB4AACACoAvgAgQAhERD4DygAtfEBd7ezQwLCAzMTZ9LCB7NzI1LCAzOTZ9fVNWTENdVkxDTWFp -bldpbmRvd90ADgBeAF8AYABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwACsAbgBuAHQAVgB1 -XxAXTlNUb29sYmFySUJEZWZhdWx0SXRlbXNfEB9OU1Rvb2xiYXJTaG93c0Jhc2VsaW5lU2VwYXJhdG9y -XxAXTlNUb29sYmFySUJBbGxvd2VkSXRlbXNfEB9OU1Rvb2xiYXJBdXRvc2F2ZXNDb25maWd1cmF0aW9u -XxARTlNUb29sYmFyU2l6ZU1vZGVfEBpOU1Rvb2xiYXJJQklkZW50aWZpZWRJdGVtc18QEU5TVG9vbGJh -ckRlbGVnYXRlXxAZTlNUb29sYmFyUHJlZmVyc1RvQmVTaG93bl8QIE5TVG9vbGJhckFsbG93c1VzZXJD -dXN0b21pemF0aW9uXxAaTlNUb29sYmFySUJTZWxlY3RhYmxlSXRlbXNfEBROU1Rvb2xiYXJEaXNwbGF5 -TW9kZV8QE05TVG9vbGJhcklkZW50aWZpZXKALoArCIApCRABgA6AAAkJgC2ADNIADgB3AHgAeVlOUy5z -dHJpbmeADV8QJEQ3NjI2QTlFLTNCOEItNEUzRi05M0FDLUZDNjM0Q0Q3NDA2M9IANwA4AHsAfKMAfAB9 -ADtfEA9OU011dGFibGVTdHJpbmdYTlNTdHJpbmfTAA4AfwA+AIAAgQCEV05TLmtleXOAKKIAggCDgA+A -EKIAhQCGgBGAIV8QGk5TVG9vbGJhckZsZXhpYmxlU3BhY2VJdGVtXxASTlNUb29sYmFyU3BhY2VJdGVt -3xARAIoADgCLAIwAjQCOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAnAArAG4AKwBuACsAbgCjAKQA -KwCmAKcAqACpACtfEB9OU1Rvb2xiYXJJdGVtVmlzaWJpbGl0eVByaW9yaXR5XxAjTlNUb29sYmFySXRl -bU1lbnVGb3JtUmVwcmVzZW50YXRpb25fEBFOU1Rvb2xiYXJJdGVtVmlld18QFE5TVG9vbGJhckl0ZW1F -bmFibGVkXxATTlNUb29sYmFySXRlbUFjdGlvbl8QGE5TVG9vbGJhcklzVXNlclJlbW92YWJsZV8QE05T -VG9vbGJhckl0ZW1UYXJnZXRfEBpOU1Rvb2xiYXJJdGVtQXV0b3ZhbGlkYXRlc18QF05TVG9vbGJhckl0 -ZW1JZGVudGlmaWVyXxAZTlNUb29sYmFySXRlbVBhbGV0dGVMYWJlbF8QFE5TVG9vbGJhckl0ZW1Ub29s -VGlwXxAQTlNUb29sYmFySXRlbVRhZ18QFE5TVG9vbGJhckl0ZW1NYXhTaXplXxAUTlNUb29sYmFySXRl -bU1pblNpemVfEBJOU1Rvb2xiYXJJdGVtTGFiZWxfEBJOU1Rvb2xiYXJJdGVtSW1hZ2UQAIAggBeAAAmA -AAmAAAmAEoAUgAAT//////////+AFoAVgBOAAFBeRmxleGlibGUgU3BhY2VWezEsIDV9W3syMDAwMCwg -MzJ92QAOALAAsQCyALMAtAC1ALYAtwC4ALkAugBuALkAbgC+AL8AwFdOU1RpdGxlXxARTlNLZXlFcXVp -dk1vZE1hc2tdTlNJc1NlcGFyYXRvclpOU0tleUVxdWl2XE5TSXNEaXNhYmxlZF1OU01uZW1vbmljTG9j -WU5TT25JbWFnZVxOU01peGVkSW1hZ2WAH4AYEgAQAAAJgBgJEn////+AGYAd0wAOADIAwgDDAMQAxV5O -U1Jlc291cmNlTmFtZYAcgBqAG1dOU0ltYWdlXxAPTlNNZW51Q2hlY2ttYXJr0gA3ADgAyQDKogDKADtf -EBBOU0N1c3RvbVJlc291cmNl0wAOADIAwgDDAMQAzoAcgBqAHl8QEE5TTWVudU1peGVkU3RhdGXSADcA -OADRANKiANIAO1pOU01lbnVJdGVt0gA3ADgA1ACHowCHANUAO11OU1Rvb2xiYXJJdGVt3xARAIoADgCL -AIwAjQCOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaANcA2AArAG4AKwBuACsAbgDfAOAAKwCmAOIA4wCp -ACuAJ4AmgAAJgAAJgAAJgCKAI4AAgCWAJIATgABVU3BhY2VXezMyLCA1fVh7MzIsIDMyfdkADgCwALEA -sgCzALQAtQC2ALcAuAC5ALoAbgC5AG4AvgC/AMCAH4AYCYAYCYAZgB3SADcAOADyAIijAIgA1QA70gA3 -ADgA9AD1owD1APYAO18QE05TTXV0YWJsZURpY3Rpb25hcnlcTlNEaWN0aW9uYXJ50gAOAD4A+AD5gCqi -AIYAhYAhgBHSADcAOAD9AP6iAP4AO1dOU0FycmF50gAOAD4BAAEBgCyiAIYAhYAhgBHSADcAOAEFAQaj -AQYA/gA7Xk5TTXV0YWJsZUFycmF50gAOAD4BAAEJgCyg0gA3ADgBCwEMogEMADtZTlNUb29sYmFyWnsz -NzIsIDMwMH3XAQ8ADgEQAREBEgETARQBFQEWARcBGAEZARUBG18QD05TTmV4dFJlc3BvbmRlclpOU1N1 -YnZpZXdzWE5TdkZsYWdzW05TRnJhbWVTaXplWE5TV2luZG93W05TU3VwZXJ2aWV3gDGA8IAyESESgO6A -MYDv0gAOAD4BAAEegCyoAR8BIAEhASIBIwEkASUBJoAzgDyATIBTgGKAaIBtgIHYAQ8ADgEoASkBEQEq -ARMBFABOASwBLQEuAS8AbgEVAE5XTlNGcmFtZVZOU0NlbGxZTlNFbmFibGVkgDCAO4A0gDURASQJgDGA -MF8QE3t7MjIsIDd9LCB7OTYsIDEyfX3eATUBNgAOATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRACa -AG8BRQFGAR8BSAFJAUoAbAFJAGxXTlNWYWx1ZVtOU0NlbGxGbGFnc18QE05TTnVtYmVyT2ZUaWNrTWFy -a3NfEBJOU1RpY2tNYXJrUG9zaXRpb25aTlNDb250ZW50c1lOU1N1cHBvcnRdTlNDb250cm9sVmlld1pO -U01heFZhbHVlWk5TTWluVmFsdWVcTlNDZWxsRmxhZ3MyWk5TVmVydGljYWxdTlNBbHRJbmNWYWx1ZV8Q -Gk5TQWxsb3dzVGlja01hcmtWYWx1ZXNPbmx5I0A5TwMH8jzJE/////+EBf8AgDqANoA3gDMjQJAAAAAA -AAAjAAAAAAAAAAASAAQAAAgI1AAOAU4BTwFQAVEBUgFTAVRWTlNTaXplVk5TTmFtZVhOU2ZGbGFnc4A5 -I0AiAAAAAAAAgDgRDh5cTHVjaWRhR3JhbmRl0gA3ADgBVwFYogFYADtWTlNGb2500gA3ADgBWgFbpAFb -AVwBKQA7XE5TU2xpZGVyQ2VsbFxOU0FjdGlvbkNlbGzSADcAOAFeAV+lAV8BYAFhAWIAO1hOU1NsaWRl -cllOU0NvbnRyb2xWTlNWaWV3W05TUmVzcG9uZGVy2AEPAA4BKAEpAREBKgETARQATgFlAWYBZwFoAG4B -FQBOgDCAS4A9gD4RASIJgDGAMF8QFXt7MTQ2LCA2fSwgezQzOCwgMTR9fdkBNgAOAW4BOQE6ATsBPgFv -AXABcQFyAXMBdAF1ASABdwF4AXlfEBFOU0JhY2tncm91bmRDb2xvcl8QE05TUGxhY2Vob2xkZXJTdHJp -bmdbTlNUZXh0Q29sb3ISBAH+QIBKgEKAP4BAgDwSCEIEAIBBgEdfEBAle3ZhbHVlMX1AIGl0ZW1z1AAO -AU4BTwFQAVEBfQFTAX+AOSNAJgAAAAAAAIA4EQwcVG5hbWXVAA4BggGDAYQBhQGGAYcBiAGJAYpXTlND -b2xvclxOU0NvbG9yU3BhY2VbTlNDb2xvck5hbWVdTlNDYXRhbG9nTmFtZYBGgEUQBoBEgENWU3lzdGVt -XGNvbnRyb2xDb2xvctMADgGDAY4BhgGQAZFXTlNXaGl0ZYBGEANLMC42NjY2NjY2OQDSADcAOAGTAYKi -AYIAO9UADgGCAYMBhAGFAYYBlgGIAZcBioBGgEmASIBDXxAQY29udHJvbFRleHRDb2xvctMADgGDAY4B -hgGQAZyARkIwANIANwA4AZ4Bn6QBnwFcASkAO18QD05TVGV4dEZpZWxkQ2VsbNIANwA4AaEBoqUBogFg -AWEBYgA7W05TVGV4dEZpZWxk2AEPAA4BKAEpAREBKgETARQATgGlAaYBpwGoAG4BFQBOgDCAUoBNgE4R -ASEJgDGAMF8QFHt7Njg0LCAzfSwgezE5LCAxOH193QE2AA4BrgGvAbABsQGyATkBOgE7AbMBPgG0AbUB -tgFFAbgBuQG6AUUBRQF1ASEBvwHAAcFfEBNOU0FsdGVybmF0ZUNvbnRlbnRzXU5TTm9ybWFsSW1hZ2Vf -EBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNCdXR0b25GbGFnczJfEA9OU0tleUVxdWl2YWxlbnRfEA9OU1Bl -cmlvZGljRGVsYXldTlNCdXR0b25GbGFncxIEAf4AgFGANoBPEBkQIIA2gDaAQIBMEMgSCAIAABP///// -tsRA/9MADgAyAMIAwwDEAcWAHIAagFBfEBJOU0xpc3RWaWV3VGVtcGxhdGXSADcAOAHIAcmkAckBXAEp -ADtcTlNCdXR0b25DZWxs0gA3ADgBywHMpQHMAWABYQFiADtYTlNCdXR0b27aAQ8ADgEoAc4BKQHPAREB -KgETARQATgHRAdIAbgHUAdUB1gBuARUATlpOU0VkaXRhYmxlW05TRHJhZ1R5cGVzgDCAYYBcCYBdgFQR -AQAJgDGAMNIADgA+AD8B3IBbpgHdAd4B3wHgAeEB4oBVgFaAV4BYgFmAWl8QGUFwcGxlIFBERiBwYXN0 -ZWJvYXJkIHR5cGVfEBlBcHBsZSBQTkcgcGFzdGVib2FyZCB0eXBlXxAVTlNGaWxlbmFtZXNQYm9hcmRU -eXBlXxAxTmVYVCBFbmNhcHN1bGF0ZWQgUG9zdFNjcmlwdCB2MS4yIHBhc3RlYm9hcmQgdHlwZV8QHk5l -WFQgVElGRiB2NC4wIHBhc3RlYm9hcmQgdHlwZV8QGkFwcGxlIFBJQ1QgcGFzdGVib2FyZCB0eXBl0gA3 -ADgB6gHrowHrAewAO1xOU011dGFibGVTZXRVTlNTZXRfEBF7ezcsIDd9LCB7NywgMTF9fdgBNgAOAe8B -OQHwAfEBPgHyAfMB9ACaAfUAVgBWAfYAbFdOU1N0eWxlV05TQWxpZ25XTlNTY2FsZVpOU0FuaW1hdGVz -EgAB/gCAYIBeEgIAAAAI0wAOADIAwgDDAMQB+4AcgBqAX1p2b2x1bWVfbG930gA3ADgB/gH/owH/ASkA -O1tOU0ltYWdlQ2VsbNIANwA4AgECAqUCAgFgAWEBYgA7W05TSW1hZ2VWaWV32gEPAA4BKAHOASkBzwER -ASoBEwEUAE4B0QIGAG4CCAIJAdYAbgEVAE6AMIBhgGQJgGWAYwmAMYAw0gAOAD4APwIPgFumAd0B3gHf -AeAB4QHigFWAVoBXgFiAWYBaXxAUe3sxMjYsIDZ9LCB7MTUsIDEzfX3YATYADgHvATkB8AHxAT4B8gHz -AfQAmgIZAFYAVgH2AGyAYIBmCNMADgAyAMIAwwDEAh6AHIAagGdbdm9sdW1lX2hpZ2jaAQ8ADgEoATwB -PQERARMCIQEUAiIATgIkAiUCJgInAigBFQIqAE4CLFlOU3BpRmxhZ3NcTlNEcmF3TWF0cml4gDCAbIBr -I0BZAAAAAAAAI0AwAAAAAAAAEQUhgDERUQqAMIBp0QAOAi6AatIANwA4AjACMaICMQA7Wk5TUFNNYXRy -aXhfEBR7ezU1NSwgNX0sIHsxNiwgMTZ9fdIANwA4AjQCNaQCNQFhAWIAO18QE05TUHJvZ3Jlc3NJbmRp -Y2F0b3LYAQ8ADgEoASkBEQEqARMBFABOAjgCOQI6AagAbgEVAE6AMICAgG6AbwmAMYAwXxAUe3s1Nzks -IDN9LCB7OTYsIDE5fX3dATYADgJAAW4BOQE6ATsBPgJBAkICQwJEAXACRQJGAkcCSAFFAXUBJQJMAG8A -bgJOAk8BeV8QEk5TQ2FuY2VsQnV0dG9uQ2VsbF8QEE5TVGV4dEJlemVsU3R5bGVfEBFOU0RyYXdzQmFj -a2dyb3VuZF8QEk5TU2VhcmNoQnV0dG9uQ2VsbF8QEE5TTWF4aW11bVJlY2VudHMSFHH+QIB/gHaAcIA2 -gECAbRIQAgQACYBzEP+AR9UADgGCAYMBhAGFAYYCUwGIAlQBioBGgHKAcYBDXxATdGV4dEJhY2tncm91 -bmRDb2xvctMADgGDAY4BhgGQAlmARkIxANwCWwE2AA4BsAGxAbIBOQE7AbMBPgJcAbQCOgHzAbYCXwCa -AUUCYQElAmMAmgJkAmVYTlNUYXJnZXRYTlNBY3Rpb26Ab4BREEuANoB0gG0RAZCAdRIIRED/VnNlYXJj -aF8QE19zZWFyY2hGaWVsZFNlYXJjaDrdAlsBNgAOAbABsQGyAmkBOQE7AbMBPgJcAbQCOgHzAbYCXwCa -AUUCbQJuASUCYwCaAnACZV8QI05TQWNjZXNzaWJpbGl0eU92ZXJyaWRkZW5BdHRyaWJ1dGVzgG+AUYA2 -gHiAd4BtgH5VY2xlYXLSAA4APgEAAnSALKECdYB50wAOAH8APgCAAngCe4AoogJ5AnqAeoB7ogJ8An2A -fIB9XUFYRGVzY3JpcHRpb25fEClOU0FjY2Vzc2liaWxpdHlFbmNvZGVkQXR0cmlidXRlc1ZhbHVlVHlw -ZVZjYW5jZWxfEBNfc2VhcmNoRmllbGRDYW5jZWw60gA3ADgCgwKEpQKEAZ8BXAEpADtfEBFOU1NlYXJj -aEZpZWxkQ2VsbNIANwA4AoYCh6YChwGiAWABYQFiADtdTlNTZWFyY2hGaWVsZNsBDwAOASgCiQEQAREC -igETADIBFAKLAE4CjQKOAo8CkAKRAFYBFQKTAE4Abl8QE05TT3JpZ2luYWxDbGFzc05hbWVeTlNEaXZp -ZGVyU3R5bGVcTlNJc1ZlcnRpY2FsgDCA7YDsgIOAhBEBEoAxgIKAMAlfEA9WTENPbmVTcGxpdFZpZXdb -TlNTcGxpdFZpZXfSAA4APgEAApqALKICmwKcgIWAidcBDwAOAREBEgETADIBFAEmAp8CkQKgARUCogEm -gIGAiICGgDGAh4CBWns0OTYsIDM3MX1fEBVWTENCcm93c2FibGVWaWRlb1ZpZXfSADcAOAKnAqikAqgB -YQFiADtcTlNDdXN0b21WaWV32AEPAA4BKAEQARECigETARQBJgKrAqwCrQKRAFYBFQEmgIGA64DqgIqA -MYCB0gAOAD4BAAKygCyiArMCtICLgL/YAQ8ADgEQAREBEgETADIBFAKcAp8CuAKRArkBFQK7ApyAiYCI -gIyAvYAxgL6AidIADgA+AQACv4AsowLAAsECwoCNgJKAl9gBDwAOASgBKQERASoBEwEUArMBpQLGAscB -LwBuARUCs4CLgFKAjoCPCYAxgItfEBN7ezM2LCAyfSwgezE5LCAxOH193QE2AA4BrgGvAbABsQGyATkB -OgE7AbMBPgG0AbUBtgFFAs8BuQG6AUUBRQF1AsABvwHAAtSAUYA2gJCANoA2gECAjRP/////hsRA/9MA -DgAyAMIAwwDEAtiAHIAagJFfEBBOU1JlbW92ZVRlbXBsYXRl2AEPAA4BKAEpAREBKgETARQCswGlAt0C -3gEvAG4BFQKzgIuAUoCTgJQJgDGAi18QE3t7MTQsIDJ9LCB7MTksIDE4fX3dATYADgGuAa8BsAGxAbIB -OQE6ATsBswE+AbQBtQG2AUUC5gG5AboBRQFFAXUCwQG/AcAC1IBRgDaAlYA2gDaAQICS0wAOADIAwgDD -AMQC7oAcgBqAll1OU0FkZFRlbXBsYXRl3QEPAvEADgEoAvIBEALzAREBEwEUAvQC9QL2ArMC+AL5AvoC -+wL8Av0CkQEVArMDAAMBAwFbTlNIU2Nyb2xsZXJYTlNzRmxhZ3NcTlNTY3JvbGxBbXRzW05TVlNjcm9s -bGVyXU5TTmV4dEtleVZpZXddTlNDb250ZW50Vmlld4CLgLmAvIC7EQISgJhPEBBBIAAAQSAAAEGgAABB -oAAAgDGAi4C1gJmAmdIADgA+AQADBYAsowMBAwAC+ICZgLWAudsBDwAOASgDCgEQAREDCwETAwwBFAL1 -AsIDDgMPAxADEQMSAxMBFQMVAsIDE1lOU2N2RmxhZ3NZTlNEb2NWaWV3WU5TQkdDb2xvcoCXgLSAsxAE -gJoRCQCAm4AxgKmAl4Cb0gAOAD4BAAMagCyhAxOAm98QFAEPAx0ADgMeAx8BbgMgAyEDIgMjAyQBEQES -ASoBEwMlAyYBFAMnAygDAQCaAyoDKwBsAxUAbgMvAzADEAMxAzIDMwBuARUDNgM3AwEDOQM6XxAfTlNE -cmFnZ2luZ1NvdXJjZU1hc2tGb3JOb25Mb2NhbFlOU1R2RmxhZ3NfECxOU091dGxpbmVWaWV3SW5kZW50 -YXRpb25NYXJrZXJGb2xsb3dzQ2VsbEtleV8QEk5TQWxsb3dzVHlwZVNlbGVjdFxOU0Nvcm5lclZpZXdf -EBdOU0ludGVyY2VsbFNwYWNpbmdXaWR0aF8QGU5TQ29sdW1uQXV0b3Jlc2l6aW5nU3R5bGVfEBhOU0lu -dGVyY2VsbFNwYWNpbmdIZWlnaHRbTlNHcmlkQ29sb3JfEBxOU0RyYWdnaW5nU291cmNlTWFza0Zvckxv -Y2FsXk5TVGFibGVDb2x1bW5zW05TUm93SGVpZ2h0gJmAshICQAAACICpCYCdI0AAAAAAAAAAI0AIAAAA -AAAAEREAgJwJgDGArxAPgJmAoCNAMQAAAAAAAFp7MjI2LCAxNDJ91AEPAA4BKAERACsDPgM/A0CAAICf -gJ4T/////4AAAQBfEBR7ezE5MCwgMH0sIHsxNiwgMTd9fdIANwA4A0MDRKQDRAFhAWIAO11fTlNDb3Ju -ZXJWaWV30gAOAD4BAANHgCyhA0iAodsDSgAOA0sDTANNA04DTwNQA1EDUgNTAG4DVQNWAXgDWANZAG8D -WgNbA1wDE15OU0lzUmVzaXplYWJsZVxOU0hlYWRlckNlbGxcTlNJZGVudGlmaWVyV05TV2lkdGhaTlNE -YXRhQ2VsbF5OU1Jlc2l6aW5nTWFza18QGU5TU29ydERlc2NyaXB0b3JQcm90b3R5cGVaTlNNaW5XaWR0 -aFpOU01heFdpZHRoW05TVGFibGVWaWV3CYCugKKAQSNAbAmT4AAAAICngKsjQEKmUCAAAAAjQI9AAAAA -AACAm9cBNgAOAW4BOQE6AT4BcANfA2ADYQF4AXUAmgNkEgSB/gCApoCjgEGAQICk0wAOAYMBjgGGAZAD -Z4BGSzAuMzMzMzMyOTkA1QAOAYIBgwGEAYUBhgGWAYgDawGKgEaASYClgENfEA9oZWFkZXJUZXh0Q29s -b3LSADcAOANvA3ClA3ABnwFcASkAO18QEU5TVGFibGVIZWFkZXJDZWxs2AE2AA4BbgE5AToBOwE+AXAD -cgFyAxUDdQF1AxMDeAF5ElQh/kCASoCpgKiAQICbEgACBACAR1lUZXh0IENlbGzVAA4BggGDAYQBhQGG -AYcBiAN+AYqARoBFgKqAQ18QFmNvbnRyb2xCYWNrZ3JvdW5kQ29sb3LTAA4DggODA4QDhQBuWk5TU2Vs -ZWN0b3JbTlNBc2NlbmRpbmeArYCsCVhjb21wYXJlOtIANwA4A4kDiqIDigA7XxAQTlNTb3J0RGVzY3Jp -cHRvctIANwA4A4wDjaIDjQA7XU5TVGFibGVDb2x1bW7VAA4BggGDAYQBhQGGA5ABiAORAYqARoCxgLCA -Q1lncmlkQ29sb3LTAA4BgwGOAYYBkAOWgEZEMC41ANIANwA4A5gDmaYDmQNTAWABYQFiADtdTlNPdXRs -aW5lVmlld18QFHt7MSwgMX0sIHsyMjYsIDE0Mn190gA3ADgDnAOdpAOdAWEBYgA7Wk5TQ2xpcFZpZXfZ -AQ8CWwAOASgBEQETAlwBFAOfAsICwgOiA6MDQAEVA6UCwgOnWU5TUGVyY2VudICXgJeAuIC2gDGAt4CX -Iz/vvnbAAAAAXxAVe3sxOTAsIDF9LCB7MTUsIDEyNH19XF9kb1Njcm9sbGVyOtIANwA4A6sDrKUDrAFg -AWEBYgA7Wk5TU2Nyb2xsZXLaAQ8CWwAOASgC8gERARMCXAEUA58CwgLCA6IDsQBvA0ABFQOlAsIDtYCX -gJeAuIC6gDGAt4CXIz/v2S0AAAAAXxAZe3stMTAwLCAtMTAwfSwgezE5NSwgMTV9fV8QFXt7MCwgMjB9 -LCB7MjI4LCAxNDR9fdIANwA4A7kDuqQDugFhAWIAO1xOU1Njcm9sbFZpZXdaezIyOCwgMTY0fd8QDwEP -AvEADgEoAvIDIQO9ARAC8wERARMBFAL0AvUC9gKcA78C+QPBA8IDwwPEA8UDxgKRARUCnAPJA8oDyl8Q -EE5TSGVhZGVyQ2xpcFZpZXeAiYDlgLyA6RECMoDJgMaAwE8QEEEgAABBIAAAQZAAAEGQAACAMYCJgOOA -wYDB0gAOAD4BAAPOgCylA8oDyQO/A8QDw4DBgOOA5YDGgMnbAQ8ADgEoAwoBEAERAwsBEwMMARQC9QK0 -Aw4D1wMQA9gDEgPZARUDFQK0A9mAv4C0gOKAwoDDgDGAqYC/gMPSAA4APgEAA+CALKED2YDD3xAVAQ8D -HQAOAx4D4wFuAyADIQMiAyMDJAERARIBKgETAyUD5AEUAycDJgMoA8oAmgPmA+cD6AMVAG4DwwMxAxAD -MAHWA+wAbgEVAzYAbwPKA/EDNwInXE5TSGVhZGVyVmlld18QD05TR3JpZFN0eWxlTWFza4DBgOESVsAA -AIDFgKkJgMmAxAmAMYCvgMGAy1p7MjI2LCAxODh91wEPAA4BEQESARMBFANTA8QD9QHWA/YBFQPEA9mA -xoDIgMeAMYDGgMPbAQ8ADgEoAwoBEAERAwsBEwMMARQC9QK0Aw4D/QMQA/4DEgPoARUDFQK0A+iAv4C0 -gOiA54DFgDGAqYC/gMVZezIyNiwgMTd90gA3ADgEBgQHpAQHAWEBYgA7XxARTlNUYWJsZUhlYWRlclZp -ZXfWAQ8ADgEoAREBEwEUArQDPgQLA0ABFQK0gL+An4DKgDGAv18QFHt7LTI2LCAwfSwgezE2LCAxN319 -0gAOAD4BAAQRgCyiBBIEE4DMgN3bA0oADgNLA0wDTQNOA08DUQNSBBUDUwBuA1UEGAQZBBoEGwGQBBoE -GgBuA9lcTlNJc0VkaXRhYmxlCYCugM6AzSNANAAAAAAAAIDQCYDDVXN0YXRl1wE2AA4BbgE5AToBPgFw -A18DYAQhAUUBdQCaA2SApoDPgDaAQICk0wAOAYMBjgGGAZADZ4BG2QE2AA4B7wE5AToB8AHxAT4B8gG1 -AfQAmgQpBCoAmgCaBCsAbIBggNGA3BICAgAACNUADgFOBC4ELwGCBDAEMQQyBDMENFxOU0ltYWdlRmxh -Z3NWTlNSZXBzgNuA0hIgwAAAgNOA2lh7MTYsIDE2fdIADgA+AQAEOIAsoQQ5gNTSAA4APgD4BDyAKqIE -PQQ+gNWA1tYADgRABEEEQgRDBEQERQRGBEcESARJAJpfEBROU1RJRkZSZXByZXNlbnRhdGlvbl8QEE5T -Q2FjaGVXaW5kb3dCUFNfEBBOU0NhY2hlV2luZG93QlBQXxAXTlNDYWNoZVdpbmRvd0NvbG9yU3BhY2Vf -EBVOU0NhY2hlV2luZG93SXNQbGFuYXKA2YDXEAgQGIDYTxEVck1NACoAAAOMgAAgUDgkFg0Hg4BgYqKA -mAB5WLaACLf8CasDfkIjUbjkFCUKAAnU5aACzM6sABceL6ADGgbyjsxg4EmgMmgEBgBnQ3GwdARdSpLC -BQQTFfzNbT6C7bcdNSDtqDMggCqgGf9XfoGrQTDtdIgSsAsBVjDwHswegYbelrChtHLzBxKEMCUTKgSu -cYUADqviOal/OsDfwOwgeIWHaVUAQPAQDAYAxwFAARCQVAAPCAOAD/A+aATvbkPIuhATudgAZzWBAAbA -gMQAU+xYLC2hKf23e2KAxTKhVe4yHRIAQeEQkyYSBoAIIvE4AAjAVoAZYbFIAci4QQAJ44eAAfTtd4Ab -LPegAaAcOAAWK3XboWnvFdXf7ughRKhXdpULBaCRaKYnIKex5oEeY3De8QOOSEYbmaAAKAejJ+HadYAH -SbLumGfgmgAZJyn6f5PxCFZ8RIa6CCWJonmoI4miaFY2jKMYAHWmAAHMa5PAAYRhnqAAKmkUgACkM4Jg -AdpuHIAAGASAgAH6eR4gAWxtBUABvgeHAAExLYtHJLxToIIcxFsHYhCQJJAjqNyBGoQAAHkA0KG0YZ/M -2AJugAF4VM0ZBcnCAAVBKA4AAQAsolyYgFRmFwzgATNHkeaFJDkggc0sS4XBoHw0EwSREIEco8gAbpvA -iABnmofAACcHBzAAfx5nOABml/VwPgoAwAAgCaYGKXzunQHM3FAURSF6YFkCIggWWYN4VheHJIFIUBLV -ebg2AAah2iiABzmQSoACKIgRgAbxkmiAB6giKElHEWgAA6DFXGiaaFGGBwqAAX5hmQcZcX+tC0g2DYgB -0HwjF+S5JkXCpuVUbxzGKAAfg0XgAAMA9FFaSpggAaZ6guAAZgabYACUH4EgAcJnVcOxnIdHoFH1ZBgU -UgbCAcEIiiOJZvBiGQVgAbZsZKDx9KkPA6iMgR9x6fp3HKAAAn4fh/n6dVZHqch2H+c5wHUf4+GKAhTl -wbR8D4gc/oGnQAgGJW4Hce+5neeh5HedBKi2AgYhQFwTAGf5+H0ip8HlwrwgAeZ1TedJ0SscJ8H8UBjg -AZBOmmAAuoGcapqpmwAH225/AmKYXAMShJjuGwnHOcp3H2cZvnYeRvHDvBuHSfZxG005unBKJrnGmBsn -zOp7IGdPOJkAAMBuDQADUAzHgSZ1ZFweqMnagZ8oHVSBe+AHw/D7qBTqgaAgAA8BAAADAAAAAQAQAAAB -AQADAAAAAQAQAAABAgADAAAABAAABEYBAwADAAAAAQAFAAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgB -EgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQgAAAABFwAEAAAAAQAAA4QBHAADAAAAAQABAAAB -PQADAAAAAQACAAABUgADAAAAAQABAAABUwADAAAABAAABE6HcwAHAAARHAAABFYAAAAAAAgACAAIAAgA -AQABAAEAAQAAERxhcHBsAgAAAG1udHJSR0IgWFlaIAfYAAEAAwACACIAJ2Fjc3BBUFBMAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbDu4qo1xiT/FwiDP/vVGK4AAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAADnJYWVoAAAEsAAAAFGdYWVoAAAFAAAAAFGJYWVoAAAFUAAAAFHd0cHQA -AAFoAAAAFGNoYWQAAAF8AAAALHJUUkMAAAGoAAAADmdUUkMAAAG4AAAADmJUUkMAAAHIAAAADnZjZ3QA -AAHYAAAGEm5kaW4AAAfsAAAGPmRlc2MAAA4sAAAAZGRzY20AAA6QAAACPm1tb2QAABDQAAAAKGNwcnQA -ABD4AAAAJFhZWiAAAAAAAABgVQAANzsAAAd/WFlaIAAAAAAAAHFIAACxZQAAINZYWVogAAAAAAAAJTkA -ABd7AACqz1hZWiAAAAAAAADzUgABAAAAARbPc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L/ -//2jAAAD3AAAwGxjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAGN1cnYAAAAAAAAAAQHNAAB2 -Y2d0AAAAAAAAAAAAAwEAAAIAAAAxAKsBQgHiAq0DpATMBhIHmQlRCy8NPA9sEcAUHBaDGPIbRB2QH7wh -ySO1JYUnOijFKkYrvi0tLqIwGDGMMvw0aDXSNzk4ozoEO2A8wD4cP3FAxUIWQ2ZEtUYER0tIlkndSx5M -Pk1STnBPhFCZUbRSzVPlVP5WFlcuWENZVVptW35cj12cXqdfr2C4YbxivmO/ZL9lvWa5Z7NosGmvaqtr -qGylbaJuoG+gcJ1xnnKjc6V0qXWxdrt3w3jOedt66nv8fQ1+Hn8ygEKBRYJBgzyEOIU1hjCHLIgniSOK -HosYjBSND44KjwaQApD+kfmS85PvlOuV6Jbkl9+Y2pnWmtKb0ZzQndOe2Z/goOmh86L+pA6lH6Yyp0io -Xalzqomroay6rdKu6rACsRuyMrNHtFu1YLZat1W4VLlQuku7R7xBvTu+Nr8ywC7BK8IlwyDEG8UXxhPH -DsgLyQjKAsr7y/XM8M3szuvP4tDc0c3SwdOy1KLVjdZ211/YRtkp2gra7tvO3Kvdid5n30XgI+EB4eLi -w+Ol5H3lQ+X65qjnVOgA6KnpUen46prrO+vb7HbtDu2l7jjuye9W7+LwafDx8XTx+PJ58vrzefP39HX0 -8/Vs9eb2YPbb91L3yfhA+Lb5LPmi+hj6jfsC+3j77/xm/N79V/3R/kv+xv81/5r//wAAACQAfAECAYsC -NQMBA/QFDwZjB9cJjAtrDXoPoRHpFDUWjRjaGw0dKx8ZIP4isCREJakm/ShGKYkq0iweLWwuuDAAMU4y -kzPhNSc2bDe1OPg6OTt3PLE97D8nQF5Bj0LCQ/JFG0YhRx1IG0kWShBLDUwKTQROAU78T/dQ8lHsUulT -5VThVdxW1lfRWM1ZyFrCW71cuV20XqVfiWBsYU5iL2MOY+xkymWpZodnZWhFaShqCmrsa9Jsu22jbo9v -fXBucWJyWHNMdEZ1PHYmdwt37njUebt6onuLfHF9XX5Ffy6AGYEDge2C2IPChK6FlYZ7h2WITIkzihiK -/IvhjMyNw47Aj7qQt5G2krSTtJS0lbOWuZfBmMmZ15rlm/edC54jnz6gXKF9oqGjyaTzphynQ6hRqU2q -SatIrEStQK49rzqwN7E2sjezObQ9tUG2RrdOuFe5Yrptu328jr2cvqu/vMDPwd7C4MPaxNjF0cbPx83I -y8nJysTLyMzJzcnOys/U0NrR39Lp0/TVANYN1xzYLdlB2lTbX9xY3UDeIt8B39/gu+GY4nLjSuQh5Pjl -zOae52/oP+kO6drqp+ty7D3tCe3R7pzvZfAt8PPxjPIk8rrzUPPo9H/1F/Wt9kP22fdx+Ar4n/k1+cz6 -Y/r7+5H8KPzA/Vf97v6D/xP/if//AAAAEwBDAIoA6AFfAe0CowN7BHYFmAbnCGUJ/wvODbgPohGXE3UV -RRbxGIIZ+RtGHHQdkR6oH70gzCHcIuoj/iUKJhQnHygkKTEqNCs0LDotPS45LzowMzEzMjAzLjQmNSY2 -HzcSN+Q4rjl0Ojg69ju2PHQ9LT3mPp0/UkADQLNBY0IRQr5Da0QWRMJFb0YbRshHdUgkSNZJj0pRSxpL -30yiTWROI07gT5xQWFEPUclSg1M7U/JUq1VnViBW3FeaWFlZHFnfWqRba1wuXOVdmF5KXv1fsWBlYRth -0mKJY0Bj92SvZWdmH2bXZ49oSGj+abNqamsea9JshW03behumW9Jb/pwrXFgchZyzXOEdD1093WzdnF3 -MHfxeLN5dno5ev97xnyNfVV+HX7nf7CAd4FDggyC1oOihHWFRYYYhu2HxIiciXeKVos2jBiM+43djsOP -qJCRkXSSXJNDlCeVCpXtltGXuZi2mbCarpunnKWdo56hn5+gmqGeop+jn6SgpaqmsKe1qL+pyqrWq+Os -8q4DrxewKrE9slKza7SGtaO2wrfluRC6OrtnvJi90L8IwEPBhMLFxArFUMaZx93JKMpzy7nNBs5Nz5TQ -29In03fUyNYf13fY1dpA27TdM9614Ebh4OOQ5U3nFuj66uzs9+8e8WLzufYy+NH7mv45//8AAG5kaW4A -AAAAAAAGNgAAl1YAAFf+AABT5AAAi1IAACcqAAAWqAAAUA0AAFQ5AALcKAACVHoAAZcKAAMBAAACAAAA -EAAoAD8AVQBqAIAAlACoALsAzwDiAPUBCAEbAS4BQQFUAWcBewGPAaMBuAHNAeIB+AIPAicCPwJYAnIC -jQKqAsgC5wMJAysDUAN3A6ADzQP9BC4EYQSWBM0FBAU8BXUFrwXrBigGZwanBukHLAdvB7UH/QhHCJEI -3AkqCXoJywoeCnMKyQsgC3kL0wwxDI4M7Q1PDbQOJw6fDxQPjxAMEIgRBRGFEgcSihMPE5YUIBStFTgV -yRZbFvEXihgnGMQZZhoMGrQbXxwNHL0dcx4oHt0fliBQIQ0hyyKLI0okDiTRJZImVycdJ+IopiluKjYq -/SvFLI0tVS4gLuwvtjCIMWcySzMyNBo1AjXvNts3yzi7ObA6pTuaPJU9jj6KP4ZAhUGJQotDkESURZxG -pkeySL9Jz0rbS+tM+E4DTw9QG1ElUjNTPVRFVVBWWFdgWGxZd1qEW49cnF2rXrtfzWDfYfJjC2QlZUNm -eWe5aPRqLmtxbLNt9m8/cIdx0HMadGR1sncEeFV5qHr6fFJ9qX7+gFuBu4MchH2F3oc8iKeKEIuHjPyO -d4/3kYCTD5SfljmX25l6myKc0p6AoDKh56OcpVCnA6i4qoqspq7ksS+zhLXmuF264b2EwDvDEcYDyRfM -Rc+H0uTWStnT3WDhC+TF6IbsWfAj8+73rPtr//8AAAAWADIATQBnAIAAlwCuAMUA2gDvAQQBGAEsAUEB -VQFqAX4BkwGoAb4B1AHqAgECGAIxAksCZQKBAp0CvQLdAv4DIQNIA3EDnQPPBAQEPQR4BLYE9AUzBXMF -tAX2BjsGgQbHBxEHWgekB/IIQQiQCOEJNQmKCeEKOwqWCvILUAuwDBQMeAzeDUcNtA4zDrcPOw/EEE8Q -2RFnEfgSiRMeE7QUTRToFYMWIRbBF2QYCRivGVcaAhqvG10cDBzBHYgeUR8eH+8gxCGcInYjUiQyJREl -8CbTJ7Yolil6KlwrPSweLP4t3i7CL6EwiDF/MnwzezR3NXg2dzd8OHw5gzqLO5E8nj2oPrg/xkDcQfZD -DUQrRUlGbkeVSLpJ0EreS/NNBk4ZTy5QQ1FYUnJThVSYVa1WvVfOWN5Z7Vr6XAVdD14YXyBgJmErYi5j -NmQ7ZUlmeWe5aPNqLWtvbLBt8G81cHpxvHL/dEF1g3bIeAt5TXqPe899E35Qf4+A04IXg1qEnIXihzuI -oooEi3GM144/j6iREpKDk+mVVJbCmDCZlJr+nGyd0588oKSiDKNzpNmmPqehqQmqhqworeKvorFpszW0 -/7bYuLW6k7x9vm3AYMJbxF/GY8hyyn3Mlc6o0MbS6NW12JLbb95M4TfkI+cK6gPs/O/08vj19Pj+/BL/ -/wAAACkAUAByAJIAsADNAOgBAgEcATYBTgFnAX8BmAGyAcwB5gICAh8CPgJdAoACpALLAvUDIgNVA44D -zAQPBFMEmwTmBTIFgQXQBiQGegbSBy4HiQfqCE4IsgkZCYUJ8QpjCtQLSAu+DDkMsg0xDbUOVQ78D6oQ -YBEYEdsSohNwFEgVJRYIFvEX4RjTGcoaxBvAHLgdoh6HH3QgZyFhImEjZyR1JYMmmCexKMgp5SsALBst -NC5PL2gwiTHHMww0UTWZNuA4Kjl3OsY8Fz1sPsVAHkGDQuhEVkXHR0FIv0pDS8ZNSU7KUExRzlNPVMxW -SlfGWUNawVw8XblfN2C2YjRjvGU9ZsdoT2nKa01sy25Hb8RxPHKwdCN1lXcLeH158ntifN1+Un/LgU2C -0IRWhdqHO4iiigSLcYzXjj+PqJESkoOT6ZVUlsKYMJmUmv6cbJ3TnzygpKIMo3Ok2aY+p6GpCapyq9at -OK6Zr/mxWLK1tAm1X7a1uAi5V7qiu+29Ob6Av8PBCsJNw5LE1cYWx1/IocnjyyjMcs20zv7QStGW0uPU -LtV01rnYAdlC2oXbxt0C3jffZuCS4bfi2+P+5RnmL+dC6EvpUepR607sSu057ibvDe/18NPxsPKE81f0 -IfTq9bD2c/c09+34pvlX+gb6tPtZ+/78o/1F/ej/I///AABkZXNjAAAAAAAAAApDb2xvciBMQ0QAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAASAAAADG5iTk8AAAASAAAA6HB0UFQAAAAWAAAA+nN2U0UA -AAAQAAABEGZpRkkAAAAQAAABIGRhREsAAAAcAAABMHpoQ04AAAAMAAABTGZyRlIAAAASAAABWGphSlAA -AAAOAAABamVuVVMAAAASAAABeHBsUEwAAAASAAABinB0QlIAAAAYAAABnGVzRVMAAAASAAABtHpoVFcA -AAAOAAABxnJ1UlUAAAAkAAAB1GtvS1IAAAAMAAAB+GRlREUAAAAQAAACBG5sTkwAAAAWAAACFGl0SVQA -AAAUAAACKgBGAGEAcgBnAGUALQBMAEMARABMAEMARAAgAGEAIABDAG8AcgBlAHMARgDkAHIAZwAtAEwA -QwBEAFYA5AByAGkALQBMAEMARABMAEMARAAtAGYAYQByAHYAZQBzAGsA5gByAG1faYJyACAATABDAEQA -yQBjAHIAYQBuACAATABDAEQwqzDpMPwAIABMAEMARABDAG8AbABvAHIAIABMAEMARABLAG8AbABvAHIA -IABMAEMARABMAEMARAAgAEMAbwBsAG8AcgBpAGQAbwBMAEMARAAgAGMAbwBsAG8Acl9pgnJtsmZ2mG95 -OlZoBCYEMgQ1BEIEPQQ+BDkAIAQWBBoALQQ0BDgEQQQ/BDsENQQ5zuy37AAgAEwAQwBEAEYAYQByAGIA -LQBMAEMARABLAGwAZQB1AHIAZQBuAC0ATABDAEQATABDAEQAIABjAG8AbABvAHIAaQAAbW1vZAAAAAAA -AAYQAACcWwAAAADAVLihAAAAAAAAAAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlLCBJbmMu -LCAyMDA4AF8QGU5TQ2FsaWJyYXRlZFJHQkNvbG9yU3BhY2XSADcAOARNBE6jBE4ETwA7XxAQTlNDYWNo -ZWRJbWFnZVJlcFpOU0ltYWdlUmVw0wAOAYMBjgGGAZAEUoBGRDAgMADSADcAOARUAMaiAMYAO9QADgFO -AU8BUAFRAX0BUwRYgDmAOBAQ2wNKAA4DSwNMA00DTgNPA1EDUgQVA1MAbgNVBFwEXQReBF8BkARgA1wA -bgPZCYCugN+A3iNAaQAAAAAAAIDgI0BEAAAAAAAACYDDVXRpdGxl1wE2AA4BbgE5AToBPgFwA18DYAQh -BF0BdQCaA2SApoDPgN6AQICk2AE2AA4BbgE5AToBOwE+AXAEawFyAxUDdQQqA9kEcQF5EhQh/kCASoCp -gKiA3IDDEQgAgEfSADcAOAR0A1OlA1MBYAFhAWIAO18QFXt7MSwgMTd9LCB7MjI2LCAxODh9fdkBDwJb -AA4BKAERARMCXAEUA58CtAK0A6IEegNAARUDpQK0BH6Av4C/gLiA5IAxgLeAvyM/77n7oAAAAF8QFnt7 -MjI0LCAxN30sIHsxNSwgMTAyfX3aAQ8CWwAOASgC8gERARMCXAEUA58CtAK0A6IEhABvA0ABFQOlArQE -iIC/gL+AuIDmgDGAt4C/Iz/v3blAAAAAXxAVe3sxLCAxMTl9LCB7MjIzLCAxNX190gAOAD4BAASMgCyh -A+iAxV8QE3t7MSwgMH0sIHsyMjYsIDE3fX1fEBZ7ezAsIDE2NX0sIHsyMjgsIDIwNn19XxAWe3s0OTcs -IDB9LCB7MjI4LCAzNzF9fdIANwA4BJICl6QClwFhAWIAO18QFXt7MCwgMjV9LCB7NzI1LCAzNzF9fdIA -NwA4BJUElqIElgA7Xk5TQ2xhc3NTd2FwcGVyWns3MjUsIDM5Nn3SADcAOASZAWGjAWEBYgA7XxAVe3sw -LCAwfSwgezEyODAsIDc3OH19WnszNzIsIDM0MX3SADcAOASdBJ6iBJ4AO18QEE5TV2luZG93VGVtcGxh -dGXSAA4APgEABKGALK8QMwSiBKMEpASlBKYEpwSoBKkEqgSrBKwErQSuBK8EsASxBLIEswS0BLUEtgS3 -BLgEuQS6BLsEvAS9BL4EvwTABMEEwgTDBMQExQTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ID1 -gQEEgQFigQFjgQFlgQFpgQFrgQF7gQF9gQF/gQGRgQGTgQGdgQGfgQGggQGigQGkgQGwgQGxgQGzgQG0 -gQG2gQG3gQG5gQG6gQG8gQG+gQHAgQHCgQHlgQHngQHsgQH0gQH+gQIIgQIOgQIUgQIbgQIegQIhgQIj -gQIngQIqgQItgQIwgQIxgQI0gQI+gQJCgQJFgQJL1AAOBNYE1wTYBNkE2gTbBNxdTlNEZXN0aW5hdGlv -blhOU1NvdXJjZVdOU0xhYmVsgQEDgPiA9oEBAtIADgAyADME34AEgPdfEBdWTENNYWluV2luZG93Q29u -dHJvbGxlctcBDwAOASgBKQERASoBFATiAaUE5ATlBOYAbgTigPmAUoD6gPsRASAJgPnWAQ8ADgEQAREB -EgAyACsCnwTsBO0E7gK7gACAiIEBpREBCoEBroC+XxATe3s2NiwgNn0sIHsyMCwgMjB9fd4BNgAOAa4B -rwGwAbEE8gGyATkBOgE7AbMBPgG0BPMBtgFFBPYBuQT3BPgE+QFFBPsE2gG/BP0E/l8QEE5TQWx0ZXJu -YXRlSW1hZ2USJAn+AIBRgDaA/RCCgP+BAQGANoD8gPgSCAAAABIIRAD/1AAOAU4BTwFQAVEFAQFTBQOA -OSNAJAAAAAAAAIA4EQsb0wAOADIAwgDDAMQFB4AcgBqA/l8QE3NraXBfZm9yd2FyZF9hY3RpdmXTAA4A -MgDCAMMAxAUMgByAGoEBAF8QEXNraXBfZm9yd2FyZF9ibHVl0gAOAHcAeACrgA1fEBxtZWRpYVBsYXll -ckZvcndhcmROZXh0QnV0dG9u0gA3ADgFEgUTowUTBRQAO18QFE5TTmliT3V0bGV0Q29ubmVjdG9yXk5T -TmliQ29ubmVjdG9y1AAOBNYE1wTYBNkE2wUYBRmBAQOA9oEBBYEBYd4AQwAOBRsARABFAEYARwBIAEkF -HABKAEsATABNBR0ATwUfBSAFIQUiBSMFJAUlBSYAVgUnBSgFKV8QFk5TV2luZG93Q29udGVudE1heFNp -emVZTlNNYXhTaXplgQEMgPOBAQqBAV6BAQcT//////B4AACBAQiBAQuBAQaBAWAQgYEBX4EBCV8QF3t7 -MTEwLCAyNjd9LCB7NTQ5LCA4N319VldpbmRvd18QHVZMQ0Z1bGxTY3JlZW5Db250cm9sbGVyV2luZG93 -0gAOAHcAeAUvgA1UVmlld18QGnszLjQwMjgyZSszOCwgMy40MDI4MmUrMzh9WHsyMTMsIDV91wEPAA4B -EAERARIBEwEUBTMBFgU1AdYFNgUzBTiBAQ2A8IEBDoEBXIEBDYEBXdIADgA+AQAFO4AsrQU8BT0FPgU/ -BUAFQQVCBUMFRAVFBUYFRwVIgQEPgQEVgQEZgQEfgQEjgQEpgQEvgQE0gQE6gQFDgQFKgQFRgQFY2gEP -AA4BzgEpAc8BEQESASoBEwEUBR0B0QBuBU0FTgHWBU8AbgUzBR2BAQyAYQmBARKBARCBAREJgQENgQEM -0gAOAD4APwVVgFumAd0B3gHfAeAB4QHigFWAVoBXgFiAWYBaWXs1NDksIDg3fdgBNgAOAe8BOQHwAfEB -PgHyAfMB9ACaBV8AVgBWAfYAbIBggQETCNMADgAyAMIAwwDEBWSAHIAagQEUXWZzX2JhY2tncm91bmTa -AQ8ADgEoAc4BKQHPAREBKgETARQFHQHRBWkAbgVrBWwB1gBuBTMFHYEBDIBhgQEXCYEBGIEBFgmBAQ2B -AQzSAA4APgA/BXKAW6YB3QHeAd8B4AHhAeKAVYBWgFeAWIBZgFpfEBV7ezMxMywgMTR9LCB7NDMsIDE5 -fX3XATYADgHvAfAB8QE+AfIB8wH0AJoAVgBWAfYAbIBgCNgBDwAOASgBKQERASoBEwEUBR0BZQWABYEB -1gBuBTMFHYEBDIBLgQEagQEbCYEBDYEBDF8QFXt7OTgsIDY0fSwgezM1MiwgMTR9fdgBNgAOAW4BOQE6 -ATsBPgFwAbUBcgFzBYkBdQU+BYwFjYBKgEKBARyAQIEBGRIIQAAAgQEdXxATVkxDIEZ1bGwgU2NyZWVu -LmF2adUADgGCAYMBhAGFAYYCUwGIBZIBioBGgHKBAR6AQ1toZWFkZXJDb2xvctgBDwAOASgBKQERASoB -EwEUBR0BZQWYBZkB1gBuBTMFHYEBDIBLgQEggQEhCYEBDYEBDF8QFXt7NDg2LCA2NH0sIHs1MCwgMTR9 -fdgBNgAOAW4BOQE6ATsBPgFwAbUBcgFzBaEBdQU/BaQFjYBKgEKBASKAQIEBHxIEQAAAgQEdVzE6MjM6 -NDXaAQ8ADgEoAc4BKQHPAREBKgETARQFHQHRBaoAbgWsBa0B1gBuBTMFHYEBDIBhgQElCYEBJoEBJAmB -AQ2BAQzSAA4APgA/BbOAW6YB3QHeAd8B4AHhAeKAVYBWgFeAWIBZgFpfEBV7ezEyNCwgMTd9LCB7MTUs -IDEzfX3YATYADgHvATkB8AHxAT4B8gHzAfQAmgW9AFYAVgH2AGyAYIEBJwjTAA4AMgDCAMMAxAXCgByA -GoEBKF1mc192b2x1bWVfbWF42gEPAA4BKAHOASkBzwERASoBEwEUBR0B0QXHAG4FyQXKAdYAbgUzBR2B -AQyAYYEBKwmBASyBASoJgQENgQEM0gAOAD4APwXQgFumAd0B3gHfAeAB4QHigFWAVoBXgFiAWYBaXxAT -e3sxNiwgMTh9LCB7NywgMTF9fdgBNgAOAe8BOQHwAfEBPgHyAfMB9ACaBdoAVgBWAfYAbIBggQEtCNMA -DgAyAMIAwwDEBd+AHIAagQEuXmZzX3ZvbHVtZV9tdXRl2gEPAA4BKAKJASkBEQEqARMAMgEUBR0CjQXk -BeUF5gXnAG4FMwXqBR2BAQyA7YEBMoEBMYEBMxEBDAmBAQ2BATCBAQxfEBhWTENJbWFnZUN1c3RvbWl6 -ZWRTbGlkZXJfEBR7ezI1LCAxNn0sIHs5NiwgMTV9fd4BNQE2AA4BNwE4ATkBOgE7ATwBPQE+AT8BQAFB -AUIF7wFEAJoAbwFFAXUFQgFIAUkF9ABsAUkAbBP/////hAH+AIA6gDaAQIEBLxIAAgAACAjaAQ8ADgEo -AokBKQERASoBEwAyARQFHQKNBfoF+wX8BecAbgUzBeoFHYEBDIDtgQE2gQE1gQE3CYEBDYEBMIEBDF8Q -FXt7MTQsIDQ1fSwgezUyMSwgMjF9fd4BNQE2AA4BNwE4ATkBOgE7ATwBPQE+AT8BQAFBBgMF7wFEAJoA -bwFFBgYFQwYIAUkAmgBsAUkAbCNANUzMzMzMzYA6gDaBATiBATQjQMOIAAAAAAAICNQADgFOAU8BUAFR -Bg0GDgRYgDkjQCgAAAAAAACBATlZSGVsdmV0aWNh2AEPAA4BKAEpAREBKgETARQFHQGlBhMGFAXnAG4F -MwUdgQEMgFKBATuBATwJgQENgQEMXxAUe3szMjUsIDd9LCB7NTUsIDMyfX3eATYADgGuAa8BsAGxBPIB -sgE5AToBOwGzAT4BtAG1AbYBRQYcAbkAbwYdAUUGHwYgBUQBvwT9BiKAUYA2gQE/gQFBgDaBAT2BAT6B -AToT/////4ZEQP9WQnV0dG9u1AAOAU4BTwFQAVEGJgFTBiiAOSNAKgAAAAAAAIA4EQQU0wAOADIAwgDD -AMQGLIAcgBqBAUBaZnNfZm9yd2FyZNMADgAyAMIAwwDEBjGAHIAagQFCXxAUZnNfZm9yd2FyZF9oaWdo -bGlnaHTYAQ8ADgEoASkBEQEqARMBFAUdAaUGNgY3BecAbgUzBR2BAQyAUoEBRIEBRQmBAQ2BAQxfEBR7 -ezI2NywgN30sIHs1NSwgMzJ9fd4BNgAOAa4BrwGwAbEE8gGyATkBOgE7AbMBPgG0Be8BtgFFBj8BuQBv -BkABRQFFBiAFRQG/BP0GRYBRgDaBAUaBAUiANoA2gQE+gQFDE/////+GTED/0wAOADIAwgDDAMQGSYAc -gBqBAUdXZnNfcGxhedMADgAyAMIAwwDEBk6AHIAagQFJXxARZnNfcGxheV9oaWdobGlnaHTYAQ8ADgEo -ASkBEQEqARMBFAUdAaUGUwZUBecAbgUzBR2BAQyAUoEBS4EBTAmBAQ2BAQxfEBR7ezIwNywgNn0sIHs1 -NSwgMzJ9fd4BNgAOAa4BrwGwAbEE8gGyATkBOgE7AbMBPgG0Be8BtgFFBlwBuQBvBl0BRQFFBiAFRgG/ -BP0GRYBRgDaBAU2BAU+ANoA2gQE+gQFK0wAOADIAwgDDAMQGZYAcgBqBAU5ZZnNfcmV3aW5k0wAOADIA -wgDDAMQGaoAcgBqBAVBfEBNmc19yZXdpbmRfaGlnaGxpZ2h02AEPAA4BKAEpAREBKgETARQFHQGlBm8G -cATmAG4FMwUdgQEMgFKBAVKBAVMJgQENgQEMXxAVe3s1MDUsIDEzfSwgezI1LCAyNX193gE2AA4BrgGv -AbABsQTyAbIBOQE6ATsBswE+AbQBtQG2AUUGeAJfAFYGeQFFAUUGIAVHAmME/QZ+gFGANoEBVIEBVoA2 -gDaBAT6BAVET/////8h0QP/TAA4AMgDCAMMAxAaCgByAGoEBVV8QHGZzX2V4aXRfZnVsbHNjcmVlbl9o -aWdobGlnaHTTAA4AMgDCAMMAxAaHgByAGoEBV18QEmZzX2V4aXRfZnVsbHNjcmVlbtgBDwAOASgBKQER -ASoBEwEUBR0BpQaMBo0E5gBuBTMFHYEBDIBSgQFZgQFaCYEBDYEBDF8QFXt7NDU4LCAxM30sIHs0MCwg -MjV9fdwBNgAOAa4BsAGxAbIBOQE6ATsBswE+AbQGkwG2AUUCXwaWAUUGmAF1BUgCYwHABpsT/////4QJ -/gCAUYA2EKOANoEBW4BAgQFYEjaEQP9TRml0WXsyMTMsIDI3fV8QFG1haW5XaW5kb3dDb250cm9sbGVy -1AAOBNYE1wTYBNkE2wKbBRmBAQOA9oCFgQFh1AAOBNYE1wTYBNkFRgUYBqiBAQOBAUqBAQWBAWRfEB1t -ZWRpYVBsYXllckJhY2t3YXJkUHJldkJ1dHRvbtQADgTWBNcE2ATZBqwE2waugQEDgQFmgPaBAWjSAA4A -MgAzBrGABIEBZ15WTENNZWRpYVBsYXllclttZWRpYVBsYXllctQADgTWBNcE2ATZASYE2wa4gQEDgIGA -9oEBal1tYWluU3BsaXRWaWV31AAOBNYE1wTYBNkGvATbBr6BAQOBAWyA9oEBetgBDwAOARABEQESARMA -MgEUBsACnwbCBO0GwwbAArsGxoEBbYCIgQFugQF4gQFtgL6BAXnSAA4APgEABsmALKIGygbLgQFvgQF0 -2AEPAA4BKAEpAREBKgETARQGvAFlBs8G0AGoAG4GwAa8gQFsgEuBAXCBAXEJgQFtgQFsXxAUe3sxNDEs -IDB9LCB7NDYsIDEzfX3YATYADgFuATkBOgE7AT4BcAbWAXICSAbZBPsGygbcBt0T/////4QR/kCASoBw -gQFygPyBAW8SBEAEAIEBc1UwMDowMNMADgGDBuABhgBvBuJVTlNSR0KARkYwIDAgMADYAQ8ADgEoASkB -EQEqARMBFAa8ASwG5gbnAWgAbgbABryBAWyAO4EBdYEBdgmBAW2BAWxfEBR7ezgsIC0xfSwgezEyNSwg -MTV9fd4BNQE2AA4BNwE4ATkBOgE7ATwBPQE+AT8BQAFBAzEG7QFEAJoAbwbvBgYGywYIAUkF9ABsAUkA -bBIEBf8AgDqBAXeBATiBAXQICNIADgB3AHgAq4ANWXsxOTIsIDE1fV8QF3Rvb2xiYXJNZWRpYURlc2Ny -aXB0aW9u1AAOBNYE1wTYBNkE2wMTBvyBAQOA9oCbgQF8WmRhdGFTb3VyY2XUAA4E1gTXBNgE2QAfBNsH -AoEBA4ACgPaBAX5aY29udHJvbGxlctQADgTWBNcE2ATZBwYE2wcIgQEDgQGAgPaBAZDbBwoADgcLAokB -zgcMBw0HDgAyBw8HEABuAo0AbgcUAG4HFgcXAG4HGQBuAG5fEBpOU0ZpbHRlclJlc3RyaWN0c0luc2Vy -dGlvbl8QFE5TUHJlc2VydmVzU2VsZWN0aW9uXxAPX05TTWFuYWdlZFByb3h5Xk5TRGVjbGFyZWRLZXlz -XxAiTlNDbGVhcnNGaWx0ZXJQcmVkaWNhdGVPbkluc2VydGlvbl8QGE5TU2VsZWN0c0luc2VydGVkT2Jq -ZWN0c18QFk5TQXZvaWRzRW1wdHlTZWxlY3Rpb24JgO0JgQGCCYEBjoEBgwmBAYEJCV8QF1ZMQ01lZGlh -QXJyYXlDb250cm9sbGVyXxARTlNBcnJheUNvbnRyb2xsZXLSAA4APgEAByCALKoHIQciByMHJAclByYH -JwcoBykHKoEBhIEBhYEBhoEBh4EBiIEBiYEBioEBi4EBjIEBjV8QFG1ldGFEaWN0aW9uYXJ5LnRpdGxl -VkBjb3VudF8QG21ldGFEaWN0aW9uYXJ5LnN0YXRlQXNJbWFnZVxzdGF0ZUFzSW1hZ2VSc2VVY291bnRa -Zmlyc3RJbmRleFhpbnRWYWx1ZV8QD2ZpbHRlclByZWRpY2F0ZVRkZXNj0QAOBzaBAY/SADcAOAc4Bwyi -BwwAO18QFG1lZGlhQXJyYXlDb250cm9sbGVy1AAOBNYE1wTYBNkFRwUYBz6BAQOBAVGBAQWBAZJfEBBm -dWxsU2NyZWVuQnV0dG9u1AAOBNYE1wTYBNkHQgTbB0SBAQOBAZSA9oEBnNcBDwAOASgBKQERASoBFATi -AaUHSAdJBOYAbgTigPmAUoEBlYEBlgmA+V8QE3t7MzQsIDJ9LCB7MjgsIDI4fX3eATYADgGuAa8BsAGx -BPIBsgE5AToBOwGzAT4BtAG1AbYBRQdQAbkHUQdSAUUBRQdVB0IBvwT9B1eAUYA2gQGYEEKBAZqANoA2 -gQGXgQGUEghUAP/UAA4BTgFPAVABUQYNAVMEWIA5gDjTAA4AMgDCAMMAxAdegByAGoEBmVRwbGF50wAO -ADIAwgDDAMQHY4AcgBqBAZtZcGxheV9ibHVlXxAebWVkaWFQbGF5ZXJQbGF5UGF1c2VTdG9wQnV0dG9u -1AAOBNYE1wTYBNkFQgUYB2qBAQOBAS+BAQWBAZ5cdm9sdW1lU2xpZGVy1AAOBNYE1wTYBNkFRQUYB0SB -AQOBAUOBAQWBAZzUAA4E1gTXBNgE2QKbBNsHdYEBA4CFgPaBAaFZdmlkZW9WaWV31AAOBNYE1wTYBNkE -2wBBB3uBAQOA9oAHgQGjWGRlbGVnYXRl1AAOBNYE1wTYBNkE4gTbB4GBAQOA+YD2gQGv0gAOAD4BAAeE -gCyjB4UHQgTagQGmgQGUgPjXAQ8ADgEoASkBEQEqARQE4gGlB4sHjATmAG4E4oD5gFKBAaeBAagJgPlf -EBN7ezEwLCA2fSwgezIwLCAyMH193gE2AA4BrgGvAbABsQTyAbIBOQE6ATsBswE+AbQE8wG2AUUHkwG5 -B1EHlAeVAUUE+weFAb8E/QdXgFGANoEBqYEBq4EBrYA2gPyBAabTAA4AMgDCAMMAxAecgByAGoEBql8Q -FHNraXBfcHJldmlvdXNfYWN0aXZl0wAOADIAwgDDAMQHoYAcgBqBAaxfEBJza2lwX3ByZXZpb3VzX2Js -dWXSAA4AdwB4AKuADVh7OTcsIDMyfV8QE3Rvb2xiYXJNZWRpYUNvbnRyb2zUAA4E1gTXBNgE2QTbAxMH -e4EBA4D2gJuBAaPUAA4E1gTXBNgE2QVIBRgHsIEBA4EBWIEBBYEBsl8QEGZpbGxTY3JlZW5CdXR0b27U -AA4E1gTXBNgE2QeFBNsGqIEBA4EBpoD2gQFk1AAOBNYE1wTYBNkFPgUYB7uBAQOBARmBAQWBAbVfEBRt -ZWRpYURlc2NyaXB0aW9uVGV4dNQADgTWBNcE2ATZBUQFGATcgQEDgQE6gQEFgQEC1AAOBNYE1wTYBNkF -QwUYB8aBAQOBATSBAQWBAbhfEBNtZWRpYVBvc2l0aW9uU2xpZGVy1AAOBNYE1wTYBNkE2wBZB3uBAQOA -9oALgQGj1AAOBNYE1wTYBNkD2QTbB9GBAQOAw4D2gQG7XW1lZGlhTGlzdFZpZXfUAA4E1gTXBNgE2QMT -BNsH14EBA4CbgPaBAb1fEBJjYXRlZ29yaWVzTGlzdFZpZXfUAA4E1gTXBNgE2QU/BRgH3YEBA4EBH4EB -BYEBv18QGG1lZGlhUmVhZGluZ1Byb2dyZXNzVGV4dNQADgTWBNcE2ATZAE4AQQfjgQEDgDCAB4EBwV8Q -FWluaXRpYWxGaXJzdFJlc3BvbmRlctQADgTWBNcE2ATZB+cE2wfpgQEDgQHDgPaBAeTYAQ8ADgEQAREB -EgETADIBFAfrAp8H7QTtB+4H6wK7B/GBAcSAiIEBxYEB4oEBxIC+gQHj0gAOAD4BAAf0gCymB/UH9gf3 -B/gH+Qf6gQHGgQHOgQHSgQHWgQHagQHe2AEPAA4BKAEpAREBKgETARQH5wGlB/4H/wTmAG4H6wfngQHD -gFKBAceBAcgJgQHEgQHDXxAVe3sxODUsIC0xfSwgezQwLCAyNX193gE2AA4BrgGvAbABsQTyAbIBOQE6 -ATsBswE+AbQBtQG2AUUIBwJfCAgICQgKAUUBdQf1AmMBwAgOgFGANoEByRIQAACjgQHLgQHNgDaAQIEB -xhP/////yMRA/9MADgAyAMIAwwDECBKAHIAagQHKXxAZTlNFbnRlckZ1bGxTY3JlZW5UZW1wbGF0ZdMA -DgAyAMIAwwDECBeAHIAagQHMXxAYTlNFeGl0RnVsbFNjcmVlblRlbXBsYXRlUWbYAQ8ADgEoASkBEQEq -ARMBFAfnAaUIHQgeBOYAbgfrB+eBAcOAUoEBz4EB0AmBAcSBAcNfEBN7ey0yLCAwfSwgezIwLCAyMH19 -3gE2AA4BrgGvAbABsQTyAbIBOQE6ATsBswE+AbQBtQG2AUUB9QG5AFYB9QgoAUUE+wf2Ab8E/QgsgFGA -NoBegF6BAdGANoD8gQHOE//////IdAD/0gAOAHcAeACrgA3YAQ8ADgEoASkBEQEqARMBFAfnAaUIMggz -BOYAbgfrB+eBAcOAUoEB04EB1AmBAcSBAcNfEBV7ezIyOCwgLTF9LCB7NDAsIDI1fX3dATYADgGuAa8B -sAGxAbIBOQE6ATsBswE+AbQBtQG2AUUBuAJfCAgIPAFFAXUH9wJjAcAIQIBRgDaAT4EB1YA2gECBAdIT -/////7bMQP9RbNgBDwAOASgBKQERASoBEwEUB+cBpQhFCEYE5gBuB+sH54EBw4BSgQHXgQHYCYEBxIEB -w18QFXt7MTQyLCAtMX0sIHs0MCwgMjV9fdwBNgAOAa4BsAGxAbIBOQE6ATsBswE+AbQBtQG2AUUCXwgI -CE4GmAF1B/gCYwHACFKAUYA2gQHZgQFbgECBAdYT/////7aEQP9RZdgBDwAOASgBKQERASoBEwEUB+cB -pQhXCFgE5gBuB+sH54EBw4BSgQHbgQHcCYEBxIEBw18QFHt7MTIxLCAwfSwgezIwLCAyMH193gE2AA4B -rgGvAbABsQTyAbIBOQE6ATsBswE+AbQBtQG2AUUCGQG5AFYCGQhiAUUE+wf5Ab8E/QgsgFGANoBmgGaB -Ad2ANoD8gQHa0gAOAHcAeACrgA3YAQ8ADgEoASkBEQEqARMBFAfnASwIawhsBOYAbgfrB+eBAcOAO4EB -34EB4AmBAcSBAcNfEBR7ezE2LCAzfSwgezEwMywgMTV9fd4BNQE2AA4BNwE4ATkBOgE7ATwBPQE+AT8B -QAFBCHIG7QFEAJoAbwh0AXUH+gFIAUkF9ABsAUkAbCNAIAAAAAAAAIA6gQHhgECBAd4ICNIADgB3AHgA -q4ANWXsyNzQsIDIzfV8QF3Rvb2xiYXJNZWRpYUF1ZGlvVm9sdW1l1AAOBNYE1wTYBNkAQQTbCIGBAQOA -B4D2gQHmVndpbmRvd9cADgTWCIQIhQTXBNgIhgiHBNsIiQiKASQIjABWWU5TS2V5UGF0aFlOU0JpbmRp -bmdfEBxOU05pYkJpbmRpbmdDb25uZWN0b3JWZXJzaW9ugQHrgPaBAeqBAemAaIEB6F8QQmFuaW1hdGU6 -IGNhdGVnb3JpZXNUcmVlQ29udHJvbGxlci5zZWxlY3Rpb24uY3VycmVudGx5RmV0Y2hpbmdJdGVtc1dh -bmltYXRlXxA5Y2F0ZWdvcmllc1RyZWVDb250cm9sbGVyLnNlbGVjdGlvbi5jdXJyZW50bHlGZXRjaGlu -Z0l0ZW1z0gA3ADgIkQiSowiSBRQAO18QFU5TTmliQmluZGluZ0Nvbm5lY3RvctgADgTWCIQIhQTXBNgI -lAiGCIcE2wiXCJgGywiaCJsAVllOU09wdGlvbnOBAeuA9oEB74EB7oEBdIEB7YEB8F8QG3ZhbHVlOiBt -ZWRpYVBsYXllci5wb3NpdGlvblV2YWx1ZV8QFG1lZGlhUGxheWVyLnBvc2l0aW9u0wAOAH8APgigCKEI -o4EB86EIooEB8aEIpIEB8l8QFk5TVmFsdWVUcmFuc2Zvcm1lck5hbWVfEBlGbG9hdDEwMDAwRm9sZFRy -YW5zZm9ybWVy0gA3ADgIqAD2ogD2ADvYAA4E1giECIUE1wTYCJQIhgiHBwYHKQitASUIrwiwAFaBAeuB -AYCBAYyBAfaAbYEB9YEB918QGnByZWRpY2F0ZTogZmlsdGVyUHJlZGljYXRlWXByZWRpY2F0ZdMADgB/ -AD4IoAi1CLuBAfOlCLYItwi4CLkIuoEB+IEB+YEB+oEB+4EB/KUCfQQ9CL4EPQJhgH2A1YEB/YDVgHRf -EBxOU1JhaXNlc0Zvck5vdEFwcGxpY2FibGVLZXlzXxAWTlNWYWxpZGF0ZXNJbW1lZGlhdGVseV8QEU5T -UHJlZGljYXRlRm9ybWF0XxAmTlNBbHdheXNQcmVzZW50c0FwcGxpY2F0aW9uTW9kYWxBbGVydHNdTlNE -aXNwbGF5TmFtZV8QJ21ldGFEaWN0aW9uYXJ5LnRpdGxlIGNvbnRhaW5zW2NdICR2YWx1ZdgADgTWCIQI -hQTXBNgIlAiGCIcHBgjKCMsBIAjNCM4AVoEB64EBgIECAYECAIA8gQH/gQICXxAsZGlzcGxheVBhdHRl -cm5WYWx1ZTE6IGFycmFuZ2VkT2JqZWN0cy5AY291bnRfEBRkaXNwbGF5UGF0dGVyblZhbHVlMV8QFmFy -cmFuZ2VkT2JqZWN0cy5AY291bnTTAA4AfwA+CKAI1AjbgQHzpgjVCLYI1wjYCNkI2oECA4EB+IECBIEC -BYECBoECB6YBRQJ9AXQBRQFFAUWANoB9gD+ANoA2gDZfEBFOU051bGxQbGFjZWhvbGRlcl8QEE5TRGlz -cGxheVBhdHRlcm5fEBpOU05vdEFwcGxpY2FibGVQbGFjZWhvbGRlcl8QGE5TTm9TZWxlY3Rpb25QbGFj -ZWhvbGRlcl8QG05TTXVsdGlwbGVWYWx1ZXNQbGFjZWhvbGRlctgADgTWCIQIhQTXBNgIlAiGCIcE2wjq -COsGywjtCO4AVoEB64D2gQILgQIKgQF0gQIJgQIMXxAaZW5hYmxlZDogbWVkaWFQbGF5ZXIubWVkaWFX -ZW5hYmxlZF8QEW1lZGlhUGxheWVyLm1lZGlh0wAOAH8APgigCPQI94EB86II1QiigQIDgQHxogQ9CPmA -1YECDVpOU0lzTm90Tmls2QAOBNYIhAiFCPwE1wTYCJQIhgiHBNsI/wkABMQGywkDCQQAVl8QE05TUHJl -dmlvdXNDb25uZWN0b3KBAeuA9oECEYECEIECCIEBdIECD4ECEl8QHmVuYWJsZWQyOiBtZWRpYVBsYXll -ci5zZWVrYWJsZVhlbmFibGVkMl8QFG1lZGlhUGxheWVyLnNlZWthYmxl0wAOAH8APgigCQoJD4EB86QI -1QjYCNkI2oECA4ECBYECBoECB6QJEAkQCRAJEIECE4ECE4ECE4ECE9gADgTWCIQIhQTXBNgIlAiGCIcE -2wkXCRgBJAkaCRsAVoEB64D2gQIXgQIWgGiBAhWBAhhfEEFoaWRkZW46IGNhdGVnb3JpZXNUcmVlQ29u -dHJvbGxlci5zZWxlY3Rpb24uY3VycmVudGx5RmV0Y2hpbmdJdGVtc1ZoaWRkZW7TAA4AfwA+CKAJIAki -gQHzoQkhgQIZoQkjgQIaXxAPTlNOZWdhdGVCb29sZWFu1wAOBNYIhAiFBNcE2AiGCIcE2wkoCJgBIQkr -AFaBAeuA9oECHYEB7oBMgQIcXxAbdmFsdWU6IG5hdmlnYXRvclZpZXdWaXNpYmxlXxAUbmF2aWdhdG9y -Vmlld1Zpc2libGXXAA4E1giECIUE1wTYCIYIhwTbCTEImAbKCTQAVoEB64D2gQIggQHugQFvgQIfXxAj -dmFsdWU6IG1lZGlhUGxheWVyLnRpbWUuc3RyaW5nVmFsdWVfEBxtZWRpYVBsYXllci50aW1lLnN0cmlu -Z1ZhbHVl2AAOBNYIhAiFBNcE2AiUCIYIhwcGCMoIywFnCM0JPgBWgQHrgQGAgQIBgQIAgD6BAf+BAiLT -AA4AfwA+CKAJQQlDgQHzoQjXgQIEoQF0gD/ZAA4E1giECIUI/ATXBNgIlAiGCIcHBgjKCUkEyQFnCUwJ -TQBWgQHrgQGAgQIBgQIlgQIhgD6BAiSBAiZfECxkaXNwbGF5UGF0dGVyblZhbHVlMjogYXJyYW5nZWRP -YmplY3RzLkBjb3VudF8QFGRpc3BsYXlQYXR0ZXJuVmFsdWUy0wAOAH8APgigCVIJVIEB86EI14ECBKEB -dIA/1wAOBNYIhAiFBNcE2AiGCIcE2wlZCJgH+AlcAFaBAeuA9oECKYEB7oEB1oECKF8QJnZhbHVlOiB2 -aWRlb1ZpZXcudmlkZW9MYXllci5maWxsU2NyZWVuXxAfdmlkZW9WaWV3LnZpZGVvTGF5ZXIuZmlsbFNj -cmVlbtcADgTWCIQIhQTXBNgIhgiHBqwJYgiYAR8JZQBWgQHrgQFmgQIsgQHugDOBAitfEBN2YWx1ZTog -YXVkaW8udm9sdW1lXGF1ZGlvLnZvbHVtZdcADgTWCIQIhQTXBNgIhgiHBNsJawiYB/UJbgBWgQHrgPaB -Ai+BAe6BAcaBAi5fEBt2YWx1ZTogdmlkZW9WaWV3LmZ1bGxTY3JlZW5fEBR2aWRlb1ZpZXcuZnVsbFNj -cmVlbtcADgTWCIQIhQTXBNgIhgiHBNsJKAiYB/cJKwBWgQHrgPaBAh2BAe6BAdKBAhzXAA4E1giECIUE -1wTYCIYIhwTbCXsImAf6CX4AVoEB64D2gQIzgQHugQHegQIyXxAfdmFsdWU6IG1lZGlhUGxheWVyLmF1 -ZGlvLnZvbHVtZV8QGG1lZGlhUGxheWVyLmF1ZGlvLnZvbHVtZdgADgTWCIQIhQTXBNgIlAiGCIcHBgmE -CJgEEwmHCYgAVoEB64EBgIECNoEB7oDdgQI1gQI3XxArdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5tZXRh -RGljdGlvbmFyeS50aXRsZV8QJGFycmFuZ2VkT2JqZWN0cy5tZXRhRGljdGlvbmFyeS50aXRsZdMADgB/ -AD4IoAmNCZqBAfOsCY4Itgi3CLkI2gmTCZQI1QjYCNkJmAmZgQI4gQH4gQH5gQH7gQIHgQI5gQI6gQID -gQIFgQIGgQI7gQI8rAQ9An0EPQQ9AUUCfQQ9CaIBRQFFBD0CfYDVgH2A1YDVgDaAfYDVgQI9gDaANoDV -gH1fEBpOU0NvbmRpdGlvbmFsbHlTZXRzRW5hYmxlZF8QF05TQ3JlYXRlc1NvcnREZXNjcmlwdG9yXxAa -TlNDb250aW51b3VzbHlVcGRhdGVzVmFsdWVfECZOU0FsbG93c0VkaXRpbmdNdWx0aXBsZVZhbHVlc1Nl -bGVjdGlvbl8QG05TQ29uZGl0aW9uYWxseVNldHNFZGl0YWJsZVhObyBUaXRsZdcADgTWCIQIhQTXBNgI -hgiHBwYJsAmxA9kJswBWgQHrgQGAgQJBgQJAgMOBAj9fEBhjb250ZW50OiBhcnJhbmdlZE9iamVjdHNX -Y29udGVudF8QD2FycmFuZ2VkT2JqZWN0c9gADgTWCIQIhQj8BNcE2AiGCIcHBgm6CboE0QPZCb4AVoEB -64EBgIECRIECRIECPoDDgQJDXxAic2VsZWN0aW9uSW5kZXhlczogc2VsZWN0aW9uSW5kZXhlc18QEHNl -bGVjdGlvbkluZGV4ZXPYAA4E1giECIUE1wTYCJQIhgiHBNsJxAnFAEEJxwnIAFaBAeuA9oECSIECR4AH -gQJGgQJJXxAqcmVwcmVzZW50ZWRGaWxlbmFtZTogbWVkaWFQbGF5ZXIubWVkaWEudXJsXxATcmVwcmVz -ZW50ZWRGaWxlbmFtZV8QFW1lZGlhUGxheWVyLm1lZGlhLnVybNMADgB/AD4IoAnOCdCBAfOhCKKBAfGh -CdGBAkpfECNVUkxUb1JlcHJlc2VudGVkRmlsZU5hbWVUcmFuc2Zvcm1lctgADgTWCIQIhQj8BNcE2AiG -CIcE2wnWBF0E0wBBCdoAVoEB64D2gQJNgN6BAkWAB4ECTF8QHnRpdGxlOiBtZWRpYVBsYXllci5kZXNj -cmlwdGlvbl8QF21lZGlhUGxheWVyLmRlc2NyaXB0aW9u0gAOAD4A+AnfgCqvEGMIWAPoBckH/wZwBUEJ -5gLBB/oE5QXmAggFPAU/BUgEXwVrBtACwAWBBT4EGwVDAdQH+QhGA78BJAEhArQD2QbnBR0FRQa8BU0D -yQNZBUIH9wdCBawDAAWZASUFRwfnAFkKEACFAscBJgBBBUADEwVEB/UIHgTaBUYE4gLeBBICmwaNASMG -FACGB0kBIgEgAsIHhQbKBfwGrAI6B/gFGAY3AR8HBgf2B4wFPQKcBlQE2wFnAvgEEwEuA0gGywgzAE4C -swhsAaeBAdyAxYEBLIEByIEBU4EBKYECT4CSgQHegPuBATOAZYEBD4EBH4EBWIDggQEYgQFxgI2BARuB -ARmA0IEBNIBdgQHagQHYgOWAaIBMgL+Aw4EBdoEBDIEBQ4EBbIEBEoDjgKeBAS+BAdKBAZSBASaAtYEB -IYBtgQFRgQHDgAuBAlGAEYCPgIGAB4EBI4CbgQE6gQHGgQHQgPiBAUqA+YCUgMyAhYEBWoBigQE8gCGB -AZaAU4A8gJeBAaaBAW+BATeBAWaAb4EB1oEBBYEBRYAzgQGAgQHOgQGogQEVgImBAUyA9oA+gLmA3YA1 -gKGBAXSBAdSAMICLgQHggE7SAA4KRApFAG5fEBBOU1NoYXJlZEluc3RhbmNlgQJQCdIANwA4CkgKSaMK -SQpKADtfEBhOU1VzZXJEZWZhdWx0c0NvbnRyb2xsZXJcTlNDb250cm9sbGVy0gAOADIAMwpNgASBAlJd -TlNBcHBsaWNhdGlvbtIADgA+APgKUYAqrxBjB/kCtAVBB/UFRwUdAB8CswfnBNoFQgEjBR0FHQUdBBMF -PQbKArMFPgUdBBIFHQEiB+cH+AK0AE4ATgKcArQGywUYBR0AHwU8ArQDSAUdB+cE4gVAAsIFPwBOBR0A -HwBBAB8AWQLAAE4AHwUdAsIFHQfnB/YE4gUdAB8CwQPZASYFSABOBUQAWQdCAE4ATgKzBOIGvAVDAB8B -JQfnAB8FRQBOAB8H5weFBR0BJgVGAB8BIALCA9kBHwMTBrwH9wBBApwH+gEhgQHagL+BASmBAcaBAVGB -AQyAAoCLgQHDgPiBAS+AYoEBDIEBDIEBDIDdgQEVgQFvgIuBARmBAQyAzIEBDIBTgQHDgQHWgL+AMIAw -gImAv4EBdIEBBYEBDIACgQEPgL+AoYEBDIEBw4D5gQEjgJeBAR+AMIEBDIACgAeAAoALgI2AMIACgQEM -gJeBAQyBAcOBAc6A+YEBDIACgJKAw4CBgQFYgDCBATqAC4EBlIAwgDCAi4D5gQFsgQE0gAKAbYEBw4AC -gQFDgDCAAoEBw4EBpoEBDICBgQFKgAKAPICXgMOAM4CbgQFsgQHSgAeAiYEB3oBM0gAOAD4A+Aq3gCqv -EGQIWAXJA+gH/wZwBUEJ5gf6BOUCwQXmBTwCCAU/BUgEXwVrBtACwAWBBT4EGwVDAdQH+QhGA78BJAEh -BucFHQK0A9kFRQa8BU0FQgWsA8kHQgf3A1kDAAWZASUFRwfnAFkKEACFAscBJgBBBUADEwVEB/UIHgTa -BUYE4gAfAt4EEgKbBo0BIwYUAIYHSQEiASAHhQasBsoF/ALCAjoH+AUYBjcBHwcGB/YHjAU9ApwGVATb -AWcEEwL4AS4GywNICDMATghsArMBp4EB3IEBLIDFgQHIgQFTgQEpgQJPgQHegPuAkoEBM4EBD4BlgQEf -gQFYgOCBARiBAXGAjYEBG4EBGYDQgQE0gF2BAdqBAdiA5YBogEyBAXaBAQyAv4DDgQFDgQFsgQESgQEv -gQEmgOOBAZSBAdKAp4C1gQEhgG2BAVGBAcOAC4ECUYARgI+AgYAHgQEjgJuBATqBAcaBAdCA+IEBSoD5 -gAKAlIDMgIWBAVqAYoEBPIAhgQGWgFOAPIEBpoEBZoEBb4EBN4CXgG+BAdaBAQWBAUWAM4EBgIEBzoEB -qIEBFYCJgQFMgPaAPoDdgLmANYEBdIChgQHUgDCBAeCAi4BO0gAOAD4A+AsegCqvEGQLHwsgCyELIgsj -CyQLJQsmCycLKAspCyoLKwssCy0LLgsvCzALMQsyCzMLNAs1CzYLNws4CzkLOgs7CzwLPQs+Cz8LQAtB -C0ILQwtEC0ULRgtHC0gLSQtKC0sLTAtNC04LTwtQC1ELUgBTC1QLVQtWBz4LWAtZC1oLWwtcC10LXgtf -C2ALYQtiC2MLZAtlC2YLZwtoB90LagtrC2wHsAtuC28LcAtxC3ILcwt0C3ULdgt3C3gLeQt6C3sLfAt9 -C34LfwuAC4ELgoECVoECV4ECWIECWYECWoECW4ECXIECXYECXoECX4ECYIECYYECYoECY4ECZIECZYEC -ZoECZ4ECaIECaYECaoECa4ECbIECbYECboECb4ECcIECcYECcoECc4ECdIECdYECdoECd4ECeIECeYEC -eoECe4ECfIECfYECfoECf4ECgIECgYECgoECg4EChIEChYEChoECh4ECiIECiYAKgQKKgQKLgQKMgQGS -gQKNgQKOgQKPgQKQgQKRgQKSgQKTgQKUgQKVgQKWgQKXgQKYgQKZgQKagQKbgQKcgQKdgQG/gQKegQKf -gQKggQGygQKhgQKigQKjgQKkgQKlgQKmgQKngQKogQKpgQKqgQKrgQKsgQKtgQKugQKvgQKwgQKxgQKy -gQKzgQK0gQK1XxAZQnV0dG9uIENlbGwgKHZvbHVtZV9oaWdoKV8QG0ltYWdlIENlbGwgKGZzX3ZvbHVt -ZV9tdXRlKV8QEVRhYmxlIEhlYWRlciBWaWV3XxAnQnV0dG9uIENlbGwgKE5TRW50ZXJGdWxsU2NyZWVu -VGVtcGxhdGUpXxAqQnV0dG9uIENlbGwgKGZzX2V4aXRfZnVsbHNjcmVlbl9oaWdobGlnaHQpXxAbSW1h -Z2UgVmlldyAoZnNfdm9sdW1lX211dGUpXxAfU2hhcmVkIFVzZXIgRGVmYXVsdHMgQ29udHJvbGxlcl8Q -EWF1ZGlvVm9sdW1lU2xpZGVyXxAhQnV0dG9uIENlbGwgKHNraXBfZm9yd2FyZF9hY3RpdmUpXxAmU3F1 -YXJlIFRleHR1cmVkIEJ1dHRvbiAoTlNBZGRUZW1wbGF0ZSldU2xpZGVyIENlbGwtNF8QGkltYWdlIFZp -ZXcgKGZzX2JhY2tncm91bmQpXxAYSW1hZ2UgQ2VsbCAodm9sdW1lX2hpZ2gpXxAVU3RhdGljIFRleHQg -KDE6MjM6NDUpXxASZmlsbFNjcmVlbkJ1dHRvbi0xXxAbVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwp -WkltYWdlIENlbGxfEBdUZXh0IEZpZWxkIENlbGwgKDAwOjAwKV8QKVNxdWFyZSBUZXh0dXJlZCBCdXR0 -b24gKE5TUmVtb3ZlVGVtcGxhdGUpXxAlVGV4dCBGaWVsZCBDZWxsIChWTEMgRnVsbCBTY3JlZW4uYXZp -KV8QIVN0YXRpYyBUZXh0IChWTEMgRnVsbCBTY3JlZW4uYXZpKV8QpkltYWdlIENlbGwgKE5TSW1hZ2Ug -MHgxOTc1MDI5MCBTaXplPXsxNiwgMTZ9IFJlcHM9KAogICAgTlNDYWNoZWRJbWFnZVJlcCAweDE5NzUw -MzMwIFNpemU9ezE2LCAxNn0gQ29sb3JTcGFjZT1OU0NhbGlicmF0ZWRSR0JDb2xvclNwYWNlIEJQUz04 -IFBpeGVscz0xNngxNiBBbHBoYT1ZRVMKKSlfEBdJbWFnZSBDdXN0b21pemVkIFNsaWRlcl8QF0ltYWdl -IENlbGwgKHZvbHVtZV9sb3cpXxAaQmV2ZWwgQnV0dG9uICh2b2x1bWVfaGlnaClfEBFCdXR0b24gQ2Vs -bCAoRml0KV8QE0hvcml6b250YWwgU2Nyb2xsZXJcQXN5bmMgQXJyb3dzXxArU3F1YXJlIFRleHR1cmVk -IEJ1dHRvbiAoTlNMaXN0Vmlld1RlbXBsYXRlKVtTbGlkZXIgQ2VsbF5Db250ZW50IFZpZXctMVtTY3Jv -bGwgVmlld18QElRhYmxlIFZpZXcgKHRpdGxlKV8QFkJldmVsIEJ1dHRvbiAoZnNfcGxheSlfEBdUb29s -YmFyTWVkaWFEZXNjcmlwdGlvbl8QGkltYWdlIENlbGwgKGZzX2JhY2tncm91bmQpXxAZSW1hZ2UgQ3Vz -dG9taXplZCBTbGlkZXItMV8QGkltYWdlIENlbGwgKGZzX3ZvbHVtZV9tYXgpXxARVmVydGljYWwgU2Ny -b2xsZXJfEBNCZXZlbCBCdXR0b24gKHBsYXkpXxAUcGxheWxpc3RUb2dnbGVCdXR0b25fEB1UZXh0IEZp -ZWxkIENlbGwgKFRleHQgQ2VsbCktMV8QE1ZlcnRpY2FsIFNjcm9sbGVyLTFfEBlUZXh0IEZpZWxkIENl -bGwgKDE6MjM6NDUpXFNlYXJjaCBGaWVsZF8QEmZ1bGxTY3JlZW5CdXR0b24tMV8QF1Rvb2xiYXJNZWRp -YUF1ZGlvVm9sdW1lV1Rvb2xiYXJbQXBwbGljYXRpb25fECxUb29sYmFyIEZsZXhpYmxlIFNwYWNlIEl0 -ZW0gKEZsZXhpYmxlIFNwYWNlKV8QHkJ1dHRvbiBDZWxsIChOU1JlbW92ZVRlbXBsYXRlKV5PbmUgU3Bs -aXQgVmlld18QGkltYWdlIFZpZXcgKGZzX3ZvbHVtZV9tYXgpXxATT3V0bGluZSBWaWV3IChuYW1lKV8Q -FUJldmVsIEJ1dHRvbiAoQnV0dG9uKV8QGEJ1dHRvbiBDZWxsICh2b2x1bWVfbG93KV8QIkJldmVsIEJ1 -dHRvbiAoc2tpcF9mb3J3YXJkX2FjdGl2ZSlfEBhCZXZlbCBCdXR0b24gKGZzX3Jld2luZClfEBNUb29s -YmFyTWVkaWFDb250cm9sXEZpbGUncyBPd25lcl8QG0J1dHRvbiBDZWxsIChOU0FkZFRlbXBsYXRlKV8Q -FFRhYmxlIENvbHVtbiAoc3RhdGUpXxAUQnJvd3NhYmxlIFZpZGVvIFZpZXdfEBNCdXR0b24gQ2VsbCAo -Rml0KS0xXxAYSW1hZ2UgVmlldyAodm9sdW1lX2hpZ2gpXxAUQnV0dG9uIENlbGwgKEJ1dHRvbilfEBpU -b29sYmFyIFNwYWNlIEl0ZW0gKFNwYWNlKV8QEkJ1dHRvbiBDZWxsIChwbGF5KV8QF0ltYWdlIFZpZXcg -KHZvbHVtZV9sb3cpXxAeU3RhdGljIFRleHQgKCV7dmFsdWUxfUAgaXRlbXMpXxAjQmV2ZWwgQnV0dG9u -IChza2lwX3ByZXZpb3VzX2FjdGl2ZSlcTWVkaWEgUGxheWVyXVNsaWRlciBDZWxsLTNdU2Nyb2xsIFZp -ZXctMV8QEVNlYXJjaCBGaWVsZCBDZWxsXxAaRnVsbFNjcmVlbkNvbnRyb2xsZXJXaW5kb3dfEBVCdXR0 -b24gQ2VsbCAoZnNfcGxheSlfEBFIb3Jpem9udGFsIFNsaWRlcl8QFk1lZGlhIEFycmF5IENvbnRyb2xs -ZXJfEBlCZXZlbCBCdXR0b24gKHZvbHVtZV9sb3cpXxAiQnV0dG9uIENlbGwgKHNraXBfcHJldmlvdXNf -YWN0aXZlKVpJbWFnZSBWaWV3WlNwbGl0IFZpZXdfEBdCdXR0b24gQ2VsbCAoZnNfcmV3aW5kKV8QFk1h -aW4gV2luZG93IENvbnRyb2xsZXJfECJUZXh0IEZpZWxkIENlbGwgKCV7dmFsdWUxfUAgaXRlbXMpXxAU -VGFibGUgQ29sdW1uICh0aXRsZSlfEBVIb3Jpem9udGFsIFNjcm9sbGVyLTFdU2xpZGVyIENlbGwtMl8Q -Gm1lZGlhUmVhZGluZ1Byb2dyZXNzU2xpZGVyXxATVGFibGUgQ29sdW1uIChuYW1lKV8QIEJ1dHRvbiBD -ZWxsIChOU0xpc3RWaWV3VGVtcGxhdGUpXENvbnRlbnQgVmlld11TbGlkZXIgQ2VsbC0xW0N1c3RvbSBW -aWV3XxAiQnV0dG9uIENlbGwgKE5TTGlzdFZpZXdUZW1wbGF0ZSktMdIADgA+APgL5YAqpAVDBwYFQgEm -gQE0gQGAgQEvgIHSAA4APgD4C+yAKqQF6gcZBeoCk4EBMIEBgYEBMICC0gAOAD4A+AvzgCqvEJcIWAPo -BckH/wZwBMwFQQSrBMoJ5gS2AsEH+gTlBeYCCAU8BMMFPwVIBLIEXwVrBtACwAWBBM4FPgTLBMkEvwQb -BUMB1ASsBNMH+QTUCEYEqQO/ASQBIQK0A9kG5wUdBM8FRQa8BMgE0QVNA8kDWQVCB/cHQgWsAwAFmQS7 -ASUFRwSuB+cEuATBAFkKEACFBNACxwStASYEqgBBBUADEwVEBMUH9QgeBNoEwAVGBKYEvASlBM0E4gAf -BLcC3gQSBKIEsAKbBLUGjQEjBhQAhgSkB0kEswEiASACwgeFBsoF/AasAjoH+AUYBjcEuQEfBwYExwTG -B/YHjAU9BKgErwTEBLQEsQS6BL4CnAZUBL0E2wTSAWcC+AQTBKMBLgNIBssIMwBOBKcCswhsAacEwoEB -3IDFgQEsgQHIgQFTgQIqgQEpgQF/gQIjgQJPgQG0gJKBAd6A+4EBM4BlgQEPgQH+gQEfgQFYgQGkgOCB -ARiBAXGAjYEBG4ECMIEBGYECJ4ECIYEB5YDQgQE0gF2BAZGBAkWBAdqBAkuBAdiBAXuA5YBogEyAv4DD -gQF2gQEMgQIxgQFDgQFsgQIegQI+gQESgOOAp4EBL4EB0oEBlIEBJoC1gQEhgQG8gG2BAVGBAZ2BAcOB -AbeBAeyAC4ECUYARgQI0gI+BAZOAgYEBfYAHgQEjgJuBATqBAg6BAcaBAdCA+IEB54EBSoEBZYEBvoEB -Y4ECLYD5gAKBAbaAlIDMgPWBAaCAhYEBs4EBWoBigQE8gCGBAWKBAZaBAbCAU4A8gJeBAaaBAW+BATeB -AWaAb4EB1oEBBYEBRYEBuYAzgQGAgQIbgQIUgQHOgQGogQEVgQFrgQGfgQIIgQGxgQGigQG6gQHCgImB -AUyBAcCA9oECQoA+gLmA3YEBBIA1gKGBAXSBAdSAMIEBaYCLgQHggE6BAfTSAA4APgD4DI2AKq8QlwyO -DI8MkAyRDJIMkwyUDJUMlgyXDJgMmQyaDJsMnAydDJ4MnwygDKEMogyjDKQMpQymDKcMqAypDKoMqwys -DK0MrgyvDLAMsQyyDLMMtAy1DLYMtwy4DLkMugy7DLwMvQy+DL8MwAzBDMIMwwzEDMUMxgzHDMgMyQzK -DMsMzAzNDM4MzwzQDNEM0gzTDNQM1QzWDNcM2AzZDNoM2wzcDN0M3gzfDOAM4QziDOMM5AzlDOYM5wzo -DOkM6gzrDOwM7QzuDO8M8AzxDPIM8wz0DPUM9gz3DPgM+Qz6DPsM/Az9DP4M/w0ADQENAg0DDQQNBQ0G -DQcNCA0JDQoNCw0MDQ0NDg0PDRANEQ0SDRMNFA0VDRYNFw0YDRkNGg0bDRwNHQ0eDR8NIA0hDSINIw0k -gQK6gQK7gQK8gQK9gQK+gQK/gQLAgQLBgQLCgQLDgQLEgQLFgQLGgQLHgQLIgQLJgQLKgQLLgQLMgQLN -gQLOgQLPgQLQgQLRgQLSgQLTgQLUgQLVgQLWgQLXgQLYgQLZgQLagQLbgQLcgQLdgQLegQLfgQLggQLh -gQLigQLjgQLkgQLlgQLmgQLngQLogQLpgQLqgQLrgQLsgQLtgQLugQLvgQLwgQLxgQLygQLzgQL0gQL1 -gQL2gQL3gQL4gQL5gQL6gQL7gQL8gQL9gQL+gQL/gQMAgQMBgQMCgQMDgQMEgQMFgQMGgQMHgQMIgQMJ -gQMKgQMLgQMMgQMNgQMOgQMPgQMQgQMRgQMSgQMTgQMUgQMVgQMWgQMXgQMYgQMZgQMagQMbgQMcgQMd -gQMegQMfgQMggQMhgQMigQMjgQMkgQMlgQMmgQMngQMogQMpgQMqgQMrgQMsgQMtgQMugQMvgQMwgQMx -gQMygQMzgQM0gQM1gQM2gQM3gQM4gQM5gQM6gQM7gQM8gQM9gQM+gQM/gQNAgQNBgQNCgQNDgQNEgQNF -gQNGgQNHgQNIgQNJgQNKgQNLgQNMgQNNgQNOgQNPgQNQEQFREQKTEQGZEQFLEQHFEQH7EQGWEQKwEQLN -EQF1EQHAEQKaEQE7EQFoEQGjEQHtEQGXEQJtEQGUEQHDEQIkEQKPEQGhEQE4EQKcEQGcEQIPEQGTEQLO -EQLMEQIDEQKUEQGLEQHvEQHGEQJ2EQE8EQJ5EQFQEQKKEQKiEQHmEQKIEQKLEQE2EQGKEQIKEQGuEQK7 -EQKsEQGYEQKJELERAYwRAT8RAVoRAZoQrhEBmxECShECoxEBwhEBwREBOhEBpRECvhECKRP///////// -/RECLxECrxECnRECBBECqRECQxEBlRCvEQGsEQLJEQFCEQFNEQFXEQLiEQGwEQINEQG/EQG6EQLQEQFT -EQLjEQG5EQKbEQKNEQIFEQIZEMARAgYRAcQRAewRAa0RAi4RArIRAWURAkkRAeoRAfYQrBEBXxEBIxEB -pBEBqBECpBEBPREBiREBrxECMREB6xEB/BECHREC3hEBQBEBYBEBjhECJREBuBECxhEByBECsRECqxEC -IxECnxEBsRA6EQIBEQK0EQH3EK0RAo4RAiERAe4QsBEBJREBThECqhECnhEBUhEB5xECuNIADgA+AQAN -uoAsoNIADgA+APgNvYAqoNIADgA+APgNwIAqoNIANwA4DcINw6INwwA7Xk5TSUJPYmplY3REYXRhAAgA -GQAiACcAMQA6AD8ARABSAFQAZgcUBxoHZQdsB3MHgQeTB68HvQfJB9UH4wfuB/wIGAgmCDkISwhlCG8I -fAh+CIEIhAiHCIoIjAiPCJEIlAiXCJoInQifCKEIpAinCKoIrQi2CMIIxAjGCNQI3QjmCPEI9gkFCQ4J -IQkqCTUJNwk6CTwJbQl6CYcJlQmfCa0JxgnTCeUJ+QoDCg8KEQoTChUKFwocCh4KIAoiCiQKJwopCisK -RQpJClcKjAqmCsgK4gsECxgLNQtJC2ULiAulC7wL0gvUC9YL1wvZC9oL3AveC+AL4QviC+QL5gvvC/kL -+wwiDCsMMgxEDE0MWgxiDGQMaQxrDG0Mcgx0DHYMkwyoDO8NEQ03DUsNYg14DZMNqQ3GDeAN/A4TDiYO -PQ5UDmkOfg6ADoIOhA6GDocOiQ6KDowOjQ6PDpEOkw6cDp4OoA6iDqQOpQ60DrsOxw7sDvQPCA8WDyEP -Lg88D0YPUw9VD1cPXA9dD18PYA9lD2cPaQ92D4UPhw+JD4sPkw+lD64Psw/GD9MP1Q/XD9kP7A/1D/oQ -BRAOEBUQIxBqEGwQbhBwEHEQcxB0EHYQdxB5EHsQfRB/EIEQgxCFEIsQkxCcEMEQwxDFEMYQyBDJEMsQ -zRDWEN0Q5hDtEQMREBEZERsRIBEiESQRLREyEToRQxFFEUoRTBFOEVcRXhFtEXYReBF5EYIRhxGREZwR -uRHLEdYR3xHrEfQSABICEgQSBhIJEgsSDRIPEhgSGhIrEi0SLxIxEjMSNRI3EjkSOxJcEmQSaxJ1EncS -eRJ7En0SgBKBEoMShRKbEtQS3BLoEv4TExMeEygTNhNBE0wTWRNkE3ITjxOYE6EToxOlE6cTqROyE7sT -wBPBE8IT0xPaE+ET6hPsE/UT9xP6FAcUEBQVFBwUJRQuFDsUSBRRFFwUZRRvFHYUghSjFKUUpxSpFKsU -rhSvFLEUsxTLFPAVBBUaFSYVKxUtFS8VMRUzFTUVOhU8FT4VURViFWQVbRVvFXIVdxWMFZQVoRWtFbsV -vRW/FcEVwxXFFcwV2RXmFe4V8BXyFf4WBxYMFiEWIxYlFicWKRY8FkkWSxZOFlcWYBZyFnsWhhaSFrMW -tRa3FrkWuxa+Fr8WwRbDFtoXDxclFzMXSBdXF2kXexeJF44XkBeSF5QXlheYF5oXnBeeF6AXohenF7AX -vRe/F8EXwxfYF+EX6hf3GAAYCxgUGD0YSBhUGFYYWBhaGFsYXRhfGGIYYxhlGGcYcBhyGH8YgRiDGIUY -hxiJGIsYpxjDGNsZDxkwGU0ZVhldGWoZcBmEGaUZrRm1Gb0ZyBnNGc8Z0RnWGdcZ5BnmGegZ6hn1Gf4a -BRoRGhoaJRoxGloaXBpeGmAaYRpjGmUaZhpoGmoacxp1GoIahBqGGogaihqMGo4apRrGGsgayhrLGtga -2hrcGt4a6hsTGx0bKhssGy4bMBs5G0IbRRtHG0obTBtOG1MbVRteG2MbbhuFG44blxutG84b0BvSG9Qb -1hvXG9kb2xvyHCccPBxPHGMceByLHJAckhyUHJYcmByaHJwcoRyiHKQcphyoHL0cvxzBHMMcxRzbHOgc -6hztHR4dJx0wHTIdNB02HTgdOh08HT8dQR1GHU0dYx2YHb4dwB3CHcQdxh3IHcodzB3SHdsd3R3gHeId -7x3xHfYd+B36Hf8eAR4DHhEePR5EHloeYx5uHoIeix6YHqYe0x7pHvgfBR8HHwkfCx8NHw8fEh8UHxYf -GB8ZHysfNx9AH0IfRx9JH0sfaB9qH2wfbh9wH3IfdB9/H5cfoB+pH7Yf1x/ZH9sf3R/fH+Ef4x/sH+4f -8x/1H/cgGCAaIBwgHiAgICIgJCAmIC8gMSA4IDogPCA+IF8gYSBjIGUgZyBoIGogbCCCILcguSC7IL0g -vyDBIMMgxSDOINsg3SDfIOEg9CEVIRchGSEbIR0hHiEgISIhOCFtIW8hcSFzIXUhdyF5IXshiCGKIYwh -jiGcIdEh3SHmIfMh/yINIhsiHSIfIiEiIyImIigiOyI9Ij8iQSJDIkUiTiJQIlciWSJbIl0iiiKUIp4i -qCKqIqwiriKwIrIitSK3IrkiuyK9Ir8iyCLKIs0izyMiI0QjTiN9I5IjnyO5I9Uj8CP8JBskKiQ2JDgk -OiQ/JEAkQiRDJEUkTiRXJFokXCRdJF8kYSRjJGUkZyRwJHskjCSOJJAkkiSbJLIkuyTEJNIk2yTdJOAk -4iUPJR4lKyU4JUAlSyVaJXYlgSWMJZglmSWbJZ0lnyWoJaolrCW1Jb4lwCXdJeIl5CXmJegl6iXsJfkl -+yYHJhwmHiYgJiImJCY2Jj8mSiZeJn8mhCaGJogmiiaMJo4mkyaVJp8mtCa2Jrgmuia8JtUm4ibtJvkm -+yb9Jv4nBycQJxUnKCcxJzYnRCdZJ1snXSdfJ2Enayd4J3onfyeIJ5Unoye6J8MnzCfXJ/woBigIKAoo -DCgOKBAoEigUKB0oNShCKEsoVihhKIoojCiOKJAokiiUKJYomCihKL0o1SjeKOco9Cj/KT4pUSlTKVUp -VylZKVwpXilgKWIpdSl3KXkpeyl9KX8piCmKKZUplymZKZspnSmfKcwpzinQKdIp1CnWKdgp2incKd4p -5ynpKewp7ipFKlIqZCpmKmgqbSpvKnEqcip0KnYqdyp5KnsqfSp/KooqpyqpKqsqrSqvKrEqsyrgKuIq -5CrmKugq6irsKu4q8CryKvwrBSsOKyIrOys9Kz8rQStDK0UrXCtlK2crbCtuK3ArnSuqK6srrSuvK7Er -uiu8K70rvyvFK+Ir5CvmK+gr6ivsK/kr+ywgLCIsJCwmLCssLCxBLE4sVSxXLFksXixgLGIsayx0LHYs -eSx7LIQshiyLLI0sjyyoLL8s0izlLP8tFy0ZLRstHS0fLSFCl0KzQrxCw0LWQuFC7kLwQvVC/kMDQxRD -FkMYQxpDR0NIQ0pDTENOQ1dDWUNiQ2NDZUNrQ4hDikOMQ45DkEOSQ7NDuEO6Q7xDvkPAQ8JDxUPHQ9BD -20PzRBhEGkQcRB5EIEQiRCREJkQvREhEcURzRHVEd0R5RHtEfUR/RIhEoESpRKtErkSwRMZE30T4RQFF -CkUiRStFMEU/RUpFU0VaRXJFfUWGRYtFnkWnRalGEkYURhdGGkYdRiBGI0YmRilGLEYvRjJGNUY4RjtG -PkZBRkRGR0ZKRk1GUEZTRlZGWUZcRl9GYkZlRmhGa0ZuRnFGdEZ3RnpGfUaARoNGhkaJRoxGj0aSRpVG -mEabRp5GoUakRqdGqka7RslG0kbaRt1G30bhRuRG7UbvRvFHC0coRypHLEcuRzBHM0c0RzZHT0dRR1NH -VkdZR1xHXkd0R61HwEfFR8dHyUfLR81Hz0fSR9RH1kfYR91H4kfzR/VH/kgASANIEEgSSBRIFkgsSDlI -O0g9SEBIVEhdSF9IfkiHSI5IpUi0SMVIyEjKSM1I0EkJSSJJLEkvSTFJNEk3STpJQ0lGSUlJTElPSVFJ -VElXSXFJeEmYSaFJo0moScVJzknrSe5J8EnzSfZJ+Un8SgVKB0oiSiVKKEorSi5KMUo0SjdKOko9SkBK -Q0pGSklKckp1SndKeEp7Sn5KgUqCSoVKiEqRSpNKoEqiSqRKpkqoSqpKrEq2StdK2UrcSt1K6krsSu5K -8Ur/SyhLK0stSzBLMUs0SzdLOEs7Sz5LR0tJS1ZLWEtaS1xLXktgS2JLekuXS5lLmku7S75LwEvDS8ZL -x0vKS81L5UwGTAhMCkwNTA9MEkwXTBpMMExFTEdMSUxMTE5MWkx7TH5MgEyDTIZMh0yKTI1MpUzGTMhM -ykzNTM9M0kzXTNpM4k0LTQ5NEE0TTRRNF00aTRtNHk0hTSpNLE05TTtNPU0/TUFNQ01FTV1Nfk2ATYNN -hE2RTZNNlU2YTaZNz03STdRN103YTdtN3k3fTeJN5U3uTfBN/U3/TgFOA04FTgdOCU4fTkBOQk5FTkZO -U05VTldOWk5pTpJOlU6XTppOnU6gTqNOpE6nTqpOrU7ITt9PGE8hTyNPJU8nTypPL08wTzFPWk9dT19P -Yk9lT2hPaU9sT29Pck+KT8NPzE/OT9BP00/WT99P4E/hT/JP9E/9UABQClArUC5QMFAzUDZQN1A6UD1Q -VFCNUI9QkVCUUJdQmVCcUJ9QolCrULJQw1DFUM5Q0FDTUOBQ4lDkUOdQ8lD/UQFRA1EGUR1RPlFBUUNR -RlFJUUpRTVFQUWdRoFGiUaRRp1GqUaxRrlGxUbRRvVHKUcxRzlHRUdlR5lHoUepR7VIBUiJSJVInUipS -LVIuUjFSNFJLUoRShlKIUotSjlKQUpJSlVKYUqVSp1KpUqxStlLDUsVSx1LKUuBTAVMEUwZTCVMMUw1T -EFMTUytTZFNmU2hTa1NuU3BTclN1U3hTgVOOU5BTklOVU7RTwVPDU8VTyFPdU/5UAVQDVAZUCVQKVA1U -EFQoVFlUYlRkVGZUaFRqVG1Ub1RyVHdUe1SFVJxUrVSwVLJUtFS3VMhUy1TOVNFU1FT0VQVVCFULVQ1V -EFUZVRtVHlUtVTlVSlVNVU9VUVVUVWJVc1V2VXlVe1V+VZ9VolWkVadVqlWtVa9VslW7Vb1VwlXFVchV -6VXsVe5V8VX0VfVV+FX7VhJWM1Y8Vj5WQFZDVkVWSFZNVlBWVlZjVmlWa1ZyVpNWllaYVptWnlafVqJW -pVa8VvVW+lb8Vv9XAlcFVwZXB1cQVxJXHFc2V0dXSldMV05XUVdcV21XcFdyV3RXd1eCV5NXlleZV5tX -nlfLV+hX/1gRWCBYRVhgWHlYelh8WH1YgFiBWIRYh1iIWItYjFiNWKdYu1jEWMZY21jeWOFY5FjnWOpY -7VjwWPNY9lj5WRBZF1k1WUJZRVlLWVZZX1lxWXZZe1l+WYdZjFmjWbRZt1m6Wb1ZwFnTWeRZ51nqWexZ -71oMWg5aEFoTWhZaF1oZWi9aaFpqWmxab1pxWnRadlp4WntaflqDWpRallqYWqVap1qpWqxasVq+WsBa -wlrFWs9a8FsBWwRbB1sKWw1bGlsrWy5bMVs0WzdbSFtLW01bT1tSW1xbbVtwW3JbdFt3W4BbkVuUW5Zb -mFubW6RbplutW7Bbs1u1W9Jb1FvWW9lb3FvdW99b9VwuXDBcMlw1XDhcO1w9XD9cQlxPXFFcU1xWXG1c -elx8XH5cgVyWXJ9coVyqXMBc0VzUXNZc2FzbXOxc71zyXPVc+F0LXRxdH10iXSRdJ104XTtdPl1BXURd -W11sXW9dcl11XXhdiV2MXY9dkl2VXatdvF2/XcFdw13GXddd2l3cXd5d4V3vXgBeA14FXgdeCl4fXjBe -M142XjlePF5XXmhea15tXm9ecl6KXptenl6hXqNepl7HXspezF7PXtJe1V7XXtpe417lXvJe9V74Xvte -/l8BXwRfJV8oXypfLV8wXzFfNF83X09fiF+KX4xfj1+UX5dfml+cX55foV+qX7dfuV+7X75f2l/nX+lf -61/uYAlgC2AsYC9gMWA0YDdgOGA7YD5gVGCNYI9gkWCTYJVgmGCaYJxgn2CoYLFgs2DUYNdg2WDcYN9g -4GDjYOZg/mEzYTVhN2E5YTxhPmFAYUNhTGFOYW9hcmF0YXdhemF7YX5hgWGZYcphzGHOYdFh1GHWYdlh -4mHkYgViCGIKYg1iEGIRYhRiF2IuYmdiaWJrYm1ib2JyYnRidmJ5YoJihGKlYqhiqmKtYrBisWK0Yrdi -zmMHYxBjEmMVYxdjGmMbYxxjJWMnYzFjS2NcY19jYWNjY2ZjbWOKY5RjnmO9Y8BjwmPFY8hjymPNZBJk -GmRWZF9kZmR+ZJ9kqWSsZK5ksWS0ZLdkumS9ZNtk4WT4ZQVlCGULZQ5lEWUUZS1lSWVSZVdleGV7ZX5l -gWWEZYZliWWMZalls2XAZcNlzmXRZdRl12XaZd1l6GXqZexl72XxZfNmEmYrZj9maGZ2ZqBmwWbEZsdm -ymbNZs9m0mbVZwRnG2c0Z0FnRGdRZ1RnV2daZ11nYGdjZ3Bncmd0Z3ZneGd6Z3xnkGejZ8Bn22f5aBpo -HWgfaCJoJWgoaCtoLmhLaFNoZ2h0aHdofGh/aIJoh2iJaIxol2i8aNJo1WjXaNpo3WjgaONo5mjpaQpp -E2kqaTdpOmlDaUZpSWlMaU9pWGlbaV5pYWlkaYVpiGmKaY1pkGmSaZVpmGncaeNp8GnzafZp+Wn8af9q -EWouajFqM2o2ajlqO2o+alxqc2qQapNqlWqYaptqnmqhasdq5msHawprDWsQaxNrFWsYaxtrKGsray5r -MWs0azZrW2tea2FrZGtna2prbGtva3JroWu4a8VryGvLa85r0WvTa/Br82v1a/hr+2v+bAFsKmxMbGls -bGxvbHJsdWx3bHpskGydbLpsvWy/bMJsxWzIbMts6W0AbR1tIG0ibSVtKG0rbS5tS21ObVBtU21WbVlt -XG1+bZltum29bcBtw23Gbchty23ObfxuI24wbjNuTG5PblJuVW5YbltuXm5hbmRuZ25qbm1ucG6Jbotu -jW6PbpFuk26Vbpdumm6cbp5uoG6ibr9u2W72bx9vPW9Gb2NvZm9pb2xvb29xb3Rvj2+Xb6lvym/Nb9Bv -02/Wb9lv22/ecANwFnA3cDpwPHA/cEJwRHBHcEpwd3CNcKVwsnC1cLhwu3C+cMFw53EIcQtxDXEQcRJx -FXEXcRpxO3FVcV5xYHIpcixyLnIxcjRyN3I6cj1yP3JCckRyR3JJckxyT3JSclRyV3JaclxyX3JicmRy -Z3Jpcmxyb3JxcnNydXJ3cnlyfHJ/coJyhXKIcopyjHKPcpJylXKYcppynXKfcqJypXKncqpyrHKucrBy -snK1crdyunK9csBywnLFcsdyyXLLcs1y0HLSctVy13Lactxy3nLgcuNy5nLpcuxy7nLxcvRy93L5cvxy -/3MCcwVzB3MKcwxzDnMQcxJzFHMWcxlzHHMecyBzI3Mlcy5zQXNEc0VzTnNVc3BzfXOGc4hzi3OZc6Jz -pHRtdHB0cnR1dHh0e3R+dIB0gnSFdId0inSMdI90knSVdJd0mnSddJ90onSldKd0qnSsdK90snS0dLZ0 -uHS6dLx0v3TCdMV0x3TKdMx0znTRdNR01nTZdNt03nTgdON05XTndOl063TtdO908XT0dPZ0+XT8dP91 -AXUEdQZ1CHUKdQx1D3URdRR1FnUZdRt1HXUfdSF1JHUndSl1K3UudTB1M3U1dTd1OnU9dUB1QnVFdUd1 -SXVLdU11T3VRdVR1V3VZdVt1XnVgdWl1a3Y2djl2PHY+dkF2RHZHdkp2TXZPdlF2VHZXdll2XHZfdmF2 -ZHZndml2bHZvdnF2dHZ2dnl2fHZ+doB2gnaFdoh2inaMdo92knaVdph2m3addqB2o3aldqd2qnasdq92 -sna0drd2uXa7dr12v3bCdsR2x3bKds12z3bSdtR21nbYdtp23HbfduF25Hbmdul263btdvB283b2dvl2 -+3b9dwB3A3cGdwh3C3cOdxF3FHcWdxl3G3cddx93IXcjdyZ3KHcrdy13MHcydzR3PXc/eAp4DXgQeBN4 -FngZeBx4H3gieCV4KHgreC54MXg0eDd4Ong9eEB4Q3hGeEl4THhPeFJ4VXhYeFt4XnhheGR4Z3hqeG14 -cHhzeHZ4eXh8eH94gniFeIh4i3iOeJF4lHiXeJp4nXigeKN4pnioeKt4rnixeLR4t3i6eL14wHjDeMZ4 -yXjMeM940njVeNh423jeeOF45HjneOp47XjwePN49nj5ePx4/3kCeQV5CHkLeQ55EXkUeRd5GnkdeSB5 -I3kmeSl5LHkveTJ5NXlReW95g3mtedp5+Hoaei56Unp7eol6pnrBetl67nsMexd7MXtde4V7qXxSfGx8 -hnyjfLd8zXzafQh9FH0jfS99RH1dfXd9lH2wfc194X33fg5+Ln5EfmB+bX6Cfpx+pH6wft9/AH8Pfyx/ -Qn9af3V/mn+1f8t/2H/2gA2AJIA6gFWAbICJgJ6AuIDZgP+BDIEagSiBPIFZgXGBhYGegbqB34HqgfWC -D4Iogk2CZIJ8goqCp4K9guCC7YL7gweDLIM1gzeDQINDg0aDSYNLg1SDVoNfg2KDZYNog2qDc4N1hKaE -qYSrhK6EsYS0hLeEuoS9hMCEw4TGhMiEy4TNhNCE0oTVhNiE24TehOGE44TmhOmE64TuhPGE9IT3hPqE -/YT/hQKFBIUHhQqFDYUQhROFFoUYhRqFHIUehSCFI4UmhSmFLIUvhTKFNYU4hTqFPIU/hUKFRYVIhUqF -TYVQhVKFVYVYhVuFXoVhhWOFZoVohWuFbYVwhXKFdYV3hXqFfIV/hYKFhYWIhYqFjYWQhZOFloWZhZyF -noWghaOFpYWnhamFrIWuhbGFtIW2hbmFu4W+hcGFxIXGhciFyoXNhdCF04XWhdiF24XeheGF5IXmhemF -7IXvhfKF9YX4hfuF/oYBhgSGB4YKhg2GD4YShhWGF4YahhyGHoYghiOGJYYnhiqGLYYvhjKGNIY3hjmG -PIZFhkeHeId7h36HgYeEh4eHioeNh5CHk4eWh5mHnIefh6KHpYeoh6uHroexh7SHt4e6h72HwIfDh8aH -yYfMh8+H0ofVh9iH24feh+GH5Ifnh+qH7Yfwh/OH9of5h/yH/4gCiAWICIgLiA6IEYgUiBeIGogdiCCI -I4gmiCmILIgviDKINYg4iDuIPohBiESIR4hKiE2IUIhTiFaIWYhciF+IYohliGiIa4huiHGIdIh3iHqI -fYiAiIOIhoiJiIyIj4iSiJWImIibiJ6IoYikiKeIqoitiLCIs4i2iLmIvIi/iMKIxYjIiMuIzojRiNSI -14jaiN2I4IjjiOaI6YjsiO+I8oj1iPiI+4j+iQGJBIkHiQqJDYkQiROJFokZiRyJH4kiiSWJKIkriS6J -MYk0iTeJOok9iUCJQ4lGiUmJTIlPiVKJVYlYiVuJXolhiWSJZ4lqiW2JcIlziXaJeYl8iX+JgomFiYiJ -i4mOiZGJlImXiZqJnYmgiaOJpompiayJr4myibWJuIm7ib6JwYnEiceJyonNidCJ04nWidmJ24neieGJ -5InniemJ7InvifKJ9Yn4ifuJ/ooBigSKDYoQihOKFooZihyKH4oiiiSKJ4oqii2KMIozijaKOYo8ij+K -QopFikiKS4pOilGKVIpXilqKXIpfimKKZYpoimuKbopxinSKd4p6inyKf4qCioWKiIqLio6KkYqUipeK -moqdiqCKo4qmiqmKrIqvirKKtYq4iruKvorBisSKx4rJisyKz4rSitSK14rait2K34riiuWK6Irriu6K -8Yr0iv2K/4sAiwmLC4sMixWLF4sYiyGLJgAAAAAAAAICAAAAAAAADcQAAAAAAAAAAAAAAAAAAIs1A - - - diff --git a/projects/macosx/vlc_app/Icons/applications-internet.png b/projects/macosx/vlc_app/Icons/applications-internet.png deleted file mode 100644 index d4bfb82bf5ea468d4789250270c7ec56a60d872e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1397 zcmV-*1&aEKP)1bYGh^@C>+khC4vs$(JCL-sV`xw*3MK+2Z6$;dLV&n{gb?BY z7d{G7D%4Zes!|R;R4BA6ZB_M>RssbQKoMAAoY*EQ4jVgOd)HrUuXlE5cV~8H-nR!# zY9E?%>LWdRZ@=gN{`J@MDEyB)dh~e}7&aTChpI*U-1zwEEZ?D&{{quudy?-sX6!!O z^&9P~7xsm~jD&@u;e?Uda-sO_m+$}L!gmHAKk?d#+tPk6TX33t`}UIPY$MhXMUR9C zsS37TW@&MauV&|oY4VD>mKh!&KkeNT{L<@xcy%`Kz3E5ll>P&~40gw<*Ptg6CDGc5 zrU*J3byArvT%mCBi|Z^ct$LZ2{DHHlpSiJ<6#|e_Hhui@bpHp_*;jsgB&j4j+Zark zMCCDyy(7F?>ZoeZFSF>-QICd!d$gv?# zjC2yKGtk0eKtTbd1iAgi@AbCw@{>myXbI8N-A-FF(bE6mn}6L2)&L$n`PdUvOV&eS zT~{kr2Vbg~u^1s$C89yq178U8#VR+JEj~|ea$|Xmk^LPUJ=l&kqD)<#ABgphy;De? z-@0kV?A+SD`LY+9xSHjT{!aGw-bO?N*9Xf6RRJjkbD1K4d+!ofxkkLHfr;5Qs&DOy7<|@h8Di{SW2m;maRl*M>E~c5!zy5%&>yv`dDR`QrX3_ z9ll;zq2>n!fk4P_277*hheCUk$%iw`>b*z$AKsY?=?NLp^)T^zosgywI5ig6Z3>Qd zQ?ah=1VRu9NgxD5NQ4lSiZ;ueRs4`C|NhU*ExY38x-~bGD;tUeilU&0H7X^WrA-gR ztiulkil%X7c!-+k^YvVo)wNB8ko@FF1DN#@vi5(%0H7+0B3;LuZH!3DZopRy8>Ck) z_IEcElnPAFTxY9Tp-`$4F(Rm;Fir6o$<_vXI^#s^4bsbbN~N-bqRj4690>8}^_AS< zm2|T)b8Q)`Xft(fge!cTLeo@oRz=>J%PGJI zyK>yP|9IwsANDQZF@Up zF1Mwau?E~glFAhLa5~G>^;Jd(+G&m%XsUvcP_S%gejzj0SiSO_v9YlX;O_zh^^U!9 zsT9OVQ6p_X7`YuCkHB-;+hQ;}(9Hec-^1+u3iFFOS@VOywoAopbLl0&ymsNYzy8%l z%d%GZW~J;}n;Os!B=+3%!q4@1*U7u@9AdC9NmXd{BpR4q%#+Qo2gS8zOP6-8KUuff z-BA1F%$YOqPfkuw0hL=_kT{Tx?Y-;p$UP??pIdbfs3EfpRWlJmHSo$=ue3Jl=Vs0s z-fAkF&0YgGzEyh5)3hUs`gR*Yc-y}k;B2?Y|GWMTVhdgsbwpIQ00000NkvXXu0mjf DBA=*} diff --git a/projects/macosx/vlc_app/Icons/dialog-error.png b/projects/macosx/vlc_app/Icons/dialog-error.png deleted file mode 100644 index 3bbbb4a0d3dc2f6bfb653bd25e80169e96c6c833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 653 zcmV;80&@L{P)&6kU&^O z2QZQrnrLJAuq31{O{kZd49Zz&wx!#=YkfunsI` zVC#CnxgmZ#911N=CX)oiVSEDvs4AVaGtSFpiiHBzW;2_C#oquqcsHF)z8smE;c|N$ z=kydD2USH3SVMR5Pfb$Y-Q`oUxSD}i0KTsCbTaw+UMxm?a}#YeKm=7mML`5$&hffQ81ak$9mc{~;YnD+zeVE8^iK72$)87qJ1PqlB~L8>(Z z4<7-f{lK`@KZuGO*xyP-QSD%Q0s!L{aFzDI0Py-$1pq%#>eSCB6oab6myr>-LBzdL zH#|30MBN~@*#an8!20>g3C13}BL5=pI*KP&!5SQ-U8@1CTfox(-X4K?+$GC(kvBT+ zPD4;*@JAw)4i5pAtPE_`TCHrQkf&$rsSCO0ig&9h7(-7qM&sasdb^#?z?KhS8CITG zDzmoF7ad3>a2gHdqJ8xf6)<*)-uMKKa+$*M@oEO%+`3G5U*E!$(NO}njp^-0MR1x; nI`ukVkB+*|i??p$|E%**!bfHvxmb3000000NkvXXu0mjfWCIe6 diff --git a/projects/macosx/vlc_app/Info.plist b/projects/macosx/vlc_app/Info.plist deleted file mode 100644 index 8437fc74e0..0000000000 --- a/projects/macosx/vlc_app/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - org.videolan.vlc - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/projects/macosx/vlc_app/Sources/AppleRemote.h b/projects/macosx/vlc_app/Sources/AppleRemote.h deleted file mode 100644 index 28dce49d4f..0000000000 --- a/projects/macosx/vlc_app/Sources/AppleRemote.h +++ /dev/null @@ -1,199 +0,0 @@ -/***************************************************************************** - * AppleRemote.h - * AppleRemote - * $Id$ - * - * Created by Martin Kahr on 11.03.06 under a MIT-style license. - * Copyright (c) 2006 martinkahr.com. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - ***************************************************************************** - * - * Note that changes made by any members or contributors of the VideoLAN team - * (i.e. changes that were checked in exclusively into one of VideoLAN's source code - * repositories) are licensed under the GNU General Public License version 2, - * or (at your option) any later version. - * Thus, the following statements apply to our changes: - * - * Copyright (C) 2006-2007 the VideoLAN team - * Authors: Eric Petit - * Felix Kühne - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import -#import -#import -#import -#import -#import -#import - -enum AppleRemoteEventIdentifier -{ - kRemoteButtonVolume_Plus =1<<1, - kRemoteButtonVolume_Minus =1<<2, - kRemoteButtonMenu =1<<3, - kRemoteButtonPlay =1<<4, - kRemoteButtonRight =1<<5, - kRemoteButtonLeft =1<<6, - kRemoteButtonRight_Hold =1<<7, - kRemoteButtonLeft_Hold =1<<8, - kRemoteButtonMenu_Hold =1<<9, - kRemoteButtonPlay_Sleep =1<<10, - kRemoteControl_Switched =1<<11, - kRemoteButtonVolume_Plus_Hold =1<<12, - kRemoteButtonVolume_Minus_Hold =1<<13 -}; -typedef enum AppleRemoteEventIdentifier AppleRemoteEventIdentifier; - -/* Encapsulates usage of the apple remote control -This class is implemented as a singleton as there is exactly one remote per machine (until now) -The class is not thread safe -*/ -@interface AppleRemote : NSObject { - IOHIDDeviceInterface** hidDeviceInterface; - IOHIDQueueInterface** queue; - NSMutableArray* allCookies; - NSMutableDictionary* cookieToButtonMapping; - - BOOL openInExclusiveMode; - BOOL simulatePlusMinusHold; - BOOL processesBacklog; - - /* state for simulating plus/minus hold */ - BOOL lastEventSimulatedHold; - AppleRemoteEventIdentifier lastPlusMinusEvent; - NSTimeInterval lastPlusMinusEventTime; - - int remoteId; - unsigned int clickCountEnabledButtons; - NSTimeInterval maxClickTimeDifference; - NSTimeInterval lastClickCountEventTime; - AppleRemoteEventIdentifier lastClickCountEvent; - unsigned int eventClickCount; - - IBOutlet id delegate; -} - -- (int) remoteId; - -- (BOOL) isRemoteAvailable; - -- (BOOL) isListeningToRemote; -- (void) setListeningToRemote: (BOOL) value; - -- (BOOL) isOpenInExclusiveMode; -- (void) setOpenInExclusiveMode: (BOOL) value; - -/* click counting makes it possible to recognize if the user has pressed a button repeatedly - * click counting does delay each event as it has to wait if there is another event (second click) - * therefore there is a slight time difference (maximumClickCountTimeDifference) between a single click - * of the user and the call of your delegate method - * click counting can be enabled individually for specific buttons. Use the property clickCountEnableButtons - * to set the buttons for which click counting shall be enabled */ -- (BOOL) clickCountingEnabled; -- (void) setClickCountingEnabled: (BOOL) value; - -- (unsigned int) clickCountEnabledButtons; -- (void) setClickCountEnabledButtons: (unsigned int)value; - -/* the maximum time difference till which clicks are recognized as multi clicks */ -- (NSTimeInterval) maximumClickCountTimeDifference; -- (void) setMaximumClickCountTimeDifference: (NSTimeInterval) timeDiff; - -/* When your application needs to much time on the main thread when processing an event other events - * may already be received which are put on a backlog. As soon as your main thread - * has some spare time this backlog is processed and may flood your delegate with calls. - * Backlog processing is turned off by default. */ -- (BOOL) processesBacklog; -- (void) setProcessesBacklog: (BOOL) value; - -/* Sets an NSApplication delegate which starts listening when application is becoming active - * and stops listening when application resigns being active. - * If an NSApplication delegate has been already set all method calls will be forwarded to this delegate, too. */ -- (BOOL) listeningOnAppActivate; -- (void) setListeningOnAppActivate: (BOOL) value; - -/* Simulating plus/minus hold does deactivate sending of individual requests for plus/minus pressed down/released. - * Instead special hold events are being triggered when the user is pressing and holding plus/minus for a small period. - * With simulating enabled the plus/minus buttons do behave as the left/right buttons */ -- (BOOL) simulatesPlusMinusHold; -- (void) setSimulatesPlusMinusHold: (BOOL) value; - -/* Delegates are not retained */ -- (void) setDelegate: (id) delegate; -- (id) delegate; - -- (IBAction) startListening: (id) sender; -- (IBAction) stopListening: (id) sender; -@end - -@interface AppleRemote (Singleton) - -+ (AppleRemote*) sharedRemote; - -@end - -/* Method definitions for the delegate of the AppleRemote class */ -@interface NSObject(NSAppleRemoteDelegate) - -- (void) appleRemoteButton: (AppleRemoteEventIdentifier)buttonIdentifier pressedDown: (BOOL) pressedDown clickCount: (unsigned int) count; - -@end - -@interface AppleRemote (PrivateMethods) -- (void) setRemoteId: (int) aValue; -- (NSDictionary*) cookieToButtonMapping; -- (IOHIDQueueInterface**) queue; -- (IOHIDDeviceInterface**) hidDeviceInterface; -- (void) handleEventWithCookieString: (NSString*) cookieString sumOfValues: (SInt32) sumOfValues; -@end - -@interface AppleRemote (IOKitMethods) -- (io_object_t) findAppleRemoteDevice; -- (IOHIDDeviceInterface**) createInterfaceForDevice: (io_object_t) hidDevice; -- (BOOL) initializeCookies; -- (BOOL) openDevice; -@end - -/* A NSApplication delegate which is used to activate and deactivate listening to the remote control - * dependent on the activation state of your application. - * All events are delegated to the original NSApplication delegate if necessary */ -@interface AppleRemoteApplicationDelegate : NSObject { - id applicationDelegate; -} - -- (id) initWithApplicationDelegate: (id) delegate; -- (id) applicationDelegate; -@end diff --git a/projects/macosx/vlc_app/Sources/AppleRemote.m b/projects/macosx/vlc_app/Sources/AppleRemote.m deleted file mode 100644 index 7c52171f36..0000000000 --- a/projects/macosx/vlc_app/Sources/AppleRemote.m +++ /dev/null @@ -1,726 +0,0 @@ -/***************************************************************************** - * AppleRemote.m - * AppleRemote - * $Id$ - * - * Created by Martin Kahr on 11.03.06 under a MIT-style license. - * Copyright (c) 2006 martinkahr.com. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - ***************************************************************************** - * - * Note that changes made by any members or contributors of the VideoLAN team - * (i.e. changes that were exclusively checked in to one of VideoLAN's source code - * repositories) are licensed under the GNU General Public License version 2, - * or (at your option) any later version. - * Thus, the following statements apply to our changes: - * - * Copyright (C) 2006-2007 the VideoLAN team - * Authors: Eric Petit - * Felix Kühne - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import "AppleRemote.h" - -#define MACOS_VERSION [[[NSDictionary dictionaryWithContentsOfFile: \ - @"/System/Library/CoreServices/SystemVersion.plist"] \ - objectForKey: @"ProductVersion"] floatValue] - -const char* AppleRemoteDeviceName = "AppleIRController"; -const int REMOTE_SWITCH_COOKIE=19; -const NSTimeInterval DEFAULT_MAXIMUM_CLICK_TIME_DIFFERENCE=0.35; -const NSTimeInterval HOLD_RECOGNITION_TIME_INTERVAL=0.4; - -@implementation AppleRemote - -#pragma public interface - -- (id) init { - if ( self = [super init] ) { - openInExclusiveMode = YES; - queue = NULL; - hidDeviceInterface = NULL; - cookieToButtonMapping = [[NSMutableDictionary alloc] init]; - - if( MACOS_VERSION < 10.5f ) - { - /* use the traditional cookies for Tiger (and Panther, if it is supported by the frame app) */ - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonVolume_Plus] forKey:@"14_12_11_6_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonVolume_Minus] forKey:@"14_13_11_6_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonMenu] forKey:@"14_7_6_14_7_6_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonPlay] forKey:@"14_8_6_14_8_6_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonRight] forKey:@"14_9_6_14_9_6_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonLeft] forKey:@"14_10_6_14_10_6_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonRight_Hold] forKey:@"14_6_4_2_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonLeft_Hold] forKey:@"14_6_3_2_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonMenu_Hold] forKey:@"14_6_14_6_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonPlay_Sleep] forKey:@"18_14_6_18_14_6_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteControl_Switched] forKey:@"19_"]; - } - else - { - /* we're on Leopard and need to use a new set of cookies */ - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonVolume_Plus] forKey:@"31_29_28_18_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonVolume_Minus] forKey:@"31_30_28_18_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonMenu] forKey:@"31_20_18_31_20_18_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonPlay] forKey:@"31_21_18_31_21_18_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonRight] forKey:@"31_22_18_31_22_18_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonLeft] forKey:@"31_23_18_31_23_18_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonRight_Hold] forKey:@"31_18_4_2_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonLeft_Hold] forKey:@"31_18_3_2_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonMenu_Hold] forKey:@"31_18_31_18_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteButtonPlay_Sleep] forKey:@"35_31_18_35_31_18_"]; - [cookieToButtonMapping setObject:[NSNumber numberWithInt:kRemoteControl_Switched] forKey:@"19_"]; - } - - /* defaults */ - [self setSimulatesPlusMinusHold: YES]; - maxClickTimeDifference = DEFAULT_MAXIMUM_CLICK_TIME_DIFFERENCE; - } - - return self; -} - -- (void) dealloc { - [self stopListening:self]; - [cookieToButtonMapping release]; - [super dealloc]; -} - -- (int) remoteId { - return remoteId; -} - -- (BOOL) isRemoteAvailable { - io_object_t hidDevice = [self findAppleRemoteDevice]; - if (hidDevice != 0) { - IOObjectRelease(hidDevice); - return YES; - } else { - return NO; - } -} - -- (BOOL) isListeningToRemote { - return (hidDeviceInterface != NULL && allCookies != NULL && queue != NULL); -} - -- (void) setListeningToRemote: (BOOL) value { - if (value == NO) { - [self stopListening:self]; - } else { - [self startListening:self]; - } -} - -/* Delegates are not retained! - * http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/chapter_6_section_4.html - * Delegating objects do not (and should not) retain their delegates. - * However, clients of delegating objects (applications, usually) are responsible for ensuring that their delegates are around - * to receive delegation messages. To do this, they may have to retain the delegate. */ -- (void) setDelegate: (id) _delegate { - if (_delegate && [_delegate respondsToSelector:@selector(appleRemoteButton:pressedDown:clickCount:)]==NO) return; - - delegate = _delegate; -} -- (id) delegate { - return delegate; -} - -- (BOOL) isOpenInExclusiveMode { - return openInExclusiveMode; -} -- (void) setOpenInExclusiveMode: (BOOL) value { - openInExclusiveMode = value; -} - -- (BOOL) clickCountingEnabled { - return clickCountEnabledButtons != 0; -} -- (void) setClickCountingEnabled: (BOOL) value { - if (value) { - [self setClickCountEnabledButtons: kRemoteButtonVolume_Plus | kRemoteButtonVolume_Minus | kRemoteButtonPlay | kRemoteButtonLeft | kRemoteButtonRight | kRemoteButtonMenu]; - } else { - [self setClickCountEnabledButtons: 0]; - } -} - -- (unsigned int) clickCountEnabledButtons { - return clickCountEnabledButtons; -} -- (void) setClickCountEnabledButtons: (unsigned int)value { - clickCountEnabledButtons = value; -} - -- (NSTimeInterval) maximumClickCountTimeDifference { - return maxClickTimeDifference; -} -- (void) setMaximumClickCountTimeDifference: (NSTimeInterval) timeDiff { - maxClickTimeDifference = timeDiff; -} - -- (BOOL) processesBacklog { - return processesBacklog; -} -- (void) setProcessesBacklog: (BOOL) value { - processesBacklog = value; -} - -- (BOOL) listeningOnAppActivate { - id appDelegate = [NSApp delegate]; - return (appDelegate!=nil && [appDelegate isKindOfClass: [AppleRemoteApplicationDelegate class]]); -} -- (void) setListeningOnAppActivate: (BOOL) value { - if (value) { - if ([self listeningOnAppActivate]) return; - AppleRemoteApplicationDelegate* appDelegate = [[AppleRemoteApplicationDelegate alloc] initWithApplicationDelegate: [NSApp delegate]]; - /* NSApp does not retain its delegate therefore we keep retain count on 1 */ - [NSApp setDelegate: appDelegate]; - } else { - if ([self listeningOnAppActivate]==NO) return; - AppleRemoteApplicationDelegate* appDelegate = (AppleRemoteApplicationDelegate*)[NSApp delegate]; - id previousAppDelegate = [appDelegate applicationDelegate]; - [NSApp setDelegate: previousAppDelegate]; - [appDelegate release]; - } -} - -- (BOOL) simulatesPlusMinusHold { - return simulatePlusMinusHold; -} -- (void) setSimulatesPlusMinusHold: (BOOL) value { - simulatePlusMinusHold = value; -} - -- (IBAction) startListening: (id) sender { - if ([self isListeningToRemote]) return; - - io_object_t hidDevice = [self findAppleRemoteDevice]; - if (hidDevice == 0) return; - - if ([self createInterfaceForDevice:hidDevice] == NULL) { - goto error; - } - - if ([self initializeCookies]==NO) { - goto error; - } - - if ([self openDevice]==NO) { - goto error; - } - goto cleanup; - -error: - [self stopListening:self]; - -cleanup: - IOObjectRelease(hidDevice); -} - -- (IBAction) stopListening: (id) sender { - if (queue != NULL) { - (*queue)->stop(queue); - - //dispose of queue - (*queue)->dispose(queue); - - //release the queue we allocated - (*queue)->Release(queue); - - queue = NULL; - } - - if (allCookies != nil) { - [allCookies autorelease]; - allCookies = nil; - } - - if (hidDeviceInterface != NULL) { - //close the device - (*hidDeviceInterface)->close(hidDeviceInterface); - - //release the interface - (*hidDeviceInterface)->Release(hidDeviceInterface); - - hidDeviceInterface = NULL; - } -} - -@end - -@implementation AppleRemote (Singleton) - -static AppleRemote* sharedInstance=nil; - -+ (AppleRemote*) sharedRemote { - @synchronized(self) { - if (sharedInstance == nil) { - sharedInstance = [[self alloc] init]; - } - } - return sharedInstance; -} -+ (id)allocWithZone:(NSZone *)zone { - @synchronized(self) { - if (sharedInstance == nil) { - return [super allocWithZone:zone]; - } - } - return sharedInstance; -} -- (id)copyWithZone:(NSZone *)zone { - return self; -} -- (id)retain { - return self; -} -- (unsigned)retainCount { - return UINT_MAX; //denotes an object that cannot be released -} -- (void)release { - //do nothing -} -- (id)autorelease { - return self; -} - -@end - -@implementation AppleRemote (PrivateMethods) - -- (void) setRemoteId: (int) value { - remoteId = value; -} - -- (IOHIDQueueInterface**) queue { - return queue; -} - -- (IOHIDDeviceInterface**) hidDeviceInterface { - return hidDeviceInterface; -} - - -- (NSDictionary*) cookieToButtonMapping { - return cookieToButtonMapping; -} - -- (NSString*) validCookieSubstring: (NSString*) cookieString { - if (cookieString == nil || [cookieString length] == 0) return nil; - NSEnumerator* keyEnum = [[self cookieToButtonMapping] keyEnumerator]; - NSString* key; - while(key = [keyEnum nextObject]) { - NSRange range = [cookieString rangeOfString:key]; - if (range.location == 0) return key; - } - return nil; -} - -- (void) sendSimulatedPlusMinusEvent: (id) time { - BOOL startSimulateHold = NO; - AppleRemoteEventIdentifier event = lastPlusMinusEvent; - @synchronized(self) { - startSimulateHold = (lastPlusMinusEvent>0 && lastPlusMinusEventTime == [time doubleValue]); - } - if (startSimulateHold) { - lastEventSimulatedHold = YES; - event = (event==kRemoteButtonVolume_Plus) ? kRemoteButtonVolume_Plus_Hold : kRemoteButtonVolume_Minus_Hold; - [delegate appleRemoteButton:event pressedDown: YES clickCount: 1]; - } -} - -- (void) sendRemoteButtonEvent: (AppleRemoteEventIdentifier) event pressedDown: (BOOL) pressedDown { - if (delegate) { - if (simulatePlusMinusHold) { - if (event == kRemoteButtonVolume_Plus || event == kRemoteButtonVolume_Minus) { - if (pressedDown) { - lastPlusMinusEvent = event; - lastPlusMinusEventTime = [NSDate timeIntervalSinceReferenceDate]; - [self performSelector:@selector(sendSimulatedPlusMinusEvent:) - withObject:[NSNumber numberWithDouble:lastPlusMinusEventTime] - afterDelay:HOLD_RECOGNITION_TIME_INTERVAL]; - return; - } else { - if (lastEventSimulatedHold) { - event = (event==kRemoteButtonVolume_Plus) ? kRemoteButtonVolume_Plus_Hold : kRemoteButtonVolume_Minus_Hold; - lastPlusMinusEvent = 0; - lastEventSimulatedHold = NO; - } else { - @synchronized(self) { - lastPlusMinusEvent = 0; - } - pressedDown = YES; - } - } - } - } - - if (([self clickCountEnabledButtons] & event) == event) { - if (pressedDown==NO && (event == kRemoteButtonVolume_Minus || event == kRemoteButtonVolume_Plus)) { - return; // this one is triggered automatically by the handler - } - NSNumber* eventNumber; - NSNumber* timeNumber; - @synchronized(self) { - lastClickCountEventTime = [NSDate timeIntervalSinceReferenceDate]; - if (lastClickCountEvent == event) { - eventClickCount = eventClickCount + 1; - } else { - eventClickCount = 1; - } - lastClickCountEvent = event; - timeNumber = [NSNumber numberWithDouble:lastClickCountEventTime]; - eventNumber= [NSNumber numberWithUnsignedInt:event]; - } - [self performSelector: @selector(executeClickCountEvent:) - withObject: [NSArray arrayWithObjects:eventNumber, timeNumber, nil] - afterDelay: maxClickTimeDifference]; - } else { - [delegate appleRemoteButton:event pressedDown: pressedDown clickCount:1]; - } - } -} - -- (void) executeClickCountEvent: (NSArray*) values { - AppleRemoteEventIdentifier event = [[values objectAtIndex: 0] unsignedIntValue]; - NSTimeInterval eventTimePoint = [[values objectAtIndex: 1] doubleValue]; - - BOOL finishedClicking = NO; - int finalClickCount = eventClickCount; - - @synchronized(self) { - finishedClicking = (event != lastClickCountEvent || eventTimePoint == lastClickCountEventTime); - if (finishedClicking) eventClickCount = 0; - } - - if (finishedClicking) { - [delegate appleRemoteButton:event pressedDown: YES clickCount:finalClickCount]; - if ([self simulatesPlusMinusHold]==NO && (event == kRemoteButtonVolume_Minus || event == kRemoteButtonVolume_Plus)) { - // trigger a button release event, too - [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow:0.1]]; - [delegate appleRemoteButton:event pressedDown: NO clickCount:finalClickCount]; - } - } - -} - -- (void) handleEventWithCookieString: (NSString*) cookieString sumOfValues: (SInt32) sumOfValues { - /* - if (previousRemainingCookieString) { - cookieString = [previousRemainingCookieString stringByAppendingString: cookieString]; - NSLog(@"New cookie string is %@", cookieString); - [previousRemainingCookieString release], previousRemainingCookieString=nil; - }*/ - if (cookieString == nil || [cookieString length] == 0) return; - NSNumber* buttonId = [[self cookieToButtonMapping] objectForKey: cookieString]; - if (buttonId != nil) { - [self sendRemoteButtonEvent: [buttonId intValue] pressedDown: (sumOfValues>0)]; - } else { - // let's see if a number of events are stored in the cookie string. this does - // happen when the main thread is too busy to handle all incoming events in time. - NSString* subCookieString; - NSString* lastSubCookieString=nil; - while(subCookieString = [self validCookieSubstring: cookieString]) { - cookieString = [cookieString substringFromIndex: [subCookieString length]]; - lastSubCookieString = subCookieString; - if (processesBacklog) [self handleEventWithCookieString: subCookieString sumOfValues:sumOfValues]; - } - if (processesBacklog == NO && lastSubCookieString != nil) { - // process the last event of the backlog and assume that the button is not pressed down any longer. - // The events in the backlog do not seem to be in order and therefore (in rare cases) the last event might be - // a button pressed down event while in reality the user has released it. - // NSLog(@"processing last event of backlog"); - [self handleEventWithCookieString: lastSubCookieString sumOfValues:0]; - } - if ([cookieString length] > 0) { - NSLog(@"Unknown button for cookiestring %@", cookieString); - } - } -} - -@end - -/* Callback method for the device queue -Will be called for any event of any type (cookie) to which we subscribe -*/ -static void QueueCallbackFunction(void* target, IOReturn result, void* refcon, void* sender) { - AppleRemote* remote = (AppleRemote*)target; - - IOHIDEventStruct event; - AbsoluteTime zeroTime = {0,0}; - NSMutableString* cookieString = [NSMutableString string]; - SInt32 sumOfValues = 0; - while (result == kIOReturnSuccess) - { - result = (*[remote queue])->getNextEvent([remote queue], &event, zeroTime, 0); - if ( result != kIOReturnSuccess ) - continue; - - //printf("%d %d %d\n", event.elementCookie, event.value, event.longValue); - - if (REMOTE_SWITCH_COOKIE == (int)event.elementCookie) { - [remote setRemoteId: event.value]; - [remote handleEventWithCookieString: @"19_" sumOfValues: 0]; - } else { - if (((int)event.elementCookie)!=5) { - sumOfValues+=event.value; - [cookieString appendString:[NSString stringWithFormat:@"%d_", event.elementCookie]]; - } - } - } - - [remote handleEventWithCookieString: cookieString sumOfValues: sumOfValues]; -} - -@implementation AppleRemote (IOKitMethods) - -- (IOHIDDeviceInterface**) createInterfaceForDevice: (io_object_t) hidDevice { - io_name_t className; - IOCFPlugInInterface** plugInInterface = NULL; - HRESULT plugInResult = S_OK; - SInt32 score = 0; - IOReturn ioReturnValue = kIOReturnSuccess; - - hidDeviceInterface = NULL; - - ioReturnValue = IOObjectGetClass(hidDevice, className); - - if (ioReturnValue != kIOReturnSuccess) { - NSLog(@"Error: Failed to get class name."); - return NULL; - } - - ioReturnValue = IOCreatePlugInInterfaceForService(hidDevice, - kIOHIDDeviceUserClientTypeID, - kIOCFPlugInInterfaceID, - &plugInInterface, - &score); - if (ioReturnValue == kIOReturnSuccess) - { - //Call a method of the intermediate plug-in to create the device interface - plugInResult = (*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), (LPVOID) &hidDeviceInterface); - - if (plugInResult != S_OK) { - NSLog(@"Error: Couldn't create HID class device interface"); - } - // Release - if (plugInInterface) (*plugInInterface)->Release(plugInInterface); - } - return hidDeviceInterface; -} - -- (io_object_t) findAppleRemoteDevice { - CFMutableDictionaryRef hidMatchDictionary = NULL; - IOReturn ioReturnValue = kIOReturnSuccess; - io_iterator_t hidObjectIterator = 0; - io_object_t hidDevice = 0; - - // Set up a matching dictionary to search the I/O Registry by class - // name for all HID class devices - hidMatchDictionary = IOServiceMatching(AppleRemoteDeviceName); - - // Now search I/O Registry for matching devices. - ioReturnValue = IOServiceGetMatchingServices(kIOMasterPortDefault, hidMatchDictionary, &hidObjectIterator); - - if ((ioReturnValue == kIOReturnSuccess) && (hidObjectIterator != 0)) { - hidDevice = IOIteratorNext(hidObjectIterator); - } - - // release the iterator - IOObjectRelease(hidObjectIterator); - - return hidDevice; -} - -- (BOOL) initializeCookies { - IOHIDDeviceInterface122** handle = (IOHIDDeviceInterface122**)hidDeviceInterface; - IOHIDElementCookie cookie; - long usage; - long usagePage; - id object; - NSArray* elements = nil; - NSDictionary* element; - IOReturn success; - - if (!handle || !(*handle)) return NO; - - /* Copy all elements, since we're grabbing most of the elements - * for this device anyway, and thus, it's faster to iterate them - * ourselves. When grabbing only one or two elements, a matching - * dictionary should be passed in here instead of NULL. */ - success = (*handle)->copyMatchingElements(handle, NULL, (CFArrayRef*)&elements); - - if (success == kIOReturnSuccess) { - - [elements autorelease]; - /* - cookies = calloc(NUMBER_OF_APPLE_REMOTE_ACTIONS, sizeof(IOHIDElementCookie)); - memset(cookies, 0, sizeof(IOHIDElementCookie) * NUMBER_OF_APPLE_REMOTE_ACTIONS); - */ - allCookies = [[NSMutableArray alloc] init]; - int i; - for (i=0; i< [elements count]; i++) { - element = [elements objectAtIndex:i]; - - //Get cookie - object = [element valueForKey: (NSString*)CFSTR(kIOHIDElementCookieKey) ]; - if (object == nil || ![object isKindOfClass:[NSNumber class]]) continue; - if (object == 0 || CFGetTypeID(object) != CFNumberGetTypeID()) continue; - cookie = (IOHIDElementCookie) [object longValue]; - - //Get usage - object = [element valueForKey: (NSString*)CFSTR(kIOHIDElementUsageKey) ]; - if (object == nil || ![object isKindOfClass:[NSNumber class]]) continue; - usage = [object longValue]; - - //Get usage page - object = [element valueForKey: (NSString*)CFSTR(kIOHIDElementUsagePageKey) ]; - if (object == nil || ![object isKindOfClass:[NSNumber class]]) continue; - usagePage = [object longValue]; - - [allCookies addObject: [NSNumber numberWithInt:(int)cookie]]; - } - } else { - return NO; - } - - return YES; -} - -- (BOOL) openDevice { - HRESULT result; - - IOHIDOptionsType openMode = kIOHIDOptionsTypeNone; - if ([self isOpenInExclusiveMode]) openMode = kIOHIDOptionsTypeSeizeDevice; - IOReturn ioReturnValue = (*hidDeviceInterface)->open(hidDeviceInterface, openMode); - - if (ioReturnValue == KERN_SUCCESS) { - queue = (*hidDeviceInterface)->allocQueue(hidDeviceInterface); - if (queue) { - result = (*queue)->create(queue, 0, 12); //depth: maximum number of elements in queue before oldest elements in queue begin to be lost. - - int i=0; - for(i=0; i<[allCookies count]; i++) { - IOHIDElementCookie cookie = (IOHIDElementCookie)[[allCookies objectAtIndex:i] intValue]; - (*queue)->addElement(queue, cookie, 0); - } - - // add callback for async events - CFRunLoopSourceRef eventSource; - ioReturnValue = (*queue)->createAsyncEventSource(queue, &eventSource); - if (ioReturnValue == KERN_SUCCESS) { - ioReturnValue = (*queue)->setEventCallout(queue,QueueCallbackFunction, self, NULL); - if (ioReturnValue == KERN_SUCCESS) { - CFRunLoopAddSource(CFRunLoopGetCurrent(), eventSource, kCFRunLoopDefaultMode); - //start data delivery to queue - (*queue)->start(queue); - return YES; - } else { - NSLog(@"Error when setting event callout"); - } - } else { - NSLog(@"Error when creating async event source"); - } - } else { - NSLog(@"Error when opening device"); - } - } - return NO; -} - -@end - -@implementation AppleRemoteApplicationDelegate - -- (id) initWithApplicationDelegate: (id) delegate { - if (self = [super init]) { - applicationDelegate = [delegate retain]; - } - return self; -} - -- (void) dealloc { - [applicationDelegate release]; - [super dealloc]; -} - -- (id) applicationDelegate { - return applicationDelegate; -} - -- (void)applicationWillBecomeActive:(NSNotification *)aNotification { - if ([applicationDelegate respondsToSelector: @selector(applicationWillBecomeActive:)]) { - [applicationDelegate applicationWillBecomeActive: aNotification]; - } -} -- (void)applicationDidBecomeActive:(NSNotification *)aNotification { - [[AppleRemote sharedRemote] setListeningToRemote: YES]; - - if ([applicationDelegate respondsToSelector: @selector(applicationDidBecomeActive:)]) { - [applicationDelegate applicationDidBecomeActive: aNotification]; - } -} -- (void)applicationWillResignActive:(NSNotification *)aNotification { - [[AppleRemote sharedRemote] setListeningToRemote: NO]; - - if ([applicationDelegate respondsToSelector: @selector(applicationWillResignActive:)]) { - [applicationDelegate applicationWillResignActive: aNotification]; - } -} -- (void)applicationDidResignActive:(NSNotification *)aNotification { - if ([applicationDelegate respondsToSelector: @selector(applicationDidResignActive:)]) { - [applicationDelegate applicationDidResignActive: aNotification]; - } -} - -- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { - NSMethodSignature* signature = [super methodSignatureForSelector: aSelector]; - if (signature == nil && applicationDelegate != nil) { - signature = [applicationDelegate methodSignatureForSelector: aSelector]; - } - return signature; -} - -- (void)forwardInvocation:(NSInvocation *)invocation { - SEL aSelector = [invocation selector]; - - if (applicationDelegate==nil || [applicationDelegate respondsToSelector:aSelector]==NO) { - [super forwardInvocation: invocation]; - return; - } - - [invocation invokeWithTarget:applicationDelegate]; -} -@end diff --git a/projects/macosx/vlc_app/Sources/ImageAndTextCell.h b/projects/macosx/vlc_app/Sources/ImageAndTextCell.h deleted file mode 100644 index 0c11eb0f98..0000000000 --- a/projects/macosx/vlc_app/Sources/ImageAndTextCell.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************** - * ImageAndTextCell.h: Helpful cell to display an image and a text. - * Borrowed from Apple's sample code for most part. - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import - - -@interface ImageAndTextCell : NSTextFieldCell { - NSString *imageKeyPath; - id representedObject; -} - -/* Will be set at creation time */ -@property (copy) NSString * imageKeyPath; - -/* Will be set through an outlineView delegate. Represent an object that respond - * to the imageKeyPath. Text is displayed through the usual super class - * @"value" bindings */ -@property (retain) id representedObject; - -@end diff --git a/projects/macosx/vlc_app/Sources/ImageAndTextCell.m b/projects/macosx/vlc_app/Sources/ImageAndTextCell.m deleted file mode 100644 index 83ce808f1f..0000000000 --- a/projects/macosx/vlc_app/Sources/ImageAndTextCell.m +++ /dev/null @@ -1,126 +0,0 @@ -/***************************************************************************** - * ImageAndTextCell.h: Helpful cell to display an image and a text. - * Borrowed from Apple's sample code for most part. - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import "ImageAndTextCell.h" - -@implementation ImageAndTextCell - -@synthesize imageKeyPath; -@synthesize representedObject; - -- (id)init { - if (self = [super init]) { - [self setLineBreakMode:NSLineBreakByTruncatingTail]; - [self setSelectable:YES]; - } - return self; -} - -- (void)dealloc { - [imageKeyPath release]; - [super dealloc]; -} - -- (id)copyWithZone:(NSZone *)zone { - ImageAndTextCell *cell = (ImageAndTextCell *)[super copyWithZone:zone]; - cell->imageKeyPath = [imageKeyPath copy]; - cell->representedObject = [representedObject retain]; - return cell; -} - -- (NSImage *)cellImage -{ - return imageKeyPath ? [[self representedObject] valueForKeyPath: imageKeyPath] : nil; -} - -- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent { - NSRect textFrame, imageFrame; - NSImage * image = [self cellImage]; - NSDivideRect (aRect, &imageFrame, &textFrame, 6 + [image size].width, NSMinXEdge); - [super editWithFrame: textFrame inView: controlView editor:textObj delegate:anObject event: theEvent]; -} - -- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength { - NSRect textFrame, imageFrame; - NSImage * image = [self cellImage]; - NSDivideRect (aRect, &imageFrame, &textFrame, 6 + [image size].width, NSMinXEdge); - [super selectWithFrame: textFrame inView: controlView editor:textObj delegate:anObject start:selStart length:selLength]; -} - -- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { - NSImage * image = [self cellImage]; - if (image != nil) { - NSRect imageFrame; - NSSize imageSize = [image size]; - NSDivideRect(cellFrame, &imageFrame, &cellFrame, 6 + imageSize.width, NSMinXEdge); - if ([self drawsBackground]) { - [[self backgroundColor] set]; - NSRectFill(imageFrame); - } - imageFrame.origin.x += 3; - imageFrame.size = imageSize; - - if ([controlView isFlipped]) - imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2); - else - imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); - - [image compositeToPoint:imageFrame.origin operation:NSCompositeSourceOver]; - } - [super drawWithFrame:cellFrame inView:controlView]; -} - -- (NSSize)cellSize { - NSImage * image = [self cellImage]; - NSSize cellSize = [super cellSize]; - cellSize.width += (image ? [image size].width : 0) + 6; - return cellSize; -} - -- (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView { - NSPoint point = [controlView convertPoint:[event locationInWindow] fromView:nil]; - NSImage * image = [self cellImage]; - // If we have an image, we need to see if the user clicked on the image portion. - if (image != nil) { - // This code closely mimics drawWithFrame:inView: - NSSize imageSize = [image size]; - NSRect imageFrame; - NSDivideRect(cellFrame, &imageFrame, &cellFrame, 6 + imageSize.width, NSMinXEdge); - - imageFrame.origin.x += 3; - imageFrame.size = imageSize; - // If the point is in the image rect, then it is a content hit - if (NSMouseInRect(point, imageFrame, [controlView isFlipped])) { - // We consider this just a content area. It is not trackable, nor it it editable text. If it was, we would or in the additional items. - // By returning the correct parts, we allow NSTableView to correctly begin an edit when the text portion is clicked on. - return NSCellHitContentArea; - } - } - // At this point, the cellFrame has been modified to exclude the portion for the image. Let the superclass handle the hit testing at this point. - return [super hitTestForEvent:event inRect:cellFrame ofView:controlView]; -} - - -@end diff --git a/projects/macosx/vlc_app/Sources/VLCAppAdditions.h b/projects/macosx/vlc_app/Sources/VLCAppAdditions.h deleted file mode 100644 index b9a5c8bd7f..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCAppAdditions.h +++ /dev/null @@ -1,132 +0,0 @@ -/***************************************************************************** - * VLCAppAdditions.m: Helpful additions to NS* classes - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * Felix Kühne - * Jérôme Decoodt - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import - -/***************************************************************************** - * NSIndexPath (VLCAppAddition) - *****************************************************************************/ -@interface NSIndexPath (VLCAppAddition) -- (NSIndexPath *)indexPathByRemovingFirstIndex; -- (NSUInteger)lastIndex; -@end - -/***************************************************************************** - * NSArray (VLCAppAddition) - *****************************************************************************/ -@interface NSArray (VLCAppAddition) -- (id)objectAtIndexPath:(NSIndexPath *)path withNodeKeyPath:(NSString *)nodeKeyPath; -@end - -/***************************************************************************** - * NSView (VLCAppAdditions) - *****************************************************************************/ -@interface NSView (VLCAppAdditions) -- (void)moveSubviewsToVisible; -@end - -/***************************************************************************** - * VLCOneSplitView - * - * Missing functionality to a one-split view - *****************************************************************************/ -@interface VLCOneSplitView : NSSplitView -{ -} -- (float)sliderPosition; -- (void)setSliderPosition:(float)newPosition; -@end - -/***************************************************************************** - * NSScreen (VLCAdditions) - * - * Missing extension to NSScreen - *****************************************************************************/ - -@interface NSScreen (VLCAdditions) - -+ (NSScreen *)screenWithDisplayID: (CGDirectDisplayID)displayID; -- (BOOL)isMainScreen; -- (BOOL)isScreen: (NSScreen*)screen; -- (CGDirectDisplayID)displayID; -- (void)blackoutOtherScreens; -+ (void)unblackoutScreens; -@end - -/***************************************************************************** - * VLCWindow - * - * Missing extension to NSWindow (Used only when needing setCanBecomeKeyWindow) - *****************************************************************************/ - -@interface VLCWindow : NSWindow -{ - BOOL canBecomeKeyWindow; - BOOL isset_canBecomeKeyWindow; -} -- (void)setCanBecomeKeyWindow: (BOOL)canBecomeKey; -@end - - -/***************************************************************************** - * VLCImageCustomizedSlider - * - * Slider personalized by backgroundImage and knobImage - *****************************************************************************/ - -@interface VLCImageCustomizedSlider : NSSlider -{ - NSImage * knobImage; - NSImage * backgroundImage; -} -@property (retain) NSImage * knobImage; -@property (retain) NSImage * backgroundImage; - -- (void)drawKnobInRect: (NSRect)knobRect; -- (void)drawBackgroundInRect: (NSRect)knobRect; - -- (void)drawRect: (NSRect)rect; -@end - -/***************************************************************************** - * NSImageView (VLCAppAdditions) - * - * Make the image view move the window by mouse down by default - *****************************************************************************/ - -@interface NSImageView (VLCAppAdditions) -- (BOOL)mouseDownCanMoveWindow; -@end - -/***************************************************************************** - * NSImage (VLCAppAdditions) - * - * Make the image view move the window by mouse down by default - *****************************************************************************/ - -@interface NSImage (VLCAppAdditions) -- (CGImageRef)CGImage; -@end diff --git a/projects/macosx/vlc_app/Sources/VLCAppAdditions.m b/projects/macosx/vlc_app/Sources/VLCAppAdditions.m deleted file mode 100644 index a453113d42..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCAppAdditions.m +++ /dev/null @@ -1,334 +0,0 @@ -/***************************************************************************** - * VLCAppAdditions.m: Helpful additions to NS* classes - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * Felix Kühne - * Jérôme Decoodt - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import "VLCAppAdditions.h" -#import - -@implementation NSIndexPath (VLCAppAddition) -- (NSIndexPath *)indexPathByRemovingFirstIndex -{ - if( [self length] <= 1 ) - return [[[NSIndexPath alloc] init] autorelease]; - - NSIndexPath * ret; - NSUInteger * ints = malloc(sizeof(NSUInteger)*[self length]); - if( !ints ) return nil; - [self getIndexes:ints]; - - ret = [NSIndexPath indexPathWithIndexes:ints+1 length:[self length]-1]; - - free(ints); - return ret; -} -- (NSUInteger)lastIndex -{ - if(![self length]) - return 0; - return [self indexAtPosition:[self length]-1]; -} -@end - -@implementation NSArray (VLCAppAddition) -- (id)objectAtIndexPath:(NSIndexPath *)path withNodeKeyPath:(NSString *)nodeKeyPath -{ - if( ![path length] || !nodeKeyPath ) - return self; - - id object = [self objectAtIndex:[path indexAtPosition:0]]; - id subarray = [object valueForKeyPath:nodeKeyPath]; - if([path length] == 1) - return subarray ? subarray : object; - - if(!subarray) - return object; - return [subarray objectAtIndexPath:[path indexPathByRemovingFirstIndex] withNodeKeyPath:nodeKeyPath]; -} -@end - -@implementation NSView (VLCAppAdditions) -- (void)moveSubviewsToVisible -{ - for(NSView * view in [self subviews]) - { - if( ([view autoresizingMask] & NSViewHeightSizable) && - !NSContainsRect([view frame], [self bounds]) ) - { - NSRect newFrame = NSIntersectionRect( [self bounds], [view frame] ); - if( !NSIsEmptyRect(newFrame) ) - [view setFrame:NSIntersectionRect( [self bounds], [view frame] )]; - } - } -} -@end - -/* Split view that supports slider animation */ -@implementation VLCOneSplitView -- (CGFloat)dividerThickness -{ - return 1.; -} -- (void)drawDividerInRect:(NSRect)aRect -{ - [self lockFocus]; - [[NSColor blackColor] set]; - NSRectFill(aRect); - [self unlockFocus]; -} -- (float)sliderPosition -{ - NSSize size = [[[self subviews] objectAtIndex:0] frame].size; - return [self isVertical] ? size.width : size.height; -} -- (void)setSliderPosition:(float)newPosition -{ - [self setPosition:newPosition ofDividerAtIndex:0]; -} -+ (id)defaultAnimationForKey:(NSString *)key -{ - if([key isEqualToString:@"sliderPosition"]) - { - return [CABasicAnimation animation]; - } - return [super defaultAnimationForKey: key]; -} -@end - -/***************************************************************************** - * NSScreen (VLCAdditions) - * - * Missing extension to NSScreen - *****************************************************************************/ - -@implementation NSScreen (VLCAdditions) - -static NSMutableArray *blackoutWindows = NULL; - -+ (void)load -{ - /* init our fake object attribute */ - blackoutWindows = [[NSMutableArray alloc] initWithCapacity:1]; -} - -+ (NSScreen *)screenWithDisplayID: (CGDirectDisplayID)displayID -{ - int i; - - for( i = 0; i < [[NSScreen screens] count]; i++ ) - { - NSScreen *screen = [[NSScreen screens] objectAtIndex: i]; - if([screen displayID] == displayID) - return screen; - } - return nil; -} - -- (BOOL)isMainScreen -{ - return ([self displayID] == [[[NSScreen screens] objectAtIndex:0] displayID]); -} - -- (BOOL)isScreen: (NSScreen*)screen -{ - return ([self displayID] == [screen displayID]); -} - -- (CGDirectDisplayID)displayID -{ - return (CGDirectDisplayID)_screenNumber; -} - -- (void)blackoutOtherScreens -{ - unsigned int i; - - /* Free our previous blackout window (follow blackoutWindow alloc strategy) */ - [blackoutWindows makeObjectsPerformSelector:@selector(close)]; - [blackoutWindows removeAllObjects]; - - - for(i = 0; i < [[NSScreen screens] count]; i++) - { - NSScreen *screen = [[NSScreen screens] objectAtIndex: i]; - VLCWindow *blackoutWindow; - NSRect screen_rect; - - if([self isScreen: screen]) - continue; - - screen_rect = [screen frame]; - screen_rect.origin.x = screen_rect.origin.y = 0.0f; - - /* blackoutWindow alloc strategy - - The NSMutableArray blackoutWindows has the blackoutWindow references - - blackoutOtherDisplays is responsible for alloc/releasing its Windows - */ - blackoutWindow = [[VLCWindow alloc] initWithContentRect: screen_rect styleMask: NSBorderlessWindowMask - backing: NSBackingStoreBuffered defer: NO screen: screen]; - [blackoutWindow setBackgroundColor:[NSColor blackColor]]; - [blackoutWindow setLevel: NSFloatingWindowLevel]; /* Disappear when Expose is triggered */ - - [blackoutWindow orderFront: self]; - - [blackoutWindows addObject: blackoutWindow]; - [blackoutWindow release]; - } -} - -+ (void)unblackoutScreens -{ - unsigned int i; - - for(i = 0; i < [blackoutWindows count]; i++) - { - VLCWindow *blackoutWindow = [blackoutWindows objectAtIndex: i]; - [blackoutWindow close]; - } -} - -@end - -/***************************************************************************** - * VLCWindow - * - * Missing extension to NSWindow - *****************************************************************************/ - -@implementation VLCWindow -- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask - backing:(NSBackingStoreType)backingType defer:(BOOL)flag -{ - self = [super initWithContentRect:contentRect styleMask:styleMask backing:backingType defer:flag]; - if( self ) - isset_canBecomeKeyWindow = NO; - return self; -} -- (void)setCanBecomeKeyWindow: (BOOL)canBecomeKey -{ - isset_canBecomeKeyWindow = YES; - canBecomeKeyWindow = canBecomeKey; -} - -- (BOOL)canBecomeKeyWindow -{ - if(isset_canBecomeKeyWindow) - return canBecomeKeyWindow; - - return [super canBecomeKeyWindow]; -} -@end - -/***************************************************************************** - * VLCImageCustomizedSlider - * - * Slider personalized by backgroundImage and knobImage - *****************************************************************************/ -@implementation VLCImageCustomizedSlider -@synthesize backgroundImage; -@synthesize knobImage; - -- (id)initWithFrame:(NSRect)frame -{ - if(self = [super initWithFrame:frame]) - { - knobImage = nil; - backgroundImage = nil; - } - return self; -} - -- (void)dealloc -{ - [knobImage release]; - [knobImage release]; - [super dealloc]; -} - -- (void)drawKnobInRect:(NSRect) knobRect -{ - NSRect imageRect; - imageRect.size = [self.knobImage size]; - imageRect.origin.x = 0; - imageRect.origin.y = 0; - knobRect.origin.x += (knobRect.size.width - imageRect.size.width) / 2; - knobRect.origin.y += (knobRect.size.width - imageRect.size.width) / 2; - knobRect.size.width = imageRect.size.width; - knobRect.size.height = imageRect.size.height; - [self.knobImage drawInRect:knobRect fromRect:imageRect operation:NSCompositeSourceOver fraction:1]; -} - -- (void)drawBackgroundInRect:(NSRect) drawRect -{ - NSRect imageRect = drawRect; - imageRect.origin.y += ([self.backgroundImage size].height - [self bounds].size.height ) / 2; - [self.backgroundImage drawInRect:drawRect fromRect:imageRect operation:NSCompositeSourceOver fraction:1]; -} - -- (void)drawRect:(NSRect)rect -{ - /* Draw default to make sure the slider behaves correctly */ - [[NSGraphicsContext currentContext] saveGraphicsState]; - NSRectClip(NSZeroRect); - [super drawRect:rect]; - [[NSGraphicsContext currentContext] restoreGraphicsState]; - if( self.backgroundImage ) - [self drawBackgroundInRect: rect]; - if( self.knobImage ) - { - NSRect knobRect = [[self cell] knobRectFlipped:NO]; - [[[NSColor blackColor] colorWithAlphaComponent:0.6] set]; - [self drawKnobInRect: knobRect]; - } -} - -@end - -/***************************************************************************** - * NSImageView (VLCAppAdditions) - * - * Make the image view move the window by mouse down by default - *****************************************************************************/ - -@implementation NSImageView (VLCAppAdditions) -- (BOOL)mouseDownCanMoveWindow -{ - return YES; -} -@end - -/***************************************************************************** - * NSImage (VLCAppAdditions) - * - * Make the image view move the window by mouse down by default - *****************************************************************************/ - -@implementation NSImage (VLCAppAdditions) -- (CGImageRef)CGImage -{ - return [[NSBitmapImageRep imageRepWithData:[NSBitmapImageRep TIFFRepresentationOfImageRepsInArray: [self representations]]] CGImage]; -} -@end - - diff --git a/projects/macosx/vlc_app/Sources/VLCAppBindings.h b/projects/macosx/vlc_app/Sources/VLCAppBindings.h deleted file mode 100644 index aa3fa4969b..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCAppBindings.h +++ /dev/null @@ -1,39 +0,0 @@ -/***************************************************************************** - * VLCAppBindings.m: Helpful addition code related to bindings uses - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import -#import - -/* We do implement some category functions, - * But we don't publicise them, as they should - * only be used with bindings. */ - -@interface VLCMediaDiscoverer (VLCAppBindings) -@end - -@interface VLCMedia (VLCAppBindings) -@end - -@interface VLCMediaPlayer (VLCAppBindings) -@end diff --git a/projects/macosx/vlc_app/Sources/VLCAppBindings.m b/projects/macosx/vlc_app/Sources/VLCAppBindings.m deleted file mode 100644 index 098e654fd5..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCAppBindings.m +++ /dev/null @@ -1,261 +0,0 @@ -/***************************************************************************** - * VLCAppBindings.m: Helpful addition code related to bindings uses - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import "VLCAppBindings.h" - -/* This is globally a big hack to ease binding uses */ - - -/****************************************************************************** - * VLCMediaDiscoverer (CategoriesListBindings) - */ -@implementation VLCMediaDiscoverer (CategoriesListBindings) -+ (NSSet *)keyPathsForValuesAffectingCurrentlyFetchingItems -{ - return [NSSet setWithObject:@"running"]; -} - -+ (NSSet *)keyPathsForValuesAffectingChildrenInCategoriesListForDetailView -{ - return [NSSet setWithObject:@"discoveredMedia.flatAspect"]; -} - -/* General shortcuts */ -- (BOOL)currentlyFetchingItems -{ - return [self isRunning]; -} -- (NSImage *)image -{ - static NSImage * sdImage = nil; - if( !sdImage ) - sdImage = [[NSImage imageNamed:@"applications-internet.png"] retain]; - return sdImage; -} - -/* CategoriesList specific bindings */ -- (NSArray *)childrenInCategoriesList -{ - return nil; -} -- (NSString *)descriptionInCategoriesList -{ - return [self localizedName]; -} -- (VLCMediaListAspect *)childrenInCategoriesListForDetailView -{ - return [[self discoveredMedia] flatAspect]; -} -- (BOOL)editableInCategoriesList -{ - return NO; -} -- (BOOL)selectableInCategoriesList -{ - return YES; -} - -/* VideoView specific bindings */ -- (NSArray *)childrenInVideoView -{ - return [[[self discoveredMedia] flatAspect] valueForKeyPath:@"media"]; -} - -- (NSString *)descriptionInVideoView -{ - return [self localizedName]; -} -- (BOOL)isLeaf -{ - return YES; -} - -@end - -/****************************************************************************** - * VLCMedia (VLCAppBindings) - */ -@implementation VLCMedia (VLCAppBindings) - -+ (NSSet *)keyPathsForValuesAffectingChildrenInCategoriesList -{ - return [NSSet setWithObject:@"subitems.hierarchicalNodeAspect.media"]; -} -+ (NSSet *)keyPathsForValuesAffectingDescriptionInCategoriesList -{ - return [NSSet setWithObject:@"metaDictionary.title"]; -} -+ (NSSet *)keyPathsForValuesAffectingChildrenInCategoriesListForDetailView -{ - return [NSSet setWithObject:@"subitems.flatAspect"]; -} -+ (NSSet *)keyPathsForValuesAffectingChildrenInDescriptionInVideoView -{ - return [NSSet setWithObject:@"metaDictionary.title"]; -} -+ (NSSet *)keyPathsForValuesAffectingStateAsImage -{ - return [NSSet setWithObject:@"state"]; -} - -/* CategoriesList specific bindings */ -- (NSArray *)childrenInCategoriesList -{ - return [[[self subitems] hierarchicalNodeAspect] valueForKeyPath:@"media"]; -} -- (void)setDescriptionInCategoriesList:(NSString *)description -{ - NSLog(@"unimplemented: meta edition"); -} -- (NSString *)descriptionInCategoriesList -{ - return [[self metaDictionary] objectForKey:@"title"]; -} -- (VLCMediaListAspect *)childrenInCategoriesListForDetailView -{ - return [[self subitems] flatAspect]; -} -- (BOOL)editableInCategoriesList -{ - return YES; -} -- (BOOL)selectableInCategoriesList -{ - return YES; -} -- (BOOL)currentlyFetchingItems -{ - return NO; -} -- (NSImage *)image -{ - static NSImage * playlistImage = nil; - if( !playlistImage ) - playlistImage = [[NSImage imageNamed:@"type_playlist.png"] retain]; - return playlistImage; -} - -/* VideoView specific bindings */ -- (NSArray *)childrenInVideoView -{ - return [[[self subitems] flatAspect] valueForKeyPath:@"media"]; -} -- (NSString *)descriptionInVideoView -{ - return [[self metaDictionary] objectForKey:@"title"]; -} - -/* mediaListView specific bindings */ -- (NSImage *)stateAsImage -{ - static NSImage * playing = nil; - static NSImage * error = nil; - - if(!playing) - playing = [[NSImage imageNamed:@"volume_high.png"] retain]; - if(!error) - error = [[NSImage imageNamed:@"dialog-error.png"] retain]; - - if( [self state] == VLCMediaStatePlaying ) - return playing; - else if( [self state] == VLCMediaStateBuffering ) - return playing; - else if( [self state] == VLCMediaStateError ) - return error; - - return nil; -} -@end - -@implementation VLCMediaPlayer (VLCAppBindings) -+ (NSSet *)keyPathsForValuesAffectingDescription -{ - return [NSSet setWithObjects:@"playing", @"media", nil]; -} -+ (NSSet *)keyPathsForValuesAffectingStateAsButtonImage -{ - return [NSSet setWithObjects:@"state", @"playing", @"canPause", nil]; -} -+ (NSSet *)keyPathsForValuesAffectingStateAsButtonAlternateImage -{ - return [NSSet setWithObjects:@"state", @"playing", @"canPause", nil]; -} -+ (NSSet *)keyPathsForValuesAffectingStateAsFullScreenButtonImage -{ - return [NSSet setWithObjects:@"state", @"playing", @"canPause", nil]; -} -+ (NSSet *)keyPathsForValuesAffectingStateAsFullScreenButtonAlternateImage -{ - return [NSSet setWithObjects:@"state", @"playing", @"canPause", nil]; -} - -- (NSString *)description -{ - if([self media]) - return [self valueForKeyPath:@"media.metaDictionary.title"]; - else - return @"VLC Media Player"; -} - -- (NSImage *)stateAsButtonImage -{ - if([self state] == VLCMediaPlayerStatePlaying && [self canPause]) - return [NSImage imageNamed:@"pause.png"]; - else if( [self state] == VLCMediaPlayerStatePlaying ) - return [NSImage imageNamed:@"stop.png"]; - else - return [NSImage imageNamed:@"play.png"]; -} - -- (NSImage *)stateAsButtonAlternateImage -{ - if([self state] == VLCMediaPlayerStatePlaying && [self canPause]) - return [NSImage imageNamed:@"pause_blue.png"]; - else if( [self state] == VLCMediaPlayerStatePlaying ) - return [NSImage imageNamed:@"stop_blue.png"]; - else - return [NSImage imageNamed:@"play_blue.png"]; -} - -- (NSImage *)stateAsFullScreenButtonImage -{ - if([self state] == VLCMediaPlayerStatePlaying && [self canPause]) - return [NSImage imageNamed:@"fs_pause.png"]; - else if( [self state] == VLCMediaPlayerStatePlaying ) - return [NSImage imageNamed:@"fs_stop.png"]; - else - return [NSImage imageNamed:@"fs_play.png"]; -} - -- (NSImage *)stateAsFullScreenButtonAlternateImage -{ - if([self state] == VLCMediaPlayerStatePlaying && [self canPause]) - return [NSImage imageNamed:@"fs_pause_highlight.png"]; - else if( [self state] == VLCMediaPlayerStatePlaying ) - return [NSImage imageNamed:@"fs_stop_highlight.png"]; - else - return [NSImage imageNamed:@"fs_play_highlight.png"]; -} - -@end diff --git a/projects/macosx/vlc_app/Sources/VLCBrowsableVideoView.h b/projects/macosx/vlc_app/Sources/VLCBrowsableVideoView.h deleted file mode 100644 index b427d04257..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCBrowsableVideoView.h +++ /dev/null @@ -1,84 +0,0 @@ -/***************************************************************************** - * VLCBrowsableVideoView.h: VideoView subclasses that allow fullscreen - * browsing - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import -#import -#import "VLCAppAdditions.h" - -@class VLCMainWindowController; -@class VLCMediaListLayer; - -@interface VLCBrowsableVideoView : NSView { - BOOL menuDisplayed; - NSArray * itemsTree; - NSRange displayedItems; - NSInteger selectedIndex; - CALayer * selectionLayer; - CALayer * backLayer; - CALayer * menuLayer; - NSIndexPath * selectedPath; - NSString * nodeKeyPath; - NSString * contentKeyPath; - id selectedObject; - BOOL fullScreen; - - /* Actions on non-node items*/ - id target; - SEL action; - - /* FullScreenTransition */ - VLCWindow * fullScreenWindow; - NSViewAnimation * fullScreenAnim1; - NSViewAnimation * fullScreenAnim2; - NSView * tempFullScreenView; - IBOutlet VLCMainWindowController * mainWindowController; - VLCVideoLayer * videoLayer; - VLCMediaListLayer * mediaListLayer; -} - -/* Binds an nsarray to that property. But don't forget the set the access keys. */ -@property (retain) NSArray * itemsTree; -@property (copy) NSString * nodeKeyPath; -@property (copy) NSString * contentKeyPath; - -@property (readonly, retain) id selectedObject; - -@property (readwrite) BOOL fullScreen; -@property (readonly) BOOL hasVideo; - -@property (readonly) VLCVideoLayer * videoLayer; - -/* Set up a specific action to do, on items that don't have node. - * action first argument is the browsableVideoView. You can get the selected object, - * with -selectedObject */ -@property (retain) id target; -@property SEL action; - -- (void)toggleMenu; -- (void)displayMenu; -- (void)hideMenu; - -- (IBAction)backToMediaListView:(id)sender; -@end diff --git a/projects/macosx/vlc_app/Sources/VLCBrowsableVideoView.m b/projects/macosx/vlc_app/Sources/VLCBrowsableVideoView.m deleted file mode 100644 index d34d210d7d..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCBrowsableVideoView.m +++ /dev/null @@ -1,938 +0,0 @@ -/***************************************************************************** - * VLCBrowsableVideoView.h: VideoView subclasses that allow fullScreen - * browsing - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007, 2009 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -/* DisableScreenUpdates, SetSystemUIMode, ... */ -#import - -#import "VLCBrowsableVideoView.h" -#import "VLCAppAdditions.h" -#import "VLCMediaListLayer.h" -#import "VLCMainWindowController.h" - -/* TODO: We may want to clean up the private functions a bit... */ - -@interface VLCBrowsableVideoView () -/* Property */ -@property (readwrite, retain) id selectedObject; -@end - -@interface VLCBrowsableVideoView (Private) - -/* Methods */ -+ (CAScrollLayer *)menuLayer; -+ (CALayer *)backLayer; - -- (void)loadItemsAtIndexPath:(NSIndexPath *)path inLayer:(CALayer *)layer; -- (void)changeSelectedIndex:(NSInteger)i; -- (void)changeSelectedPath:(NSIndexPath *)newPath withSelectedIndex:(NSUInteger)newIndex; - -- (void)displayEmptyView; -@end - - -@interface VLCBrowsableVideoView (FullScreenTransition) -- (void)hasEndedFullScreen; -- (void)hasBecomeFullScreen; - -- (void)enterFullScreen:(NSScreen *)screen; -- (void)leaveFullScreen; -- (void)leaveFullScreenAndFadeOut: (BOOL)fadeout; - -@end - -#pragma mark - -/****************************************************************************** - * VLCBrowsableVideoView - */ -@implementation VLCBrowsableVideoView - -/* Property */ -@synthesize nodeKeyPath; -@synthesize contentKeyPath; -@synthesize selectedObject; -@synthesize target; -@synthesize action; -@synthesize videoLayer; - -- (NSArray *)itemsTree { - return itemsTree; -} - -- (void)setItemsTree:(NSArray *)newItemsTree -{ - [itemsTree release]; - itemsTree = [newItemsTree retain]; - [self changeSelectedPath:[[[NSIndexPath alloc] init] autorelease] withSelectedIndex:0]; -} - -- (BOOL)fullScreen -{ - return [self isInFullScreenMode]; -} - -- (void)setFullScreen:(BOOL)newFullScreen -{ - if( newFullScreen == self.fullScreen ) - return; - - if( newFullScreen ) - { - [self enterFullScreenMode:[[self window] screen] withOptions: - [NSDictionary dictionaryWithObject: [NSNumber numberWithInt:1] - forKey: NSFullScreenModeWindowLevel]]; - } - else - { - [self exitFullScreenModeWithOptions:nil]; - } -} - -- (BOOL)hasVideo -{ - return videoLayer.hasVideo; -} - -/* Binded to VideoLayer's hasVideo */ -- (void)setHasVideo:(BOOL)hasVideo -{ - if( hasVideo ) - { - [CATransaction begin]; - [videoLayer removeFromSuperlayer]; - [self.layer addSublayer:videoLayer]; - videoLayer.frame = [self layer].bounds; - [videoLayer setAutoresizingMask:kCALayerWidthSizable|kCALayerHeightSizable]; - [mediaListLayer removeFromSuperlayer]; - [CATransaction commit]; - } - else - { - [CATransaction begin]; - [mediaListLayer removeFromSuperlayer]; - [self.layer addSublayer:mediaListLayer]; - mediaListLayer.frame = [self layer].bounds; - [mediaListLayer setAutoresizingMask:kCALayerWidthSizable|kCALayerHeightSizable]; - [videoLayer removeFromSuperlayer]; - [CATransaction commit]; - - } - [[self layer] setNeedsDisplay]; - [self setNeedsDisplay:YES]; -} - -/* Initializer */ -- (void)awakeFromNib -{ - // FIXME: do that in -initWithFrame: - [self setWantsLayer:YES]; - menuDisplayed = NO; - displayedItems = NSMakeRange( -1, 0 ); - selectedIndex = -1; - selectionLayer = backLayer = nil; - menuLayer = nil; - selectedPath = [[NSIndexPath alloc] init]; - tempFullScreenView = [[NSView alloc] init]; - fullScreen = NO; - - videoLayer = [[VLCVideoLayer layer] retain]; - [videoLayer addObserver:self forKeyPath:@"hasVideo" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; - - [videoLayer setDelegate:self]; - NSAssert( mainWindowController, @"No mainWindowController" ); - [mainWindowController.mediaPlayer setVideoLayer: videoLayer]; - mediaListLayer = [[VLCMediaListLayer layerWithMediaArrayController:mainWindowController.mediaArrayController] retain]; - [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, NSURLPboardType, @"VLCMediaURLType", nil]]; - [mainWindowController.mediaArrayController setSelectsInsertedObjects:YES]; - [mainWindowController.mediaArrayController setAvoidsEmptySelection:YES]; - [[self layer] addSublayer:mediaListLayer]; - mediaListLayer.frame = [self layer].bounds; - [mediaListLayer setAutoresizingMask:kCALayerWidthSizable|kCALayerHeightSizable]; - - [[self layer] setNeedsDisplay]; - -} - -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context -{ - if([keyPath isEqualToString:@"hasVideo"]) - { - [self setHasVideo:[object hasVideo]]; - return; - } - [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; -} - -- (void)dealloc -{ - /* Previously registered in */ - [videoLayer removeObserver:self forKeyPath:@"hasVideo"]; - - [mediaListLayer release]; - [videoLayer release]; - [tempFullScreenView release]; - [selectedPath release]; - [super dealloc]; -} - -#pragma mark - -/* Drag and drop */ - -- (NSDragOperation)draggingEntered:(id )sender -{ - NSPasteboard *pboard; - - pboard = [sender draggingPasteboard]; - - if ( [[pboard types] containsObject:NSFilenamesPboardType] && - ![mainWindowController.mediaArrayController.contentMediaList isReadOnly] ) - { - self.layer.borderColor = CGColorCreateGenericGray(0.5, 0.5); - self.layer.cornerRadius = 10.f; - self.layer.borderWidth = 10.0; - return NSDragOperationCopy; - } - return NSDragOperationNone; -} - -- (void)draggingEnded:(id < NSDraggingInfo >)sender -{ - [CATransaction begin]; - [CATransaction setValue:[NSNumber numberWithFloat:0.1] forKey:kCATransactionAnimationDuration]; - self.layer.borderWidth = 0.; - [CATransaction commit]; - [CATransaction begin]; - [mainWindowController.mediaArrayController setFilterPredicate:nil]; - [mainWindowController.mediaArrayController setSelectionIndex:[mainWindowController.mediaArrayController.contentMediaList count] - 1]; - [CATransaction commit]; -} - -- (void)draggingExited:(id < NSDraggingInfo >)sender -{ - self.layer.borderWidth = 0.; -} - -- (BOOL)performDragOperation:(id )sender -{ - NSPasteboard *pboard; - NSDragOperation sourceDragMask; - - sourceDragMask = [sender draggingSourceOperationMask]; - pboard = [sender draggingPasteboard]; - - if ( [[pboard types] containsObject:NSFilenamesPboardType] ) - { - NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; - VLCMediaList * mediaList = mainWindowController.mediaArrayController.contentMediaList; - if( [mediaList isReadOnly] ) - return NO; - - [CATransaction begin]; - for( NSString * filePath in files ) - [mediaList addMedia:[VLCMedia mediaWithPath:filePath]]; - [CATransaction commit]; - } - return YES; -} - -- (void)showDrag -{ - -} - -#pragma mark - -/* Hiding/Displaying the menu */ - -- (void)hideMenu -{ - if( !menuDisplayed ) - return; /* Nothing to do */ - - [menuLayer removeFromSuperlayer]; - [selectionLayer removeFromSuperlayer]; - [backLayer removeFromSuperlayer]; - //[menuLayer autorelease]; /* Need gc for that */ - //[selectionLayer autorelease]; - //[backLayer autorelease]; - selectionLayer = backLayer = nil; - menuLayer = nil; - menuDisplayed = NO; - [self setNeedsDisplay:YES]; -} - -- (void)displayMenu -{ - if( menuDisplayed || !self.itemsTree ) - return; /* Nothing to do */ - - if( !menuLayer ) - { - CALayer * rootLayer = [self layer]; - rootLayer.backgroundColor = CGColorGetConstantColor(kCGColorBlack); - rootLayer.layoutManager = [CAConstraintLayoutManager layoutManager]; - menuLayer = [VLCBrowsableVideoView menuLayer]; - [self loadItemsAtIndexPath: selectedPath inLayer: menuLayer]; - } - if( !backLayer ) - { - backLayer = [[VLCBrowsableVideoView backLayer] retain]; - } - [[self layer] addSublayer:backLayer]; - [[self layer] addSublayer:menuLayer]; - - [[self layer] setNeedsLayout]; - [[self layer] setNeedsDisplay]; - - menuDisplayed = YES; - [self changeSelectedPath:selectedPath withSelectedIndex:selectedIndex]; -} - -- (void)toggleMenu -{ - if( menuDisplayed ) - [self hideMenu]; - else - [self displayMenu]; -} - -- (IBAction)backToMediaListView:(id)sender -{ - [mainWindowController.mediaPlayer stop]; - [self setHasVideo: NO]; -} - -#pragma mark - -/* drawRect */ - -- (void)drawRect:(NSRect)rect -{ - if( [self hasVideo] ) - { - [[NSColor blackColor] set]; - NSRectFill(rect); - return; - } - NSColor * topGradient = [NSColor colorWithCalibratedWhite:.0f alpha:1.0]; - NSColor * bottomGradient = [NSColor colorWithCalibratedWhite:0.35f alpha:1.0]; - NSGradient * gradient = [[NSGradient alloc] initWithColorsAndLocations:bottomGradient, 0.f, topGradient, 0.65f, topGradient, 1.f, nil]; - [gradient drawInRect:self.bounds angle:100.0]; -} - -#pragma mark - -/* Event handling */ - -- (BOOL)acceptsFirstResponder -{ - return YES; -} - --(void)moveUp:(id)sender -{ - [self changeSelectedIndex:selectedIndex-1]; -} - --(void)moveDown:(id)sender -{ - [self changeSelectedIndex:selectedIndex+1]; -} - -- (void)mouseDown:(NSEvent *)theEvent -{ - if([theEvent clickCount] == 1) - { - NSRect rect1 = [self bounds]; - NSRect rect2 = [self bounds]; - rect1.origin.x += [self bounds].size.width * 4./5.; - rect1.size.width /= 5.; - rect2.size.width /= 5.; - if(NSPointInRect([self convertPoint:[theEvent locationInWindow] fromView:nil], rect1)) - { - [mainWindowController.mediaArrayController selectNext:self]; - } - else if(NSPointInRect([self convertPoint:[theEvent locationInWindow] fromView:nil], rect2)) - { - [mainWindowController.mediaArrayController selectPrevious:self]; - } - return; - } - if([theEvent clickCount] == 2) - { - [mainWindowController mediaListViewItemDoubleClicked:self]; - return; - } - if([theEvent clickCount] == 3) - { - self.fullScreen = !self.fullScreen; - } -} - -- (void)keyDown:(NSEvent *)theEvent -{ - if(([[theEvent charactersIgnoringModifiers] characterAtIndex:0] == 13) && menuDisplayed) - { - [self changeSelectedPath:[selectedPath indexPathByAddingIndex:selectedIndex] withSelectedIndex:0]; - } - else if([[theEvent charactersIgnoringModifiers] characterAtIndex:0] == NSLeftArrowFunctionKey && menuDisplayed) - { - if( [selectedPath length] > 0 ) - [self changeSelectedPath:[selectedPath indexPathByRemovingLastIndex] withSelectedIndex:[selectedPath lastIndex]]; - else - [self hideMenu]; - } - else if(!menuDisplayed && [[theEvent charactersIgnoringModifiers] characterAtIndex:0] == NSRightArrowFunctionKey) - { - [self displayMenu]; - } - else - [super keyDown: theEvent]; - -} - -- (void)enterFullScreenMode:(NSScreen *)screen withOptions:(NSDictionary *)options -{ - [self enterFullScreen: screen]; -} - -- (void)exitFullScreenModeWithOptions:(NSDictionary *)options -{ - [self leaveFullScreen]; - -} - -- (BOOL)isInFullScreenMode -{ - return fullScreen; -} - -@end - -#pragma mark - -/****************************************************************************** - * VLCBrowsableVideoView (Private) - */ - -@implementation VLCBrowsableVideoView (Private) -+ (CAScrollLayer *)menuLayer -{ - CAScrollLayer * layer = [CAScrollLayer layer]; - layer.scrollMode = kCAScrollVertically; - - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY - relativeTo:@"superlayer" attribute:kCAConstraintMaxY]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxX - relativeTo:@"superlayer" attribute:kCAConstraintMaxX]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX - relativeTo:@"superlayer" attribute:kCAConstraintMinX]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinY - relativeTo:@"superlayer" attribute:kCAConstraintMinY]]; - return layer; -} - -+ (CALayer *)backLayer -{ - CALayer * layer = [CALayer layer]; - - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY - relativeTo:@"superlayer" attribute:kCAConstraintMaxY]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxX - relativeTo:@"superlayer" attribute:kCAConstraintMaxX]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX - relativeTo:@"superlayer" attribute:kCAConstraintMinX]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinY - relativeTo:@"superlayer" attribute:kCAConstraintMinY]]; - - layer.opacity = 1.0; - layer.backgroundColor = CGColorCreateGenericRGB(0., 0., 0., .5); - return layer; -} - - -- (void)loadItemsAtIndexPath:(NSIndexPath *)path inLayer:(CALayer *)layer -{ - const CGFloat height=70.0; - const CGFloat fontSize=48.0; - NSArray * items = [self.itemsTree objectAtIndexPath:path withNodeKeyPath:self.nodeKeyPath]; - int i; - - for( i = 0; i < [items count]; i++ ) - { - CATextLayer *menuItemLayer=[CATextLayer layer]; - id item = [items objectAtIndex: i]; - menuItemLayer.string = self.contentKeyPath ? [item valueForKeyPath:self.contentKeyPath] : @"No content Key path set"; - menuItemLayer.font = @"BankGothic-Light"; - menuItemLayer.fontSize = fontSize; - menuItemLayer.foregroundColor = CGColorCreateGenericRGB(1.0,1.0,1.0,1.0); - menuItemLayer.shadowColor = CGColorCreateGenericRGB(0.0,0.0,0.0,1.0); - menuItemLayer.shadowOpacity = 0.7; - menuItemLayer.shadowRadius = 2.0; - - menuItemLayer.frame = CGRectMake( 40., height*(-i) + layer.visibleRect.size.height, 500.0f,70.); - [layer addSublayer: menuItemLayer]; - } - -/* for(i=0; i < [[layer sublayers] count]; i++) - NSLog(@"%d, %@", i, [[[layer sublayers] objectAtIndex: i] string]); - NSLog(@"---");*/ -} - -- (void)changeSelectedIndex:(NSInteger)i -{ - BOOL justCreatedSelectionLayer = NO; - if( !menuDisplayed ) - { - selectedIndex = i; - return; - } - - if( !selectionLayer ) - { - justCreatedSelectionLayer = YES; - /* Rip-off from Apple's Sample code */ - selectionLayer=[[CALayer layer] retain]; - - selectionLayer.borderWidth=2.0; - selectionLayer.borderColor=CGColorCreateGenericRGB(1.0f,1.0f,1.0f,1.0f); - selectionLayer.backgroundColor=CGColorCreateGenericRGB(.9f,1.0f,1.0f,.1f); - - CIFilter *filter = [CIFilter filterWithName:@"CIBloom"]; - [filter setDefaults]; - [filter setValue:[NSNumber numberWithFloat:5.0] forKey:@"inputRadius"]; - - [filter setName:@"pulseFilter"]; - - [selectionLayer setFilters:[NSArray arrayWithObject:filter]]; - - CABasicAnimation* pulseAnimation = [CABasicAnimation animation]; - - pulseAnimation.keyPath = @"filters.pulseFilter.inputIntensity"; - - pulseAnimation.fromValue = [NSNumber numberWithFloat: 0.0]; - pulseAnimation.toValue = [NSNumber numberWithFloat: 3.0]; - - pulseAnimation.duration = 2.0; - pulseAnimation.repeatCount = 1e100f; - pulseAnimation.autoreverses = YES; - - pulseAnimation.timingFunction = [CAMediaTimingFunction functionWithName: - kCAMediaTimingFunctionEaseInEaseOut]; - - [selectionLayer addAnimation:pulseAnimation forKey:@"pulseAnimation"]; - [[self layer] addSublayer:selectionLayer]; - } - NSArray * items = [self.itemsTree objectAtIndexPath:selectedPath withNodeKeyPath:self.nodeKeyPath]; - if( [items count] <= 0 ) - return; - if( i >= [items count] ) i = [items count] - 1; - if( i < 0 ) i = 0; - - CALayer * layer = [[menuLayer sublayers] objectAtIndex: i]; - CGRect frame = layer.frame; - if( i == 0 ) - { - frame.origin.y -= [self layer].bounds.size.height - frame.size.height; - frame.size.height = [self layer].bounds.size.height; - } - [(CAScrollLayer*)menuLayer scrollToRect:frame]; - - if( !justCreatedSelectionLayer ) /* Get around an artifact on first launch */ - [CATransaction flush]; /* Make sure we get the "right" layer.frame */ - - frame = [[self layer] convertRect:layer.frame fromLayer:[layer superlayer]]; - frame.size.width += 200.; - frame.origin.x -= 100.f; - selectionLayer.frame = frame; - - selectionLayer.cornerRadius = selectionLayer.bounds.size.height / 2.; - selectedIndex = i; -} - -- (void)changeSelectedPath:(NSIndexPath *)newPath withSelectedIndex:(NSUInteger)newIndex -{ - if( menuDisplayed ) - { - id object = [itemsTree objectAtIndexPath:newPath withNodeKeyPath:nodeKeyPath]; - /* Make sure we are in a node */ - if( ![object isKindOfClass:[NSArray class]] ) - { - self.selectedObject = object; - if( !self.target || !self.action ) - { - [NSException raise:@"VLCBrowsableVideoViewNoActionSpecified" format:@"*** Exception [%@]: No action specified.", [self class]]; - return; - } - void (*method)(id, SEL, id) = (void (*)(id, SEL, id))[self.target methodForSelector: self.action]; - - method( self.target, self.action, self); - - [self hideMenu]; - return; - } - - /* Make sure the node isn't empty */ - if( ![object count] ) - { - [self displayEmptyView]; - } - else - { - CALayer * newMenuLayer = [VLCBrowsableVideoView menuLayer]; - if( menuLayer ) - newMenuLayer.bounds = menuLayer.bounds; /* Get around some artifacts */ - [self loadItemsAtIndexPath:newPath inLayer:newMenuLayer]; - if( menuLayer ) - [[self layer] replaceSublayer:menuLayer with:newMenuLayer]; - else - [[self layer] addSublayer:newMenuLayer]; - //[menuLayer autorelease]; /* warn: we need gc for that */ - menuLayer = [newMenuLayer retain]; - } - } - [selectedPath release]; - selectedPath = [newPath retain]; - [self changeSelectedIndex:newIndex]; -} - -- (void)displayEmptyView -{ - CALayer * layer = [CALayer layer]; - layer.layoutManager = [CAConstraintLayoutManager layoutManager]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY - relativeTo:@"superlayer" attribute:kCAConstraintMaxY]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxX - relativeTo:@"superlayer" attribute:kCAConstraintMaxX]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX - relativeTo:@"superlayer" attribute:kCAConstraintMinX]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinY - relativeTo:@"superlayer" attribute:kCAConstraintMinY]]; - - CATextLayer *menuItemLayer=[CATextLayer layer]; - menuItemLayer.string = @"Empty"; - menuItemLayer.font = @"BankGothic-Light"; - menuItemLayer.fontSize = 48.f; - menuItemLayer.foregroundColor = CGColorCreateGenericRGB(1.0,1.0,1.0,1.0); - menuItemLayer.shadowColor = CGColorCreateGenericRGB(0.0,0.0,0.0,1.0); - menuItemLayer.shadowOpacity = 0.7; - menuItemLayer.shadowRadius = 2.0; - - [menuItemLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX - relativeTo:@"superlayer" attribute:kCAConstraintMidX]]; - [menuItemLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY - relativeTo:@"superlayer" attribute:kCAConstraintMidY]]; - [layer addSublayer:menuItemLayer]; - - if( menuLayer ) - [[self layer] replaceSublayer:menuLayer with:layer]; - else - [[self layer] addSublayer:layer]; - [selectionLayer removeFromSuperlayer]; - //[selectionLayer autorelease] /* need gc */ - //[menuLayer autorelease] /* need gc */ - menuLayer = layer; - selectionLayer = nil; -} - - -@end - -#pragma mark - - -@implementation VLCBrowsableVideoView (FullScreenTransition) - -- (void)enterFullScreen:(NSScreen *)screen -{ - NSMutableDictionary *dict1,*dict2; - NSRect screenRect; - NSRect aRect; - - screenRect = [screen frame]; - - [NSCursor setHiddenUntilMouseMoves: YES]; - - /* Only create the o_fullScreen_window if we are not in the middle of the zooming animation */ - if (!fullScreenWindow) - { - /* We can't change the styleMask of an already created NSWindow, so we create an other window, and do eye catching stuff */ - - aRect = [[self superview] convertRect: [self frame] toView: nil]; /* Convert to Window base coord */ - aRect.origin.x += [[self window] frame].origin.x; - aRect.origin.y += [[self window] frame].origin.y; - fullScreenWindow = [[VLCWindow alloc] initWithContentRect:aRect styleMask: NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]; - [fullScreenWindow setBackgroundColor: [NSColor blackColor]]; - [fullScreenWindow setCanBecomeKeyWindow: YES]; - - if (![[self window] isVisible] || [[self window] alphaValue] == 0.0 || [self isHiddenOrHasHiddenAncestor] ) - { - /* We don't animate if we are not visible, instead we - * simply fade the display */ - CGDisplayFadeReservationToken token; - - [fullScreenWindow setFrame:screenRect display:NO]; - - CGAcquireDisplayFadeReservation(kCGMaxDisplayReservationInterval, &token); - CGDisplayFade( token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0, 0, 0, YES ); - - if ([screen isMainScreen]) - SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar); - - [self retain]; - [[self superview] replaceSubview:self with:tempFullScreenView]; - [tempFullScreenView setFrame:[self frame]]; - [fullScreenWindow setContentView:self]; - [fullScreenWindow makeKeyAndOrderFront:self]; - [self release]; - [[tempFullScreenView window] orderOut: self]; - - CGDisplayFade( token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0, 0, 0, NO ); - CGReleaseDisplayFadeReservation( token); - - [self hasBecomeFullScreen]; - - return; - } - - /* Make sure we don't see the o_view disappearing of the screen during this operation */ - DisableScreenUpdates(); - [self retain]; /* Removing from a view, make sure we won't be released */ - /* Make sure our layer won't disappear */ - CALayer * layer = [[self layer] retain]; - id alayoutManager = layer.layoutManager; - [[self superview] replaceSubview:self with:tempFullScreenView]; - [tempFullScreenView setFrame:[self frame]]; - [fullScreenWindow setContentView:self]; - [self setWantsLayer:YES]; - [self setLayer:layer]; - layer.layoutManager = alayoutManager; - - [fullScreenWindow makeKeyAndOrderFront:self]; - EnableScreenUpdates(); - } - - /* We are in fullScreen (and no animation is running) */ - if (fullScreen) - { - /* Make sure we are hidden */ - [[tempFullScreenView window] orderOut: self]; - return; - } - - if (fullScreenAnim1) - { - [fullScreenAnim1 stopAnimation]; - [fullScreenAnim1 release]; - } - if (fullScreenAnim2) - { - [fullScreenAnim2 stopAnimation]; - [fullScreenAnim2 release]; - } - - if ([screen isMainScreen]) - SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar); - - dict1 = [[NSMutableDictionary alloc] initWithCapacity:2]; - dict2 = [[NSMutableDictionary alloc] initWithCapacity:3]; - - [dict1 setObject:[tempFullScreenView window] forKey:NSViewAnimationTargetKey]; - [dict1 setObject:NSViewAnimationFadeOutEffect forKey:NSViewAnimationEffectKey]; - - [dict2 setObject:fullScreenWindow forKey:NSViewAnimationTargetKey]; - [dict2 setObject:[NSValue valueWithRect:[fullScreenWindow frame]] forKey:NSViewAnimationStartFrameKey]; - [dict2 setObject:[NSValue valueWithRect:screenRect] forKey:NSViewAnimationEndFrameKey]; - - /* Strategy with NSAnimation allocation: - - Keep at most 2 animation at a time - - leaveFullScreen/enterFullScreen are the only responsible for releasing and alloc-ing - */ - fullScreenAnim1 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict1, nil]]; - fullScreenAnim2 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict2, nil]]; - - [dict1 release]; - [dict2 release]; - - [fullScreenAnim1 setAnimationBlockingMode: NSAnimationNonblocking]; - [fullScreenAnim1 setDuration: 0.3]; - [fullScreenAnim1 setFrameRate: 30]; - [fullScreenAnim2 setAnimationBlockingMode: NSAnimationNonblocking]; - [fullScreenAnim2 setDuration: 0.3]; - [fullScreenAnim2 setFrameRate: 30]; - - [fullScreenAnim2 setDelegate: self]; - [fullScreenAnim2 startWhenAnimation: fullScreenAnim1 reachesProgress: 1.0]; - - [fullScreenAnim1 startAnimation]; -} - -- (void)hasBecomeFullScreen -{ - [fullScreenWindow makeFirstResponder: self]; - - [fullScreenWindow makeKeyWindow]; - [fullScreenWindow setAcceptsMouseMovedEvents: TRUE]; - - [[tempFullScreenView window] orderOut: self]; - [self willChangeValueForKey:@"fullScreen"]; - fullScreen = YES; - [self didChangeValueForKey:@"fullScreen"]; -} - -- (void)leaveFullScreen -{ - [self leaveFullScreenAndFadeOut: NO]; -} - -- (void)leaveFullScreenAndFadeOut: (BOOL)fadeout -{ - NSMutableDictionary *dict1, *dict2; - NSRect frame; - - [self willChangeValueForKey:@"fullScreen"]; - fullScreen = NO; - [self didChangeValueForKey:@"fullScreen"]; - - /* Don't do anything if o_fullScreen_window is already closed */ - if (!fullScreenWindow) - return; - - if (fadeout || [tempFullScreenView isHiddenOrHasHiddenAncestor]) - { - /* We don't animate if we are not visible, instead we - * simply fade the display */ - CGDisplayFadeReservationToken token; - - CGAcquireDisplayFadeReservation(kCGMaxDisplayReservationInterval, &token); - CGDisplayFade( token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0, 0, 0, YES ); - - SetSystemUIMode( kUIModeNormal, kUIOptionAutoShowMenuBar); - - [self hasEndedFullScreen]; - - CGDisplayFade( token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0, 0, 0, NO ); - CGReleaseDisplayFadeReservation( token); - return; - } - - [[tempFullScreenView window] setAlphaValue: 0.0]; - [[tempFullScreenView window] orderFront: self]; - - SetSystemUIMode( kUIModeNormal, kUIOptionAutoShowMenuBar); - - if (fullScreenAnim1) - { - [fullScreenAnim1 stopAnimation]; - [fullScreenAnim1 release]; - } - if (fullScreenAnim2) - { - [fullScreenAnim2 stopAnimation]; - [fullScreenAnim2 release]; - } - - frame = [[tempFullScreenView superview] convertRect: [tempFullScreenView frame] toView: nil]; /* Convert to Window base coord */ - frame.origin.x += [tempFullScreenView window].frame.origin.x; - frame.origin.y += [tempFullScreenView window].frame.origin.y; - - dict2 = [[NSMutableDictionary alloc] initWithCapacity:2]; - [dict2 setObject:[tempFullScreenView window] forKey:NSViewAnimationTargetKey]; - [dict2 setObject:NSViewAnimationFadeInEffect forKey:NSViewAnimationEffectKey]; - - fullScreenAnim2 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict2, nil]]; - [dict2 release]; - - [fullScreenAnim2 setAnimationBlockingMode: NSAnimationNonblocking]; - [fullScreenAnim2 setDuration: 0.3]; - [fullScreenAnim2 setFrameRate: 30]; - - [fullScreenAnim2 setDelegate: self]; - - dict1 = [[NSMutableDictionary alloc] initWithCapacity:3]; - - [dict1 setObject:fullScreenWindow forKey:NSViewAnimationTargetKey]; - [dict1 setObject:[NSValue valueWithRect:[fullScreenWindow frame]] forKey:NSViewAnimationStartFrameKey]; - [dict1 setObject:[NSValue valueWithRect:frame] forKey:NSViewAnimationEndFrameKey]; - - fullScreenAnim1 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict1, nil]]; - [dict1 release]; - - [fullScreenAnim1 setAnimationBlockingMode: NSAnimationNonblocking]; - [fullScreenAnim1 setDuration: 0.2]; - [fullScreenAnim1 setFrameRate: 30]; - [fullScreenAnim2 startWhenAnimation: fullScreenAnim1 reachesProgress: 1.0]; - - /* Make sure o_fullScreen_window is the frontmost window */ - [fullScreenWindow orderFront: self]; - - [fullScreenAnim1 startAnimation]; -} - -- (void)hasEndedFullScreen -{ - /* This function is private and should be only triggered at the end of the fullScreen change animation */ - /* Make sure we don't see the o_view disappearing of the screen during this operation */ - DisableScreenUpdates(); - [self retain]; - /* Make sure we don't loose the layer */ - CALayer * layer = [[self layer] retain]; - id alayoutManager = layer.layoutManager; - [self removeFromSuperviewWithoutNeedingDisplay]; - [[tempFullScreenView superview] replaceSubview:tempFullScreenView with:self]; - [self release]; - [self setWantsLayer:YES]; - [self setLayer:layer]; - layer.layoutManager = alayoutManager; - - [self setFrame:[tempFullScreenView frame]]; - [[self window] makeFirstResponder: self]; - if ([[self window] isVisible]) - [[self window] makeKeyAndOrderFront:self]; - [fullScreenWindow orderOut: self]; - EnableScreenUpdates(); - - [fullScreenWindow release]; - fullScreenWindow = nil; -} - -- (void)animationDidEnd:(NSAnimation*)animation -{ - NSArray *viewAnimations; - - if ([animation currentValue] < 1.0) - return; - - /* FullScreen ended or started (we are a delegate only for leaveFullScreen's/enterFullscren's anim2) */ - viewAnimations = [fullScreenAnim2 viewAnimations]; - if ([viewAnimations count] >=1 && - [[[viewAnimations objectAtIndex: 0] objectForKey: NSViewAnimationEffectKey] isEqualToString:NSViewAnimationFadeInEffect]) - { - /* FullScreen ended */ - [self hasEndedFullScreen]; - } - else - { - /* FullScreen started */ - [self hasBecomeFullScreen]; - } -} - -@end - diff --git a/projects/macosx/vlc_app/Sources/VLCController.h b/projects/macosx/vlc_app/Sources/VLCController.h deleted file mode 100644 index 3798876ff5..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCController.h +++ /dev/null @@ -1,38 +0,0 @@ -/***************************************************************************** - * VLCController.h: VLC.app main controller - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import -#import - -@class VLCMainWindow; - -@interface VLCController : NSObject -{ - NSArray * categories; -} -@property (readonly, retain) NSArray * categories; - -- (void)newMainWindow:(id)sender; -- (void)addPlaylist:(id)sender; -@end diff --git a/projects/macosx/vlc_app/Sources/VLCController.m b/projects/macosx/vlc_app/Sources/VLCController.m deleted file mode 100644 index 53dea37067..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCController.m +++ /dev/null @@ -1,105 +0,0 @@ -/***************************************************************************** - * VLCController.m: VLC.app main controller - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import - -#import "VLCController.h" -#import "VLCAppAdditions.h" -#import "VLCValueTransformer.h" - -@interface VLCController () -@property (readwrite,retain) NSArray * categories; -@end - -/****************************************************************************** - * VLCBrowsableVideoView - */ -@implementation VLCController -@synthesize categories; - -- (void)awakeFromNib -{ - /*********************************** - * Register our bindings value transformer - */ - VLCFloat10000FoldTransformer *float100fold; - float100fold = [[[VLCFloat10000FoldTransformer alloc] init] autorelease]; - [NSValueTransformer setValueTransformer:(id)float100fold forName:@"Float10000FoldTransformer"]; - VLCNonNilAsBoolTransformer *nonNilAsBool; - nonNilAsBool = [[[VLCNonNilAsBoolTransformer alloc] init] autorelease]; - [NSValueTransformer setValueTransformer:(id)nonNilAsBool forName:@"NonNilAsBoolTransformer"]; - VLCURLToRepresentedFileNameTransformer *urlToRepresentedFileName; - urlToRepresentedFileName = [[[VLCURLToRepresentedFileNameTransformer alloc] init] autorelease]; - [NSValueTransformer setValueTransformer:(id)urlToRepresentedFileName forName:@"URLToRepresentedFileNameTransformer"]; - VLCSelectionIndexToDescriptionTransformer *indexToDescription; - indexToDescription = [[[VLCSelectionIndexToDescriptionTransformer alloc] init] autorelease]; - [NSValueTransformer setValueTransformer:(id)indexToDescription forName:@"SelectionIndexToDescriptionTransformer"]; - - /*********************************** - * categories: Main content - */ - NSArray * mediaDiscoverers = [NSArray arrayWithObjects: - [[[VLCMediaDiscoverer alloc] initWithName:@"shoutcasttv"] autorelease], - [[[VLCMediaDiscoverer alloc] initWithName:@"shoutcast"] autorelease], - [[[VLCMediaDiscoverer alloc] initWithName:@"sap"] autorelease], - [[[VLCMediaDiscoverer alloc] initWithName:@"freebox"] autorelease], nil]; - - self.categories = [NSArray arrayWithObjects: - [NSMutableDictionary dictionaryWithObjectsAndKeys: - [@"Service Discovery" uppercaseString], @"descriptionInCategoriesList", - @"Service Discovery", @"descriptionInVideoView", - [NSNumber numberWithBool:NO], @"selectableInCategoriesList", - mediaDiscoverers, @"childrenInCategoriesList", - mediaDiscoverers, @"childrenInVideoView", - nil], - [VLCMedia mediaAsNodeWithName:@"Playlist"], - nil]; - - /* Execution will continue in applicationDidFinishLaunching */ - [NSApp setDelegate:self]; -} - -- (void)newMainWindow:(id)sender -{ - if (![NSBundle loadNibNamed:@"MainWindow" owner:self]) - { - NSLog(@"Warning! Could not load MainWindow file.\n"); - } - /* We are done. Should be on screen if Visible at launch time is checked */ -} - -- (void)addPlaylist:(id)sender -{ - // TODO - NSLog(@"unimplemented!"); -} - -@end - -@implementation VLCController (NSAppDelegate) -- (void)applicationDidFinishLaunching:(NSNotification *)notification -{ - [self newMainWindow: self]; -} -@end diff --git a/projects/macosx/vlc_app/Sources/VLCExceptionHandler.h b/projects/macosx/vlc_app/Sources/VLCExceptionHandler.h deleted file mode 100644 index fe667fdb99..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCExceptionHandler.h +++ /dev/null @@ -1,32 +0,0 @@ -/***************************************************************************** - * VLCExceptionHandler.h: VLCExceptionHandler implementation - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import - - -@interface VLCExceptionHandler : NSObject { - -} -- (void)printStackTrace:(NSException *)e; -@end diff --git a/projects/macosx/vlc_app/Sources/VLCExceptionHandler.m b/projects/macosx/vlc_app/Sources/VLCExceptionHandler.m deleted file mode 100644 index 03aff61464..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCExceptionHandler.m +++ /dev/null @@ -1,85 +0,0 @@ -/***************************************************************************** - * VLCExceptionHandler.m: VLCExceptionHandler implementation - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import "VLCExceptionHandler.h" -#import - - -@implementation VLCExceptionHandler -+ (void)load -{ - [[NSExceptionHandler defaultExceptionHandler] setDelegate:[[VLCExceptionHandler alloc] init]]; - - [[NSExceptionHandler defaultExceptionHandler] setExceptionHandlingMask: - 0xffff /* Catch all */ ]; - - [[NSExceptionHandler defaultExceptionHandler] setExceptionHangingMask: - NSHangOnUncaughtExceptionMask| - NSHangOnUncaughtSystemExceptionMask| - NSHangOnUncaughtRuntimeErrorMask| - NSHangOnTopLevelExceptionMask| - NSHangOnOtherExceptionMask]; -} - -/* From Apple's guide on exception */ -- (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldLogException:(NSException *)exception mask:(unsigned int)aMask -{ - [self printStackTrace:exception]; - NSLog(@"*** Exception Handled! %@: %@", [exception name], [exception reason]); - int ret = NSRunCriticalAlertPanel(@"Exception not handled!", - [NSString stringWithFormat:@"%@: %@\n\nBack trace has been printed to Console.\n\nWe will now wait for debugger connection...\n", - [exception name], [exception reason]], - @"Quit", @"Wait Debugger", nil); - if( ret == NSOKButton ) - { - [NSApp terminate:self]; - } - return YES; -} - -- (void)printStackTrace:(NSException *)e -{ - NSString *stack = [[e userInfo] objectForKey:NSStackTraceKey]; - if (!stack) - { - NSLog(@"No stack trace available."); - return; - } - - NSTask *ls = [[NSTask alloc] init]; - NSString *pid = [[NSNumber numberWithInt:[[NSProcessInfo processInfo] processIdentifier]] stringValue]; - NSMutableArray *args = [NSMutableArray arrayWithCapacity:20]; - - [args addObject:@"-p"]; - [args addObject:pid]; - [args addObjectsFromArray:[stack componentsSeparatedByString:@" "]]; - /* Note: function addresses are separated by double spaces, not a single space. */ - - [ls setLaunchPath:@"/usr/bin/atos"]; - [ls setArguments:args]; - [ls launch]; - [ls release]; -} - -@end diff --git a/projects/macosx/vlc_app/Sources/VLCFullScreenControllerWindow.h b/projects/macosx/vlc_app/Sources/VLCFullScreenControllerWindow.h deleted file mode 100644 index 3a2ee041fc..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCFullScreenControllerWindow.h +++ /dev/null @@ -1,57 +0,0 @@ -/***************************************************************************** - * VLCFullScreenControllerWindow.m: class that allow media controlling in - * fullscreen (with the mouse) - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import -#import -#import "VLCAppAdditions.h" -#import "VLCMainWindowController.h" - - -@interface VLCFullScreenControllerWindow : NSPanel -{ - /* IBOutlets */ - IBOutlet VLCImageCustomizedSlider * volumeSlider; - IBOutlet VLCImageCustomizedSlider * mediaPositionSlider; - - IBOutlet NSButton * mediaPlayerForwardNextButton; - IBOutlet NSButton * mediaPlayerBackwardPrevButton; - IBOutlet NSButton * mediaPlayerPlayPauseStopButton; - - IBOutlet id fillScreenButton; - IBOutlet id fullScreenButton; - IBOutlet NSTextField * mediaReadingProgressText; - IBOutlet NSTextField * mediaDescriptionText; - - NSTimer * hideWindowTimer; - NSTrackingArea * videoViewTrackingArea; - BOOL active; - - /* Owner */ - IBOutlet VLCMainWindowController * mainWindowController; - - /* Draging the window using its content */ - NSPoint mouseClic; -} -@end diff --git a/projects/macosx/vlc_app/Sources/VLCFullScreenControllerWindow.m b/projects/macosx/vlc_app/Sources/VLCFullScreenControllerWindow.m deleted file mode 100644 index 17c5a77a59..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCFullScreenControllerWindow.m +++ /dev/null @@ -1,288 +0,0 @@ -/***************************************************************************** - * VLCFullScreenControllerWindow.m: class that allow media controlling in - * fullscreen (with the mouse) - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Jérôme Decoodt - * Felix Kühne - * Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import "VLCFullScreenControllerWindow.h" - -@interface VLCFullScreenControllerWindow (Private) -- (void)hide; -- (void)show; -- (void)updateTrackingRect; -@end - -/***************************************************************************** - * @implementation VLCFullScreenControllerWindow - */ - -@implementation VLCFullScreenControllerWindow - -/* We override this initializer so we can set the NSBorderlessWindowMask styleMask, and set a few other important settings */ -- (id)initWithContentRect:(NSRect)contentRect - styleMask:(unsigned int)aStyle - backing:(NSBackingStoreType)bufferingType - defer:(BOOL)flag -{ - if( self = [super initWithContentRect:contentRect styleMask:NSTexturedBackgroundWindowMask backing:bufferingType defer:flag] ) - { - [self setOpaque:NO]; - [self setHasShadow: NO]; - [self setBackgroundColor:[NSColor clearColor]]; - - /* let the window sit on top of everything else and start out completely transparent */ - [self setLevel:NSFloatingWindowLevel]; - [self center]; - } - return self; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [hideWindowTimer invalidate]; - [hideWindowTimer release]; - [videoViewTrackingArea release]; - [super dealloc]; -} - -- (void)awakeFromNib -{ - hideWindowTimer = nil; - videoViewTrackingArea = nil; - - [self setMovableByWindowBackground:YES]; - - /* Make sure we'll detect when to close the window, see animationDidStop:finished: */ - CAAnimation *alphaValueAnimation = [CABasicAnimation animation]; - [alphaValueAnimation setDelegate:self]; - [self setAnimations:[NSDictionary dictionaryWithObject:alphaValueAnimation forKey:@"alphaValue"]]; - hideWindowTimer = nil; - - /* WindowView setup */ - [[mainWindowController.videoView window] setAcceptsMouseMovedEvents:YES]; - [[mainWindowController.videoView window] makeFirstResponder:mainWindowController.videoView]; - [mainWindowController.videoView setPostsBoundsChangedNotifications: YES]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoViewDidChangeBounds:) name:NSViewBoundsDidChangeNotification object:(id)mainWindowController.videoView]; - - /* Make sure we can know when the mouse is inside us */ - [[self contentView] addTrackingRect:[[self contentView] bounds] owner:self userData:nil assumeInside:NO]; - - /* Bindings connection */ - /* Sound */ - [volumeSlider setKnobImage:[NSImage imageNamed:@"fs_volume_slider_knob_highlight.png"]]; - [volumeSlider setBackgroundImage:[NSImage imageNamed:@"fs_volume_slider_bar.png"]]; - [volumeSlider setNeedsDisplay:YES]; - [volumeSlider bind:@"value" toObject:[VLCLibrary sharedLibrary] withKeyPath:@"audio.volume" options: nil]; - - /* media position */ - [mediaPositionSlider setKnobImage:[NSImage imageNamed:@"fs_time_slider_knob.png"]]; - [mediaPositionSlider setBackgroundImage:[NSImage imageNamed:@"fs_time_slider.png"]]; - [mediaPositionSlider setNeedsDisplay:YES]; - - [mediaPositionSlider bind:@"enabled" toObject:mainWindowController.mediaPlayer withKeyPath:@"media" options: [NSDictionary dictionaryWithObject:@"NonNilAsBoolTransformer" forKey:NSValueTransformerNameBindingOption]]; - [mediaPositionSlider bind:@"enabled2" toObject:mainWindowController.mediaPlayer withKeyPath:@"seekable" options: nil]; - - [mediaPositionSlider bind:@"value" toObject:mainWindowController.mediaPlayer withKeyPath:@"position" options: - [NSDictionary dictionaryWithObjectsAndKeys:@"Float10000FoldTransformer", NSValueTransformerNameBindingOption, - [NSNumber numberWithBool:NO], NSConditionallySetsEnabledBindingOption, nil ]]; - - - [fillScreenButton bind:@"value" toObject:mainWindowController.videoView withKeyPath:@"videoLayer.fillScreen" options: nil]; - [fullScreenButton bind:@"value" toObject:mainWindowController.videoView withKeyPath:@"fullScreen" options: nil]; - - [mediaReadingProgressText bind:@"value" toObject:mainWindowController.mediaPlayer withKeyPath:@"time.stringValue" options: nil]; - [mediaDescriptionText bind:@"value" toObject:mainWindowController.mediaPlayer withKeyPath:@"description" options: nil]; - - /* mainWindowController.mediaPlayer */ - [mediaPlayerPlayPauseStopButton bind:@"enabled" toObject:mainWindowController.mediaPlayer withKeyPath:@"media" options: [NSDictionary dictionaryWithObject:@"NonNilAsBoolTransformer" forKey:NSValueTransformerNameBindingOption]]; - [mediaPlayerPlayPauseStopButton bind:@"state" toObject:mainWindowController.mediaPlayer withKeyPath:@"playing" options: nil]; - [mediaPlayerPlayPauseStopButton bind:@"alternateImage" toObject:mainWindowController.mediaPlayer withKeyPath:@"stateAsFullScreenButtonAlternateImage" options: nil]; - [mediaPlayerPlayPauseStopButton bind:@"image" toObject:mainWindowController.mediaPlayer withKeyPath:@"stateAsFullScreenButtonImage" options: nil]; - [mediaPlayerBackwardPrevButton bind:@"enabled" toObject:mainWindowController.mediaPlayer withKeyPath:@"playing" options: nil]; - [mediaPlayerForwardNextButton bind:@"enabled" toObject:mainWindowController.mediaPlayer withKeyPath:@"playing" options: nil]; - [mediaPlayerForwardNextButton setTarget:mainWindowController.mediaPlayer]; - [mediaPlayerForwardNextButton setAction:@selector(fastForward)]; - [mediaPlayerBackwardPrevButton setTarget:mainWindowController.mediaPlayer]; - [mediaPlayerBackwardPrevButton setAction:@selector(rewind)]; - [mediaPlayerPlayPauseStopButton setTarget:mainWindowController.mediaPlayer]; - [mediaPlayerPlayPauseStopButton setAction:@selector(pause)]; - - [self bind:@"fullScreen" toObject:mainWindowController.videoView withKeyPath:@"fullScreen" options: nil]; - - active = NO; -} - -- (BOOL)fullScreen -{ - /* Only to comply to KVC */ - return active; -} - -- (void)setFullScreen:(BOOL)fullScreen -{ - if(fullScreen) - { - active = YES; - [self show]; - } - else - { - [self hide]; - active = NO; - } -} - --(void)center -{ - /* centre the panel in the lower third of the screen */ - NSPoint theCoordinate; - NSRect theScreensFrame; - NSRect theWindowsFrame; - - theScreensFrame = [[self screen] frame]; - - theWindowsFrame = [self frame]; - - theCoordinate.x = (theScreensFrame.size.width - theWindowsFrame.size.width) / 2 + theScreensFrame.origin.x; - theCoordinate.y = (theScreensFrame.size.height / 3) - theWindowsFrame.size.height + theScreensFrame.origin.y; - [self setFrameTopLeftPoint: theCoordinate]; -} - -@end - -/***************************************************************************** - * @implementation VLCFullScreenControllerWindow (Private) - */ - -@implementation VLCFullScreenControllerWindow (Private) -- (void)show -{ - if(![self isVisible]) - self.alphaValue = 0.0; - - if( !NSPointInRect([NSEvent mouseLocation],[self frame]) ) - { - [hideWindowTimer invalidate]; - [hideWindowTimer release]; - hideWindowTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(hide) userInfo:nil repeats:NO] retain]; - } - [self orderFront:self]; - [self.animator setAlphaValue:1.0]; -} - -- (void)hide -{ - [hideWindowTimer invalidate]; - [hideWindowTimer release]; - hideWindowTimer = nil; - if ([self isVisible]) - { - [self.animator setAlphaValue:0.0]; - [NSCursor setHiddenUntilMouseMoves:YES]; - } - [self updateTrackingRect]; -} - -- (void)updateTrackingRect -{ - VLCBrowsableVideoView * videoView = mainWindowController.videoView; - - if( videoViewTrackingArea ) - { - [videoView removeTrackingArea:videoViewTrackingArea]; - [videoViewTrackingArea release]; - } - videoViewTrackingArea = [[NSTrackingArea alloc] initWithRect:[videoView bounds] options:NSTrackingMouseMoved|NSTrackingActiveAlways|NSTrackingAssumeInside|NSTrackingEnabledDuringMouseDrag owner:self userInfo:nil]; - [videoView addTrackingArea:videoViewTrackingArea]; - -} - -@end - -/***************************************************************************** - * @implementation VLCFullScreenControllerWindow (NSAnimationDelegate) - */ - -@implementation VLCFullScreenControllerWindow (NSAnimationDelegate) -- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag -{ - if( self.alphaValue == 0.0 ) - [self orderOut:self]; -} -@end - -/***************************************************************************** - * @implementation VLCFullScreenControllerWindow (NSTrackingRectCallbacksInVideoView) - */ - -@implementation VLCFullScreenControllerWindow (NSTrackingRectCallbacks) -- (void)mouseMoved:(NSEvent *)theEvent -{ - if([theEvent window] != self) - { - if( active ) - [self show]; - } -} -- (void)mouseEntered:(NSEvent *)theEvent -{ - if([theEvent window] == self) - { - [hideWindowTimer invalidate]; - [hideWindowTimer release]; - hideWindowTimer = nil; - } -} -- (void)mouseExited:(NSEvent *)theEvent -{ - if([theEvent window] == self) - { - [hideWindowTimer invalidate]; - [hideWindowTimer release]; - hideWindowTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(hide) userInfo:nil repeats:NO] retain]; - } - else - { - if( active ) - [self hide]; - } -} -- (void)cursorUpdate:(NSEvent *)event -{ - -} -@end - -/***************************************************************************** - * @implementation VLCFullScreenControllerWindow (VideoViewBoundsChanges) - */ -@implementation VLCFullScreenControllerWindow (VideoViewBoundsChanges) -- (void)videoViewDidChangeBounds:(NSNotification *)theNotification -{ - [self updateTrackingRect]; -} - -@end diff --git a/projects/macosx/vlc_app/Sources/VLCMainWindow.h b/projects/macosx/vlc_app/Sources/VLCMainWindow.h deleted file mode 100644 index 95a4189b96..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCMainWindow.h +++ /dev/null @@ -1,30 +0,0 @@ -/***************************************************************************** - * VLCMainWindow.h: VLCMainWindow implementation - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import - -@interface VLCMainWindow : NSWindow { -} - -@end diff --git a/projects/macosx/vlc_app/Sources/VLCMainWindow.m b/projects/macosx/vlc_app/Sources/VLCMainWindow.m deleted file mode 100644 index 48f4e6c9ed..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCMainWindow.m +++ /dev/null @@ -1,34 +0,0 @@ -/***************************************************************************** - * VLCMainWindow.m: VLCMainWindow implementation - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import "VLCMainWindow.h" - - -/****************************************************************************** - * VLCMainWindow - */ -@implementation VLCMainWindow - -@end - diff --git a/projects/macosx/vlc_app/Sources/VLCMainWindowController.h b/projects/macosx/vlc_app/Sources/VLCMainWindowController.h deleted file mode 100644 index 9280909cdf..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCMainWindowController.h +++ /dev/null @@ -1,81 +0,0 @@ -/***************************************************************************** - * VLCMainWindowController.h: VLCMainWindowController implementation - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import -#import "VLCController.h" -#import "VLCMediaArrayController.h" -#import "VLCAppAdditions.h" -#import "VLCBrowsableVideoView.h" -#import "VLCMainWindow.h" - - -@interface VLCMainWindowController : NSWindowController -{ - IBOutlet VLCOneSplitView * mainSplitView; - - /* Media List */ - IBOutlet NSTableView * mediaListView; - - /* Categories List */ - IBOutlet NSOutlineView * categoriesListView; - - IBOutlet NSButton * addPlaylistButton; - IBOutlet NSButton * removePlaylistButton; - - /* Toolbar control buttons */ - IBOutlet NSButton * mediaPlayerForwardNextButton; - IBOutlet NSButton * mediaPlayerBackwardPrevButton; - IBOutlet NSButton * mediaPlayerPlayPauseStopButton; - - - /* Toolbar */ - IBOutlet NSView * toolbarMediaAudioVolume; - IBOutlet NSView * toolbarMediaDescription; - IBOutlet NSView * toolbarMediaControl; - - /* Video */ - IBOutlet VLCBrowsableVideoView * videoView; - - /* Controllers */ - NSTreeController * categoriesTreeController; - IBOutlet VLCMediaArrayController * mediaArrayController; - IBOutlet VLCMediaPlayer * mediaPlayer; - IBOutlet VLCController * controller; /* This is a VLCController binded to the File's Owner of the nib */ - - /* States */ - float navigatorViewWidth; -} - -@property BOOL navigatorViewVisible; - -- (void)setNavigatorViewVisible:(BOOL)wantsVisible animate:(BOOL)animate; - -@property (readonly) VLCMediaPlayer * mediaPlayer; -@property (readonly) VLCBrowsableVideoView * videoView; -@property (readonly) VLCMediaArrayController * mediaArrayController; -@property (readonly) NSTreeController * categoriesTreeController; - -- (IBAction)mediaListViewItemDoubleClicked:(id)sender; -- (void)videoViewItemClicked:(id)sender; -@end diff --git a/projects/macosx/vlc_app/Sources/VLCMainWindowController.m b/projects/macosx/vlc_app/Sources/VLCMainWindowController.m deleted file mode 100644 index cc1227a08a..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCMainWindowController.m +++ /dev/null @@ -1,407 +0,0 @@ -/***************************************************************************** - * VLCMainWindowController.m: VLCMainWindowController implementation - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import "VLCMainWindowController.h" -#import "VLCAppAdditions.h" -#import "ImageAndTextCell.h" - -/****************************************************************************** - * @implementation VLCMainWindowController - */ - -@implementation VLCMainWindowController - -@synthesize mediaPlayer; -@synthesize videoView; -@synthesize mediaArrayController; -@synthesize categoriesTreeController; - -- (void)awakeFromNib -{ - NSTableColumn * tableColumn; - - /*********************************** - * Init the media player - */ - - NSAssert( mediaPlayer, @"No mediaPlayer" ); - [self willChangeValueForKey:@"categoriesTreeController"]; - categoriesTreeController = [[NSTreeController alloc] init]; - [self didChangeValueForKey:@"categoriesTreeController"]; - - /*********************************** - * CategoriesList OutlineView content - */ - /* categoriesTreeController */ - NSAssert( categoriesTreeController, @"No categoriesTreeController" ); - NSAssert( categoriesListView, @"No categoriesListView" ); - NSAssert( controller, @"No controller" ); - - [categoriesTreeController setContent:controller.categories]; - //[categoriesTreeController bind:@"content" toObject:controller withKeyPath:@"categories" options:nil]; - - [categoriesTreeController setChildrenKeyPath:@"childrenInCategoriesList"]; - - /* Bind the "name" table column */ - tableColumn = [categoriesListView tableColumnWithIdentifier:@"name"]; - [tableColumn bind:@"value" toObject:categoriesTreeController withKeyPath:@"arrangedObjects.descriptionInCategoriesList" options:nil]; - - /* Use an ImageAndTextCell in the "name" table column */ - ImageAndTextCell * cell = [[ImageAndTextCell alloc] init]; - [cell setFont:[[tableColumn dataCell] font]]; - [cell setImageKeyPath:@"image"]; - [tableColumn setDataCell: cell]; - - /* Other setup */ - [categoriesListView setIndentationMarkerFollowsCell:YES]; - [categoriesListView setAutoresizesOutlineColumn:NO]; - [categoriesListView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleSourceList]; - [categoriesListView setDelegate:self]; - - [categoriesListView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, NSURLPboardType, @"VLCMediaURLType", nil]]; - [categoriesListView setDataSource: self]; - - /*********************************** - * mediaListView setup - */ - - /* 1- Drag and drop */ - NSAssert( mediaArrayController, @"No mediaArrayController" ); - NSAssert( mediaListView, @"No mediaListView" ); - [mediaListView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, NSURLPboardType, nil]]; - [mediaListView setDataSource:mediaArrayController]; - /* 3- binding for "title" column */ - tableColumn = [mediaListView tableColumnWithIdentifier:@"title"]; - [tableColumn bind:@"value" toObject: mediaArrayController withKeyPath:@"arrangedObjects.metaDictionary.title" options:nil]; - - - /* 2- Double click */ - [mediaListView setTarget:self]; - [mediaListView setDoubleAction:@selector(mediaListViewItemDoubleClicked:)]; - - - /* 4- binding for "state" column */ - tableColumn = [mediaListView tableColumnWithIdentifier:@"state"]; - [tableColumn bind:@"value" toObject: mediaArrayController withKeyPath:@"arrangedObjects.stateAsImage" options:nil]; - - /* 6- Bind the @"contentArray" and contentMediaList of the mediaArrayController */ - [mediaArrayController bind:@"contentArray" toObject:categoriesTreeController withKeyPath:@"selection.childrenInCategoriesListForDetailView.media" options:nil]; - - [mediaArrayController bind:@"contentMediaList" toObject:categoriesTreeController withKeyPath:@"selection.childrenInCategoriesListForDetailView.parentMediaList" options:nil]; - - /* 7- Aspect */ - [mediaListView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleSourceList]; - [mediaListView setAllowsTypeSelect:YES]; - - /*********************************** - * videoView setup - */ - [videoView setItemsTree:controller.categories]; - [videoView setNodeKeyPath:@"childrenInVideoView"]; - [videoView setContentKeyPath:@"descriptionInVideoView"]; - [videoView setTarget:self]; - [videoView setAction:@selector(videoViewItemClicked:)]; - - /*********************************** - * Toolbar setup - */ - - /*********************************** - * Other interface element setup - */ -#if 0 - - [mediaListItemsCount bind:@"displayPatternValue1" toObject:mediaArrayController withKeyPath:@"arrangedObjects.@count" options:[NSDictionary dictionaryWithObject:@"%{value1}@ items" forKey:NSDisplayPatternBindingOption]]; - [mediaListItemFetchedStatus bind:@"animate" toObject:categoriesTreeController withKeyPath:@"selection.currentlyFetchingItems" options:[NSDictionary dictionaryWithObject:@"%{value1}@ items" forKey:NSDisplayPatternBindingOption]]; - - [fillScreenButton bind:@"value" toObject:videoView withKeyPath:@"fillScreen" options: nil]; - [fullScreenButton bind:@"value" toObject:videoView withKeyPath:@"fullScreen" options: nil]; - [fullScreenButton bind:@"enabled" toObject:mediaPlayer withKeyPath:@"media" options: [NSDictionary dictionaryWithObject:@"NonNilAsBoolTransformer" forKey:NSValueTransformerNameBindingOption]]; - [fillScreenButton bind:@"enabled" toObject:mediaPlayer withKeyPath:@"media" options: [NSDictionary dictionaryWithObject:@"NonNilAsBoolTransformer" forKey:NSValueTransformerNameBindingOption]]; - [mediaReadingProgressSlider bind:@"enabled" toObject:mediaPlayer withKeyPath:@"media" options: [NSDictionary dictionaryWithObject:@"NonNilAsBoolTransformer" forKey:NSValueTransformerNameBindingOption]]; - [mediaReadingProgressSlider bind:@"enabled2" toObject:mediaPlayer withKeyPath:@"seekable" options: nil]; - - [mediaReadingProgressSlider bind:@"value" toObject:mediaPlayer withKeyPath:@"position" options: - [NSDictionary dictionaryWithObjectsAndKeys:@"Float10000FoldTransformer", NSValueTransformerNameBindingOption, - [NSNumber numberWithBool:NO], NSConditionallySetsEnabledBindingOption, nil ]]; - [mediaReadingProgressText bind:@"value" toObject:mediaPlayer withKeyPath:@"time.stringValue" options: nil]; - [mediaDescriptionText bind:@"value" toObject:mediaPlayer withKeyPath:@"description" options: nil]; - [self bind:@"representedFilename" toObject:mediaPlayer withKeyPath:@"media.url" options: [NSDictionary dictionaryWithObject:@"URLToRepresentedFileNameTransformer" forKey:NSValueTransformerNameBindingOption]]; - [self bind:@"title" toObject:mediaPlayer withKeyPath:@"description" options: nil]; - - [navigatorViewToggleButton bind:@"value" toObject:self withKeyPath:@"navigatorViewVisible" options: nil]; -#endif - - /* Playlist buttons */ -#if 0 - [removePlaylistButton bind:@"enabled" toObject:categoriesTreeController withKeyPath:@"selection.editableInCategoriesList" options: nil]; -#endif - [removePlaylistButton setTarget:categoriesTreeController]; - [removePlaylistButton setAction:@selector(remove:)]; - [addPlaylistButton setTarget:controller]; - [addPlaylistButton setAction:@selector(addPlaylist:)]; - - /* mediaPlayer */ -#if 0 - [mediaPlayerPlayPauseStopButton bind:@"enabled" toObject:mediaPlayer withKeyPath:@"media" options: [NSDictionary dictionaryWithObject:@"NonNilAsBoolTransformer" forKey:NSValueTransformerNameBindingOption]]; - [mediaPlayerPlayPauseStopButton bind:@"state" toObject:mediaPlayer withKeyPath:@"playing" options: nil]; - [mediaPlayerPlayPauseStopButton bind:@"alternateImage" toObject:mediaPlayer withKeyPath:@"stateAsButtonAlternateImage" options: nil]; - [mediaPlayerPlayPauseStopButton bind:@"image" toObject:mediaPlayer withKeyPath:@"stateAsButtonImage" options: nil]; - [mediaPlayerBackwardPrevButton bind:@"enabled" toObject:mediaPlayer withKeyPath:@"playing" options: nil]; - [mediaPlayerForwardNextButton bind:@"enabled" toObject:mediaPlayer withKeyPath:@"playing" options: nil]; -#endif - - [mediaPlayerForwardNextButton setTarget:mediaPlayer]; - [mediaPlayerForwardNextButton setAction:@selector(fastForward)]; - [mediaPlayerBackwardPrevButton setTarget:mediaPlayer]; - [mediaPlayerBackwardPrevButton setAction:@selector(rewind)]; - [mediaPlayerPlayPauseStopButton setTarget:mediaPlayer]; - [mediaPlayerPlayPauseStopButton setAction:@selector(pause)]; - - /* Last minute setup */ - [categoriesListView expandItem:nil expandChildren:YES]; - [categoriesListView selectRowIndexes:[NSIndexSet indexSetWithIndex:[categoriesListView numberOfRows] > 0 ? [categoriesListView numberOfRows]-1 : 0] byExtendingSelection:NO]; - [self setNavigatorViewVisible:NO animate:NO]; - [self showWindow:self]; - [mainSplitView setDelegate:self]; -} - -- (BOOL)navigatorViewVisible -{ - return [mainSplitView sliderPosition] <= [mainSplitView bounds].size.width - [mainSplitView dividerThickness] - 30.f /* To be tolerant */; -} - -- (void)setNavigatorViewVisible:(BOOL)wantsVisible animate:(BOOL)animate -{ - if( [self navigatorViewVisible] == wantsVisible ) - return; - - if( !animate ) [self willChangeValueForKey:@"navigatorViewVisible"]; - - VLCOneSplitView * splitView = animate ? [mainSplitView animator] : mainSplitView; - - if( wantsVisible ) - { - if( navigatorViewWidth >= [mainSplitView bounds].size.width - 200.f ) - navigatorViewWidth = [mainSplitView bounds].size.width - 200.f; - [splitView setSliderPosition:navigatorViewWidth]; - } - else - { - navigatorViewWidth = [videoView frame].size.width; - [splitView setSliderPosition:[mainSplitView bounds].size.width - [mainSplitView dividerThickness]]; - } - if( !animate ) [self didChangeValueForKey:@"navigatorViewVisible"]; -} - -- (void)setNavigatorViewVisible:(BOOL)wantsVisible -{ - [self setNavigatorViewVisible:wantsVisible animate:YES]; -} - -- (IBAction)mediaListViewItemDoubleClicked:(id)sender -{ - if([[mediaArrayController selectedObjects] count] <= 0 ) - return; - [mediaPlayer setMedia:[[mediaArrayController selectedObjects] objectAtIndex:0]]; - [mediaPlayer play]; -} - -- (void)videoViewItemClicked:(id)sender -{ - id object = [sender selectedObject]; - NSAssert( [object isKindOfClass:[VLCMedia class]], @"Object is not a VLCMedia" ); - - [mediaPlayer setMedia:object]; - [mediaPlayer play]; -} - -@end - -/****************************************************************************** - * @implementation VLCMainWindowController (NSToolbarDelegating) - */ - -@implementation VLCMainWindowController (NSToolbarDelegating) -/* Our item identifiers */ -static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl"; -static NSString * VLCToolbarMediaAudioVolume = @"VLCToolbarMediaAudioVolume"; -static NSString * VLCToolbarMediaDescription = @"VLCToolbarMediaDescription"; - -- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar -{ - return [NSArray arrayWithObjects: - NSToolbarCustomizeToolbarItemIdentifier, - NSToolbarFlexibleSpaceItemIdentifier, - NSToolbarSpaceItemIdentifier, - NSToolbarSeparatorItemIdentifier, - VLCToolbarMediaControl, - VLCToolbarMediaAudioVolume, - VLCToolbarMediaDescription, - nil ]; -} - -- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar -{ - return [NSArray arrayWithObjects: - VLCToolbarMediaControl, - VLCToolbarMediaAudioVolume, - VLCToolbarMediaDescription, - nil ]; -} - -- (NSToolbarItem *) toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag -{ - NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier] autorelease]; - - if( [itemIdentifier isEqual: VLCToolbarMediaControl] ) - { - [toolbarItem setLabel:@"Media Controls"]; - [toolbarItem setPaletteLabel:@"Media Controls"]; - - [toolbarItem setView:toolbarMediaControl]; - [toolbarItem setMinSize:[[toolbarItem view] frame].size]; - [toolbarItem setMaxSize:[[toolbarItem view] frame].size]; - - /* TODO: setup a menu */ - } - else if( [itemIdentifier isEqual: VLCToolbarMediaAudioVolume] ) - { - [toolbarItem setLabel:@"Audio Volume"]; - [toolbarItem setPaletteLabel:@"Audio Volume"]; - - [toolbarItem setView:toolbarMediaAudioVolume]; - [toolbarItem setMinSize:[[toolbarItem view] frame].size]; - [toolbarItem setMaxSize:[[toolbarItem view] frame].size]; - - /* TODO: setup a menu */ - } - else if( [itemIdentifier isEqual: VLCToolbarMediaDescription] ) - { - [toolbarItem setLabel:@"Media Description"]; - [toolbarItem setPaletteLabel:@"Media Description"]; - - [toolbarItem setView:toolbarMediaDescription]; - [toolbarItem setMinSize:[[toolbarItem view] frame].size]; - [toolbarItem setMaxSize:NSMakeSize(10000 /* Can be really big */, NSHeight([[toolbarItem view] frame]))]; - - /* TODO: setup a menu */ - } - else - { - /* itemIdentifier referred to a toolbar item that is not - * provided or supported by us or Cocoa - * Returning nil will inform the toolbar - * that this kind of item is not supported */ - toolbarItem = nil; - } - return toolbarItem; -} -@end - -/****************************************************************************** - * VLCMainWindowController (CategoriesListDelegate) - */ -@implementation VLCMainWindowController (CategoriesListDelegate) -- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item -{ - return [[item representedObject] isKindOfClass:[NSDictionary class]]; -} -- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item -{ - return !([[item representedObject] isKindOfClass:[NSDictionary class]]); -} -- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item -{ - [cell setRepresentedObject:[item representedObject]]; -} -@end - -/****************************************************************************** - * VLCMainWindowController (CategoriesListDataSource) - */ -@implementation VLCMainWindowController (CategoriesListDataSource) -/* Drag and drop */ -- (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id < NSDraggingInfo >)info item:(id)item childIndex:(NSInteger)index -{ - int i; - - if(![item respondsToSelector:@selector(representedObject)]) - return NO; - - NSArray *droppedItems = [[info draggingPasteboard] propertyListForType:@"VLCMediaURLType"]; - if( !droppedItems ) - droppedItems = [[info draggingPasteboard] propertyListForType:NSFilenamesPboardType]; - if( !droppedItems ) - droppedItems = [[info draggingPasteboard] propertyListForType:NSURLPboardType]; - - NSAssert( droppedItems, @"Dropped an unsupported object type on the outline View" ); - - VLCMediaList * mediaList = [(VLCMedia *)[item representedObject] subitems]; - - for (i = 0; i < [droppedItems count]; i++) - { - NSString * filename = [droppedItems objectAtIndex:i]; - VLCMedia *media = [VLCMedia mediaWithPath:filename]; - [mediaList lock]; - [mediaList insertMedia:media atIndex:index+1]; - [mediaList unlock]; - } - return YES; -} - -- (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id < NSDraggingInfo >)info proposedItem:(id)item proposedChildIndex:(NSInteger)index -{ - NSArray *droppedItems = [[info draggingPasteboard] propertyListForType:@"VLCMediaURLType"]; - if( !droppedItems ) - droppedItems = [[info draggingPasteboard] propertyListForType:NSFilenamesPboardType]; - if( !droppedItems ) - droppedItems = [[info draggingPasteboard] propertyListForType:NSURLPboardType]; - - if(! droppedItems || - ![item respondsToSelector:@selector(representedObject)] || - ![[item representedObject] isKindOfClass:[VLCMedia class]] ) - { - return NSDragOperationNone; - } - - return NSDragOperationMove; -} -@end - -/****************************************************************************** - * VLCMainWindowController (SplitViewDelegate) - */ -@implementation VLCMainWindowController (SplitViewDelegate) - -- (void)splitViewWillResizeSubviews:(NSNotification *)aNotification -{ - [self willChangeValueForKey:@"navigatorViewVisible"]; -} -- (void)splitViewDidResizeSubviews:(NSNotification *)aNotification -{ - [self didChangeValueForKey:@"navigatorViewVisible"]; -} - -@end diff --git a/projects/macosx/vlc_app/Sources/VLCMediaArrayController.h b/projects/macosx/vlc_app/Sources/VLCMediaArrayController.h deleted file mode 100644 index 28cbe8f9c4..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCMediaArrayController.h +++ /dev/null @@ -1,39 +0,0 @@ -/***************************************************************************** - * VLCMediaArrayController.h: NSArrayController subclass specific to media - * list. - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import -#import - -@interface VLCMediaArrayController : NSArrayController -{ - VLCMediaList * contentMediaList; -} - -/* Usually set through a bindings. Contents is provided by the - * super class contentArray bindings. This is useful to - * get the media list ability to be read-write. */ -@property (retain) VLCMediaList * contentMediaList; - -@end diff --git a/projects/macosx/vlc_app/Sources/VLCMediaArrayController.m b/projects/macosx/vlc_app/Sources/VLCMediaArrayController.m deleted file mode 100644 index 34f8a3e2e0..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCMediaArrayController.m +++ /dev/null @@ -1,91 +0,0 @@ -/***************************************************************************** - * VLCMediaArrayController.m: NSArrayController subclass specific to media - * list. - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import "VLCMediaArrayController.h" - - -@implementation VLCMediaArrayController -@synthesize contentMediaList; -@end - -/****************************************************************************** - * VLCMediaArrayController (NSTableViewDataSource) - */ -@implementation VLCMediaArrayController (NSTableViewDataSource) - -/* Dummy implementation, because that seems to be needed */ -- (int)numberOfRowsInTableView:(NSTableView *)tableView -{ - return 0; -} - -- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn - row:(int)row -{ - return nil; -} - -/* Implement drag and drop */ -- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id )info - proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)op -{ - return [contentMediaList isReadOnly] || op == NSTableViewDropOn ? NSDragOperationNone : NSDragOperationGeneric; -} - -- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id )info - row:(int)row dropOperation:(NSTableViewDropOperation)operation -{ - int i; - row = 0; - NSArray *droppedItems = [[info draggingPasteboard] propertyListForType:NSFilenamesPboardType]; - if( !droppedItems ) - droppedItems = [[info draggingPasteboard] propertyListForType:NSURLPboardType]; - - NSAssert( contentMediaList, @"No contentMediaList" ); - - for (i = 0; i < [droppedItems count]; i++) - { - NSString * filename = [droppedItems objectAtIndex:i]; - VLCMedia *media = [VLCMedia mediaWithPath:filename]; - [contentMediaList lock]; - [contentMediaList insertMedia:media atIndex:row]; - [contentMediaList unlock]; - } - return YES; -} - -- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard -{ - NSMutableArray *array = [NSMutableArray arrayWithCapacity:[rowIndexes count]]; - int i = [rowIndexes firstIndex]; - do { - [array addObject:[[contentMediaList mediaAtIndex:i] url]]; - } while ((i = [rowIndexes indexGreaterThanIndex:i]) != NSNotFound); - - [pboard declareTypes:[NSArray arrayWithObject:@"VLCMediaURLType"] owner:self]; - [pboard setPropertyList:array forType:@"VLCMediaURLType"]; - return YES; -} -@end diff --git a/projects/macosx/vlc_app/Sources/VLCMediaLayer.h b/projects/macosx/vlc_app/Sources/VLCMediaLayer.h deleted file mode 100644 index 21812de793..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCMediaLayer.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// VLCMediaLayer.h -// VLC -// -// Created by Pierre d'Herbemont on 1/14/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - -#import -#import -#import - - -@interface VLCMediaLayer : CALayer { - BOOL displayFullInformation; - VLCMedia * media; - CATextLayer * titleLayer; - CATextLayer * artistLayer; - CATextLayer * genreLayer; - CALayer * artworkLayer; -} - -+ (id)layerWithMedia:(VLCMedia *)media; - -@property (assign) BOOL displayFullInformation; -@property (retain,readonly) VLCMedia * media; -@property (retain,readonly) CATextLayer * titleLayer; -@property (retain,readonly) CATextLayer * artistLayer; -@property (retain,readonly) CATextLayer * genreLayer; -@property (retain,readonly) CALayer * artworkLayer; - -@end diff --git a/projects/macosx/vlc_app/Sources/VLCMediaLayer.m b/projects/macosx/vlc_app/Sources/VLCMediaLayer.m deleted file mode 100644 index 4ce5ce0de5..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCMediaLayer.m +++ /dev/null @@ -1,217 +0,0 @@ -// -// VLCMediaLayer.m -// VLC -// -// Created by Pierre d'Herbemont on 1/14/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - -#import "VLCMediaLayer.h" - -/***************************************************************************** - * Some configuration first. Defines the size of the artwork layer. - */ -static CGSize kArtworkSize = { 256., 256. }; - -/***************************************************************************** - * @interface VLCMediaLayer (Private) - */ - -@interface VLCMediaLayer (Private) -- (void)updateSublayers; -@end - -/***************************************************************************** - * @interface VLCMediaLayer () - */ -@interface VLCMediaLayer () -@property (retain,readwrite) VLCMedia * media; -@property (retain,readwrite) CATextLayer * titleLayer; -@property (retain,readwrite) CATextLayer * artistLayer; -@property (retain,readwrite) CATextLayer * genreLayer; -@property (retain,readwrite) CALayer * artworkLayer; -@end - -/***************************************************************************** - * @implementation VLCMediaLayer - */ -@implementation VLCMediaLayer -@synthesize displayFullInformation; -@synthesize media; -@synthesize titleLayer; -@synthesize genreLayer; -@synthesize artistLayer; -@synthesize artworkLayer; - -+ (id)layer -{ - return [self layerWithMedia:[VLCMedia mediaAsNodeWithName:@"Empty Media"]]; -} -+ (id)layerWithMedia:(VLCMedia *)aMedia -{ - VLCMediaLayer * me = [super layer]; - - if(!me) return nil; - - me.media = aMedia; - me.displayFullInformation = YES; - - /* Set the default layout */ - me.titleLayer = [CATextLayer layer]; - me.artistLayer = [CATextLayer layer]; - me.genreLayer = [CATextLayer layer]; - CALayer * textLayer = [CALayer layer]; - NSDictionary * textStyle = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInteger:12], @"cornerRadius", - [NSValue valueWithSize:NSMakeSize(5, 0)], @"margin", - @"Lucida-Bold", @"font", - CGColorCreateGenericGray(0.5, 1.),@"foregroundColor", - [NSNumber numberWithInteger:18], @"fontSize", - [NSNumber numberWithFloat: .8], @"shadowOpacity", - [NSNumber numberWithFloat: 1.], @"shadowRadius", - kCAAlignmentLeft, @"alignmentMode", - nil]; - NSDictionary * textTitleStyle = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInteger:12], @"cornerRadius", - [NSValue valueWithSize:NSMakeSize(5, 0)], @"margin", - @"Lucida", @"font", - [NSNumber numberWithInteger:26], @"fontSize", - [NSNumber numberWithFloat: .7], @"shadowOpacity", - [NSNumber numberWithFloat: 3.], @"shadowRadius", - kCAAlignmentLeft, @"alignmentMode", - nil]; - /* First off, text */ - me.titleLayer.style = textTitleStyle; - me.titleLayer.string = @"Title"; - me.titleLayer.name = @"title"; - [me.titleLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"superlayer" attribute:kCAConstraintMinX offset:0.]]; - [me.titleLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxX relativeTo:@"superlayer" attribute:kCAConstraintMaxX offset:0.]]; - [me.titleLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinY relativeTo:@"artist" attribute:kCAConstraintMaxY offset:10.]]; - me.artistLayer.style = textStyle; - me.artistLayer.string = @"Artist"; - me.artistLayer.name = @"artist"; - [me.artistLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"title" attribute:kCAConstraintMinX]]; - [me.artistLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxX relativeTo:@"title" attribute:kCAConstraintMaxX]]; - [me.artistLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY relativeTo:@"superlayer" attribute:kCAConstraintMidY]]; - me.genreLayer.style = textStyle; - me.genreLayer.string = @"Genre"; - me.genreLayer.name = @"genre"; - [me.genreLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"title" attribute:kCAConstraintMinX]]; - [me.genreLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxX relativeTo:@"title" attribute:kCAConstraintMaxX]]; - [me.genreLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY relativeTo:@"artist" attribute:kCAConstraintMinY offset:-10.]]; - - - [textLayer addSublayer:me.titleLayer]; - [textLayer addSublayer:me.artistLayer]; - [textLayer addSublayer:me.genreLayer]; - textLayer.contentsGravity = kCAGravityCenter; - textLayer.layoutManager = [CAConstraintLayoutManager layoutManager]; - - /* Empty layer for picture */ - me.artworkLayer = [CALayer layer]; - me.artworkLayer.backgroundColor = CGColorCreateGenericGray(0.5, 0.4); - me.artworkLayer.borderColor = CGColorCreateGenericRGB(1., 1., 1., .8); - me.artworkLayer.borderWidth = 3.0; - - // me.artworkLayer.frame = CGRectMake(0.,0., kArtworkSize.width, kArtworkSize.height); - textLayer.frame = CGRectMake(0.,0., kArtworkSize.width, kArtworkSize.height); - - /* Position the text and the artwork layer */ - CALayer * container = [CALayer layer]; - me.artworkLayer.name = @"artworkLayer"; - textLayer.name = @"textLayer"; - container.name = @"artContainer"; - container.layoutManager = [CAConstraintLayoutManager layoutManager]; - - [container addSublayer:me.artworkLayer]; - [container addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"superlayer" attribute:kCAConstraintMinX offset:60.]]; - [container addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY relativeTo:@"superlayer" attribute:kCAConstraintMidY]]; - [container addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintHeight relativeTo:@"superlayer" attribute:kCAConstraintHeight scale:.6 offset:0.]]; - [container addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxX relativeTo:@"superlayer" attribute:kCAConstraintMidX]]; - - [me.artworkLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"superlayer" attribute:kCAConstraintMinX]]; - [me.artworkLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinY relativeTo:@"superlayer" attribute:kCAConstraintMinY]]; - [me.artworkLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY relativeTo:@"superlayer" attribute:kCAConstraintMaxY]]; - [me.artworkLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxX relativeTo:@"superlayer" attribute:kCAConstraintMaxX]]; - - [textLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"artContainer" attribute:kCAConstraintMaxX]]; - [textLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxX relativeTo:@"superlayer" attribute:kCAConstraintMaxX ]]; - [textLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY relativeTo:@"artContainer" attribute:kCAConstraintMidY]]; - - me.artworkLayer.zPosition = -30.f; - - me.artworkLayer.shadowOpacity = .3; - me.artworkLayer.shadowRadius = 10.; - static CATransform3D rot, projection; - static BOOL transformInited = NO; - if( !transformInited ) - { - rot = CATransform3DMakeRotation(.1 - , 0., 1., 0.); - projection = CATransform3DIdentity; - projection.m34 = 1. / -80.; - transformInited = YES; - } - me.artworkLayer.transform = rot; - container.sublayerTransform = projection; - - me.layoutManager = [CAConstraintLayoutManager layoutManager]; - [me addSublayer:textLayer]; - [me addSublayer:container]; - - [me updateSublayers]; - - /* The following will trigger -observeValueForKeyPath: ofObject: change: context: */ - [me.media addObserver:me forKeyPath:@"metaDictionary.title" options:NSKeyValueObservingOptionNew context:nil]; - [me.media addObserver:me forKeyPath:@"metaDictionary.genre" options:NSKeyValueObservingOptionNew context:nil]; - [me.media addObserver:me forKeyPath:@"metaDictionary.artist" options:NSKeyValueObservingOptionNew context:nil]; - [me.media addObserver:me forKeyPath:@"metaDictionary.artwork" options:NSKeyValueObservingOptionNew context:nil]; - - return me; -} - -- (void)dealloc -{ - /* Previously registered in +layerWithMediaArrayController: +layerWithMedia:*/ - [self.media removeObserver:self forKeyPath:@"metaDictionary.title"]; - [self.media removeObserver:self forKeyPath:@"metaDictionary.genre"]; - [self.media removeObserver:self forKeyPath:@"metaDictionary.artist"]; - [self.media removeObserver:self forKeyPath:@"metaDictionary.artwork"]; - - [super dealloc]; -} -@end - -/***************************************************************************** - * @implementation VLCMediaLayer (Private) - */ -@implementation VLCMediaLayer (Private) - -- (void)updateSublayers -{ - [CATransaction begin]; - self.titleLayer.string = [self.media.metaDictionary objectForKey:@"title"]; - NSString * artist = [self.media.metaDictionary objectForKey:@"artist"]; - self.artistLayer.string = artist ? artist : @"No Artist"; - NSString * genre = [self.media.metaDictionary objectForKey:@"genre"]; - self.genreLayer.string = genre ? genre : @"No Genre"; - if( [self.media valueForKeyPath:@"metaDictionary.artwork"] ) - { - self.artworkLayer.contents = (id)[[self.media valueForKeyPath:@"metaDictionary.artwork"] CGImage]; - self.artworkLayer.contentsGravity = kCAGravityResizeAspect; - self.artworkLayer.borderWidth = 0.; - self.artworkLayer.backgroundColor = nil; - } - [CATransaction commit]; -} - -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context -{ - if( [keyPath hasPrefix:@"metaDictionary"] ) - { - [self updateSublayers]; - return; - } - [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; -} -@end diff --git a/projects/macosx/vlc_app/Sources/VLCMediaListLayer.h b/projects/macosx/vlc_app/Sources/VLCMediaListLayer.h deleted file mode 100644 index a3d01d55ed..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCMediaListLayer.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// VLCMediaListLayer.h -// VLC -// -// Created by Pierre d'Herbemont on 1/14/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - -#import -#import -#import -#import "VLCMediaLayer.h" -#import "VLCMediaArrayController.h" - - -@interface VLCMediaListLayer : CALayer { - NSArray * content; - NSUInteger selectedIndex; - - VLCMediaLayer * previousLayer; - VLCMediaLayer * selectedLayer; - VLCMediaLayer * nextLayer; - - VLCMediaArrayController * controller; -} - -+ (id)layer; -+ (id)layerWithMediaArrayController:(VLCMediaArrayController *)aController; - -@property (retain,readwrite) NSArray * content; -@property (readwrite) NSUInteger selectedIndex; -@property (retain,readwrite) VLCMediaArrayController * controller; - -@end diff --git a/projects/macosx/vlc_app/Sources/VLCMediaListLayer.m b/projects/macosx/vlc_app/Sources/VLCMediaListLayer.m deleted file mode 100644 index c0506fa082..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCMediaListLayer.m +++ /dev/null @@ -1,347 +0,0 @@ -// -// VLCMediaListLayer.m -// VLC -// -// Created by Pierre d'Herbemont on 1/14/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - -#import "VLCMediaListLayer.h" - -/***************************************************************************** - * @implementation VLCMediaListLayer - */ - -@interface VLCMediaListLayer (Private) -- (VLCMediaLayer *)selectedLayer; -- (VLCMediaLayer *)previousLayer; -- (VLCMediaLayer *)nextLayer; -- (void)changeSelectedLayerToNextIndex; -- (void)changeSelectedLayerToPreviousIndex; -- (void)resetLayers; - - -- (void)setSelectedLayer:(VLCMediaLayer *)layer; -- (void)setPreviousLayer:(VLCMediaLayer *)layer; -- (void)setNextLayer:(VLCMediaLayer *)layer; -@end - -/***************************************************************************** - * @implementation VLCMediaListLayer - */ - -@implementation VLCMediaListLayer -@synthesize selectedIndex; -@synthesize content; -@synthesize controller; - -+ (id)layer -{ - VLCMediaListLayer * me = [super layer]; - - me.layoutManager = [CAConstraintLayoutManager layoutManager]; - - [CATransaction commit]; - - me->selectedIndex = NSNotFound; - return me; -} - -+ (id)layerWithMediaArrayController:(VLCMediaArrayController *)aController -{ - VLCMediaListLayer * me = [VLCMediaListLayer layer]; - me.controller = aController; - - /* The following will trigger -observeValueForKeyPath: ofObject: change: context: */ - [me.controller addObserver:me forKeyPath:@"arrangedObjects" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; - [me.controller addObserver:me forKeyPath:@"selectionIndex" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; - [me.controller addObserver:me forKeyPath:@"contentMediaList" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; - - return me; -} - -- (void)dealloc -{ - /* Previously registered in +layerWithMediaArrayController: */ - [self.controller removeObserver:self forKeyPath:@"arrangedObjects"]; - [self.controller removeObserver:self forKeyPath:@"contentMediaList"]; - [self.controller removeObserver:self forKeyPath:@"selectionIndex"]; - [super dealloc]; -} -@end - -/***************************************************************************** - * @implementation VLCMediaListLayer (Private) - */ - -@implementation VLCMediaListLayer (Private) -+ (NSSet *)keyPathsForValuesAffectingSelectedLayer -{ - return [NSSet setWithObjects:@"selectedLayer", @"content", nil]; -} - -- (VLCMediaLayer *)selectedLayer -{ - VLCMedia * media = (self.selectedIndex != NSNotFound) ? [self.content objectAtIndex:self.selectedIndex ] : nil; - if( !media ) - { - CATextLayer * layer = [CATextLayer layer]; - CALayer * container = [CALayer layer]; - container.layoutManager = [CAConstraintLayoutManager layoutManager]; - if([self.controller.contentMediaList isReadOnly]) - layer.string = @"Empty"; - else if ([self.content count]) - layer.string = @"Empty search."; - else - layer.string = @"Drag and Drop a movie or a music here."; - layer.alignmentMode = kCAAlignmentCenter; - layer.wrapped = YES; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY relativeTo:@"superlayer" attribute:kCAConstraintMidY]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX relativeTo:@"superlayer" attribute:kCAConstraintMidX]]; - [layer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintWidth relativeTo:@"superlayer" attribute:kCAConstraintWidth]]; - [container addSublayer:layer]; - return (VLCMediaLayer *)container; - } - - if( [selectedLayer isKindOfClass:[VLCMediaLayer class]] && [media compare:[selectedLayer media]] == NSOrderedSame ) - return [[selectedLayer retain] autorelease]; - - return [VLCMediaLayer layerWithMedia:[self.content objectAtIndex:self.selectedIndex]]; -} - -- (VLCMediaLayer *)previousLayer -{ - if( self.selectedIndex == NSNotFound ) - return nil; - VLCMedia * media = self.selectedIndex > 0 ? [self.content objectAtIndex:self.selectedIndex - 1] : nil; - if( !media ) - return nil; - - if( [previousLayer isKindOfClass:[VLCMediaLayer class]] && [media compare:[previousLayer media]] == NSOrderedSame ) - return [[previousLayer retain] autorelease]; - - return [VLCMediaLayer layerWithMedia: media ]; -} - -- (VLCMediaLayer *)nextLayer -{ - if( self.selectedIndex == NSNotFound ) - return nil; - VLCMedia * media = self.selectedIndex + 1 < [content count] ? [self.content objectAtIndex:self.selectedIndex + 1] : nil; - if( !media ) - return nil; - - if( [nextLayer isKindOfClass:[VLCMediaLayer class]] && [media compare:[nextLayer media]] == NSOrderedSame ) - return [[nextLayer retain] autorelease]; - - return [VLCMediaLayer layerWithMedia: media ]; -} - -- (void)changeSelectedLayerToNextIndex -{ - if(!nextLayer) - { - /* Can't do anything */ - return; - } - selectedIndex++; - - /* Remove offscreen layer. Without actions */ - if( previousLayer ) - { - [CATransaction begin]; - [CATransaction setValue:[NSNumber numberWithBool:YES] forKey:kCATransactionDisableActions]; - [previousLayer removeFromSuperlayer]; - [CATransaction commit]; - } - - [CATransaction begin]; - if ( [[NSApp currentEvent] modifierFlags] & NSShiftKeyMask ) - [CATransaction setValue:[NSNumber numberWithFloat:1.5] forKey:kCATransactionAnimationDuration]; - - [self setPreviousLayer: selectedLayer]; - [self setSelectedLayer: nextLayer]; - [self setNextLayer: [self nextLayer]]; - [CATransaction commit]; - - /* Move the new nextLayer layer on screen. Without Actions */ - [CATransaction begin]; - [CATransaction setValue:[NSNumber numberWithBool:YES] forKey:kCATransactionDisableActions]; - [self addSublayer: nextLayer]; - [CATransaction commit]; -} - -- (void)changeSelectedLayerToPreviousIndex -{ - if(!previousLayer) - { - /* Can't do anything */ - return; - } - selectedIndex--; - - /* Remove offscreen layer. Without actions */ - if( nextLayer ) - { - [CATransaction begin]; - [CATransaction setValue:[NSNumber numberWithBool:YES] forKey:kCATransactionDisableActions]; - [nextLayer removeFromSuperlayer]; - [CATransaction commit]; - } - - [CATransaction begin]; - if ( [[NSApp currentEvent] modifierFlags] & NSShiftKeyMask ) - [CATransaction setValue:[NSNumber numberWithFloat:1.5] forKey:kCATransactionAnimationDuration]; - - [self setNextLayer: selectedLayer]; - [self setSelectedLayer: previousLayer]; - [self setPreviousLayer: [self previousLayer]]; - [CATransaction commit]; - - /* Move the new previous layer on screen. Without Actions */ - [CATransaction begin]; - [CATransaction setValue:[NSNumber numberWithBool:YES] forKey:kCATransactionDisableActions]; - [self addSublayer:previousLayer]; - [CATransaction commit]; -} - -- (void)gotoIndex:(NSUInteger)index; -{ - if( selectedIndex == index ) - return; - - if( selectedIndex > index ) - { - /* It is ok to scroll five layers */ - if( selectedIndex - index < 5 ) - { - while( index < selectedIndex ) - [self changeSelectedLayerToPreviousIndex]; - return; - } - [self changeSelectedLayerToPreviousIndex]; - [self changeSelectedLayerToPreviousIndex]; - selectedIndex = index; - [self resetLayers]; - } - else - { - if( index - selectedIndex < 5 ) - { - while( index > selectedIndex ) - [self changeSelectedLayerToNextIndex]; - return; - } - [self changeSelectedLayerToNextIndex]; - [self changeSelectedLayerToNextIndex]; - selectedIndex = index; - [self resetLayers]; - } -} - -- (void)resetLayers -{ - VLCMediaLayer * layer; - [CATransaction begin]; - layer = [self previousLayer]; - if( previousLayer != layer ) - { - if( previousLayer ) [self replaceSublayer:previousLayer with:layer]; - else [self addSublayer:layer]; - [self setPreviousLayer:layer]; - } - layer = [self selectedLayer]; - if( selectedLayer != layer ) - { - if( selectedLayer ) [self replaceSublayer:selectedLayer with:layer]; - else [self addSublayer:layer]; - [self setSelectedLayer:layer]; - } - layer = [self nextLayer]; - if( nextLayer != layer ) - { - if( nextLayer ) [self replaceSublayer:nextLayer with:layer]; - else [self addSublayer:layer]; - [self setNextLayer:layer]; - } - [CATransaction commit]; -} - - -- (void)setSelectedLayer:(VLCMediaLayer *)layer -{ - [selectedLayer autorelease]; - if( !layer ) - { - selectedLayer = nil; - return; - } - selectedLayer = [layer retain]; - selectedLayer.frame = [self bounds]; - [selectedLayer setAutoresizingMask:kCALayerWidthSizable|kCALayerHeightSizable]; -} - -- (void)setPreviousLayer:(VLCMediaLayer *)layer -{ - [previousLayer autorelease]; - if( !layer ) - { - previousLayer = nil; - return; - } - previousLayer = [layer retain]; - CGRect frame = [self bounds]; - frame.origin.x -= frame.size.width; - previousLayer.frame = frame; - [previousLayer setAutoresizingMask:kCALayerMaxXMargin|kCALayerHeightSizable]; -} - -- (void)setNextLayer:(VLCMediaLayer *)layer -{ - [nextLayer autorelease]; - if( !layer ) - { - nextLayer = nil; - return; - } - nextLayer = [layer retain]; - CGRect frame = [self bounds]; - frame.origin.x += frame.size.width; - nextLayer.frame = frame; - [nextLayer setAutoresizingMask:kCALayerMinXMargin|kCALayerHeightSizable]; -} - -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context -{ - if([keyPath isEqualToString:@"selectionIndex"]) - { - if ( selectedIndex == NSNotFound || [object selectionIndex] == NSNotFound ) - { - selectedIndex = [object selectionIndex]; - if(selectedIndex == NSNotFound && [content count]) - { - selectedIndex = 0; - } - [self resetLayers]; - return; - } - - [self gotoIndex: [object selectionIndex]]; - return; - } - if([keyPath isEqualToString:@"arrangedObjects"] || [keyPath isEqualToString:@"contentMediaList"]) - { - selectedIndex = [object selectionIndex]; - if(selectedIndex == NSNotFound && [[object arrangedObjects] count]) - { - selectedIndex = 0; - } - [content release]; - content = [[object arrangedObjects] retain]; - [self resetLayers]; - return; - } - [self observeValueForKeyPath:keyPath ofObject:object change:change context:context]; -} - -@end diff --git a/projects/macosx/vlc_app/Sources/VLCValueTransformer.h b/projects/macosx/vlc_app/Sources/VLCValueTransformer.h deleted file mode 100644 index d30bcd063a..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCValueTransformer.h +++ /dev/null @@ -1,42 +0,0 @@ -/***************************************************************************** - * VLCValueTransformer.m: NSValueTransformer subclasses - ***************************************************************************** - * Copyright (C) 2007 Pierre d'Herbemont - * Copyright (C) 2007 the VideoLAN team - * $Id$ - * - * Authors: Pierre d'Herbemont - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#import - -@interface VLCFloat10000FoldTransformer : NSValueTransformer { -} -@end - -@interface VLCNonNilAsBoolTransformer : NSValueTransformer { -} -@end - -@interface VLCURLToRepresentedFileNameTransformer : NSValueTransformer { -} -@end - -@interface VLCSelectionIndexToDescriptionTransformer : NSValueTransformer { -} -@end - diff --git a/projects/macosx/vlc_app/Sources/VLCValueTransformer.m b/projects/macosx/vlc_app/Sources/VLCValueTransformer.m deleted file mode 100644 index 41133aa35e..0000000000 --- a/projects/macosx/vlc_app/Sources/VLCValueTransformer.m +++ /dev/null @@ -1,117 +0,0 @@ -// -// VLCValueTransformer.m -// VLC -// -// Created by Pierre d'Herbemont on 12/29/07. -// Copyright 2007 __MyCompanyName__. All rights reserved. -// - -#import "VLCValueTransformer.h" - - -@implementation VLCFloat10000FoldTransformer - -+ (Class)transformedValueClass -{ - return [NSNumber class]; -} - -+ (BOOL)allowsReverseTransformation -{ - return YES; -} - -- (id)transformedValue:(id)value -{ - if( !value ) return nil; - - if(![value respondsToSelector: @selector(floatValue)]) - { - [NSException raise: NSInternalInconsistencyException - format: @"Value (%@) does not respond to -floatValue.", - [value class]]; - return nil; - } - - return [NSNumber numberWithFloat: [value floatValue]*10000.]; -} - -- (id)reverseTransformedValue:(id)value -{ - if( !value ) return nil; - - if(![value respondsToSelector: @selector(floatValue)]) - { - [NSException raise: NSInternalInconsistencyException - format: @"Value (%@) does not respond to -floatValue.", - [value class]]; - return nil; - } - - return [NSNumber numberWithFloat: [value floatValue]/10000.]; -} -@end - -@implementation VLCNonNilAsBoolTransformer - -+ (Class)transformedValueClass -{ - return [NSObject class]; -} - -+ (BOOL)allowsReverseTransformation -{ - return NO; -} - -- (NSNumber *)transformedValue:(id)value -{ - return [NSNumber numberWithBool: !!value]; -} - -@end - -@implementation VLCURLToRepresentedFileNameTransformer - -+ (Class)transformedValueClass -{ - return [NSURL class]; -} - -+ (BOOL)allowsReverseTransformation -{ - return NO; -} - -- (NSString *)transformedValue:(id)value -{ - if( ![value isKindOfClass:[NSURL class]] || ![value isFileURL] ) - return @""; - - return [value path]; -} - -@end - -@implementation VLCSelectionIndexToDescriptionTransformer - -+ (Class)transformedValueClass -{ - return [NSNumber class]; -} - -+ (BOOL)allowsReverseTransformation -{ - return NO; -} - -- (NSString *)transformedValue:(id)value -{ - if( ![value isKindOfClass:[NSNumber class]]) - return @""; - - return [value intValue] == NSNotFound ? @"" : [NSString stringWithFormat:@"%@ of ", value]; -} - -@end - diff --git a/projects/macosx/vlc_app/VLC.xcodeproj/project.pbxproj b/projects/macosx/vlc_app/VLC.xcodeproj/project.pbxproj deleted file mode 100644 index 3415cf12d6..0000000000 --- a/projects/macosx/vlc_app/VLC.xcodeproj/project.pbxproj +++ /dev/null @@ -1,825 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 44; - objects = { - -/* Begin PBXAggregateTarget section */ - 633BD70D0D2AE0DF0012A314 /* vlc-contrib-core-framework-app */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 633BD7150D2AE1170012A314 /* Build configuration list for PBXAggregateTarget "vlc-contrib-core-framework-app" */; - buildPhases = ( - ); - dependencies = ( - 63E930B80D5F43FA006B31CD /* PBXTargetDependency */, - 63E930B60D5F43E9006B31CD /* PBXTargetDependency */, - ); - name = "vlc-contrib-core-framework-app"; - productName = "vlc-contrib-core-framework-app"; - }; - 637F33DF0D2AEE05001E70AB /* vlc-framework-app */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 637F33F80D2AEE67001E70AB /* Build configuration list for PBXAggregateTarget "vlc-framework-app" */; - buildPhases = ( - ); - dependencies = ( - 63E930BA0D5F4404006B31CD /* PBXTargetDependency */, - 632F3C280D316FB5003BBC56 /* PBXTargetDependency */, - ); - name = "vlc-framework-app"; - productName = "vlc-framework-app"; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 632F3E260D326FF0003BBC56 /* pause.png in Resources */ = {isa = PBXBuildFile; fileRef = 632F3E250D326FF0003BBC56 /* pause.png */; }; - 633BD4BC0D2A90470012A314 /* VLCValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 633BD4AA0D2A90470012A314 /* VLCValueTransformer.m */; }; - 633BD4BD0D2A90470012A314 /* VLCMediaArrayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 633BD4AC0D2A90470012A314 /* VLCMediaArrayController.m */; }; - 633BD4BE0D2A90470012A314 /* VLCMainWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 633BD4AD0D2A90470012A314 /* VLCMainWindow.m */; }; - 633BD4BF0D2A90470012A314 /* VLCExceptionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 633BD4AF0D2A90470012A314 /* VLCExceptionHandler.m */; }; - 633BD4C00D2A90470012A314 /* VLCController.m in Sources */ = {isa = PBXBuildFile; fileRef = 633BD4B10D2A90470012A314 /* VLCController.m */; }; - 633BD4C10D2A90470012A314 /* VLCBrowsableVideoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 633BD4B30D2A90470012A314 /* VLCBrowsableVideoView.m */; }; - 633BD4C20D2A90470012A314 /* VLCAppBindings.m in Sources */ = {isa = PBXBuildFile; fileRef = 633BD4B50D2A90470012A314 /* VLCAppBindings.m */; }; - 633BD4C30D2A90470012A314 /* VLCAppAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 633BD4B90D2A90470012A314 /* VLCAppAdditions.m */; }; - 633BD4C40D2A90470012A314 /* ImageAndTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 633BD4BA0D2A90470012A314 /* ImageAndTextCell.m */; }; - 633BD4DA0D2A90C80012A314 /* dialog-error.png in Resources */ = {isa = PBXBuildFile; fileRef = 633BD4D80D2A90C80012A314 /* dialog-error.png */; }; - 633BD4DB0D2A90C80012A314 /* applications-internet.png in Resources */ = {isa = PBXBuildFile; fileRef = 633BD4D90D2A90C80012A314 /* applications-internet.png */; }; - 63541FA90D3BA1DB001F6433 /* VLCMediaLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 63541FA80D3BA1DB001F6433 /* VLCMediaLayer.m */; }; - 635422050D3BE019001F6433 /* VLCMainWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 635422040D3BE019001F6433 /* VLCMainWindowController.m */; }; - 635424930D3C1394001F6433 /* VLCMediaListLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 635424920D3C1394001F6433 /* VLCMediaListLayer.m */; }; - 63874B190D25960600F738AD /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63874B170D25960600F738AD /* MainWindow.xib */; }; - 638B823B0D35294500128F2B /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 638B823A0D35294500128F2B /* QuickTime.framework */; }; - 638F47110D216C8F008E4912 /* playlist.png in Resources */ = {isa = PBXBuildFile; fileRef = 638F47100D216C8F008E4912 /* playlist.png */; }; - 63A742B30D2759C1002D41A0 /* ExceptionHandling.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63A742B20D2759C1002D41A0 /* ExceptionHandling.framework */; }; - 63E380AA0D1C65A600FD6958 /* volume_high.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380A80D1C65A600FD6958 /* volume_high.png */; }; - 63E380AB0D1C65A600FD6958 /* volume_low.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380A90D1C65A600FD6958 /* volume_low.png */; }; - 63E380AE0D1C65D100FD6958 /* play.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380AC0D1C65D100FD6958 /* play.png */; }; - 63E380AF0D1C65D100FD6958 /* play_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380AD0D1C65D100FD6958 /* play_blue.png */; }; - 63E380B20D1C65F200FD6958 /* skip_forward_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380B00D1C65F200FD6958 /* skip_forward_active.png */; }; - 63E380B30D1C65F200FD6958 /* skip_forward_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380B10D1C65F200FD6958 /* skip_forward_blue.png */; }; - 63E380B60D1C65FC00FD6958 /* skip_previous_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380B40D1C65FC00FD6958 /* skip_previous_active.png */; }; - 63E380B70D1C65FC00FD6958 /* skip_previous_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380B50D1C65FC00FD6958 /* skip_previous_blue.png */; }; - 63E380DF0D1C6FD800FD6958 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E380DE0D1C6FD800FD6958 /* QuartzCore.framework */; }; - 63E768830D3503E200258089 /* VLCFullScreenControllerWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E768820D3503E200258089 /* VLCFullScreenControllerWindow.m */; }; - 63E768BF0D3507EF00258089 /* fs_volume_slider_knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A40D3507EF00258089 /* fs_volume_slider_knob.png */; }; - 63E768C00D3507EF00258089 /* fs_background.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A50D3507EF00258089 /* fs_background.png */; }; - 63E768C10D3507EF00258089 /* fs_exit_fullscreen_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A60D3507EF00258089 /* fs_exit_fullscreen_highlight.png */; }; - 63E768C20D3507EF00258089 /* fs_exit_fullscreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A70D3507EF00258089 /* fs_exit_fullscreen.png */; }; - 63E768C30D3507EF00258089 /* fs_forward_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A80D3507EF00258089 /* fs_forward_highlight.png */; }; - 63E768C40D3507EF00258089 /* fs_forward.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A90D3507EF00258089 /* fs_forward.png */; }; - 63E768C50D3507EF00258089 /* fs_pause_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AA0D3507EF00258089 /* fs_pause_highlight.png */; }; - 63E768C60D3507EF00258089 /* fs_pause.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AB0D3507EF00258089 /* fs_pause.png */; }; - 63E768C70D3507EF00258089 /* fs_play_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AC0D3507EF00258089 /* fs_play_highlight.png */; }; - 63E768C80D3507EF00258089 /* fs_play.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AD0D3507EF00258089 /* fs_play.png */; }; - 63E768C90D3507EF00258089 /* fs_rewind_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AE0D3507EF00258089 /* fs_rewind_highlight.png */; }; - 63E768CA0D3507EF00258089 /* fs_rewind.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AF0D3507EF00258089 /* fs_rewind.png */; }; - 63E768CB0D3507EF00258089 /* fs_skip_next_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B00D3507EF00258089 /* fs_skip_next_highlight.png */; }; - 63E768CC0D3507EF00258089 /* fs_skip_next.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B10D3507EF00258089 /* fs_skip_next.png */; }; - 63E768CD0D3507EF00258089 /* fs_skip_previous_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B20D3507EF00258089 /* fs_skip_previous_highlight.png */; }; - 63E768CE0D3507EF00258089 /* fs_skip_previous.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B30D3507EF00258089 /* fs_skip_previous.png */; }; - 63E768CF0D3507EF00258089 /* fs_stop_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B40D3507EF00258089 /* fs_stop_highlight.png */; }; - 63E768D00D3507EF00258089 /* fs_stop.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B50D3507EF00258089 /* fs_stop.png */; }; - 63E768D10D3507EF00258089 /* fs_time_slider_knob_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B60D3507EF00258089 /* fs_time_slider_knob_highlight.png */; }; - 63E768D20D3507EF00258089 /* fs_time_slider_knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B70D3507EF00258089 /* fs_time_slider_knob.png */; }; - 63E768D30D3507EF00258089 /* fs_time_slider.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B80D3507EF00258089 /* fs_time_slider.png */; }; - 63E768D40D3507EF00258089 /* fs_volume_max_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B90D3507EF00258089 /* fs_volume_max_highlight.png */; }; - 63E768D50D3507EF00258089 /* fs_volume_max.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768BA0D3507EF00258089 /* fs_volume_max.png */; }; - 63E768D60D3507EF00258089 /* fs_volume_mute_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768BB0D3507EF00258089 /* fs_volume_mute_highlight.png */; }; - 63E768D70D3507EF00258089 /* fs_volume_mute.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768BC0D3507EF00258089 /* fs_volume_mute.png */; }; - 63E768D80D3507EF00258089 /* fs_volume_slider_bar.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768BD0D3507EF00258089 /* fs_volume_slider_bar.png */; }; - 63E768D90D3507EF00258089 /* fs_volume_slider_knob_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768BE0D3507EF00258089 /* fs_volume_slider_knob_highlight.png */; }; - 63E76A530D35225700258089 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E76A520D35225700258089 /* Carbon.framework */; }; - 63E930C60D5F4463006B31CD /* VLCKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E930B20D5F430E006B31CD /* VLCKit.framework */; }; - 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; - 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; - 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; - 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 632F3C270D316FB5003BBC56 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8D1107260486CEB800E47090; - remoteInfo = VLC; - }; - 63E930B10D5F430E006B31CD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 633BD69D0D2ACE520012A314 /* VLCKit.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 8DC2EF5B0486A6940098B216; - remoteInfo = VLCKit; - }; - 63E930B50D5F43E9006B31CD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8D1107260486CEB800E47090; - remoteInfo = VLC; - }; - 63E930B70D5F43FA006B31CD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 633BD69D0D2ACE520012A314 /* VLCKit.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 633BD6D20D2ADE040012A314; - remoteInfo = "vlc-contrib-core-framework"; - }; - 63E930B90D5F4404006B31CD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 633BD69D0D2ACE520012A314 /* VLCKit.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 8DC2EF4F0486A6940098B216; - remoteInfo = VLCKit; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; - 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; - 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; - 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; - 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; - 32CA4F630368D1EE00C91783 /* VLC_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLC_Prefix.pch; sourceTree = ""; }; - 632F3E250D326FF0003BBC56 /* pause.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pause.png; path = ../../../extras/package/macosx/Resources/pause.png; sourceTree = SOURCE_ROOT; }; - 633BD4AA0D2A90470012A314 /* VLCValueTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCValueTransformer.m; path = Sources/VLCValueTransformer.m; sourceTree = ""; }; - 633BD4AB0D2A90470012A314 /* VLCValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCValueTransformer.h; path = Sources/VLCValueTransformer.h; sourceTree = ""; }; - 633BD4AC0D2A90470012A314 /* VLCMediaArrayController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMediaArrayController.m; path = Sources/VLCMediaArrayController.m; sourceTree = ""; }; - 633BD4AD0D2A90470012A314 /* VLCMainWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMainWindow.m; path = Sources/VLCMainWindow.m; sourceTree = ""; }; - 633BD4AE0D2A90470012A314 /* VLCMediaArrayController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaArrayController.h; path = Sources/VLCMediaArrayController.h; sourceTree = ""; }; - 633BD4AF0D2A90470012A314 /* VLCExceptionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCExceptionHandler.m; path = Sources/VLCExceptionHandler.m; sourceTree = ""; }; - 633BD4B00D2A90470012A314 /* VLCMainWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMainWindow.h; path = Sources/VLCMainWindow.h; sourceTree = ""; }; - 633BD4B10D2A90470012A314 /* VLCController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCController.m; path = Sources/VLCController.m; sourceTree = ""; }; - 633BD4B20D2A90470012A314 /* VLCExceptionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCExceptionHandler.h; path = Sources/VLCExceptionHandler.h; sourceTree = ""; }; - 633BD4B30D2A90470012A314 /* VLCBrowsableVideoView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCBrowsableVideoView.m; path = Sources/VLCBrowsableVideoView.m; sourceTree = ""; }; - 633BD4B40D2A90470012A314 /* VLCController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCController.h; path = Sources/VLCController.h; sourceTree = ""; }; - 633BD4B50D2A90470012A314 /* VLCAppBindings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCAppBindings.m; path = Sources/VLCAppBindings.m; sourceTree = ""; }; - 633BD4B60D2A90470012A314 /* VLCBrowsableVideoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCBrowsableVideoView.h; path = Sources/VLCBrowsableVideoView.h; sourceTree = ""; }; - 633BD4B70D2A90470012A314 /* VLCAppBindings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCAppBindings.h; path = Sources/VLCAppBindings.h; sourceTree = ""; }; - 633BD4B80D2A90470012A314 /* VLCAppAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCAppAdditions.h; path = Sources/VLCAppAdditions.h; sourceTree = ""; }; - 633BD4B90D2A90470012A314 /* VLCAppAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCAppAdditions.m; path = Sources/VLCAppAdditions.m; sourceTree = ""; }; - 633BD4BA0D2A90470012A314 /* ImageAndTextCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ImageAndTextCell.m; path = Sources/ImageAndTextCell.m; sourceTree = ""; }; - 633BD4BB0D2A90470012A314 /* ImageAndTextCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ImageAndTextCell.h; path = Sources/ImageAndTextCell.h; sourceTree = ""; }; - 633BD4D80D2A90C80012A314 /* dialog-error.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "dialog-error.png"; path = "Icons/dialog-error.png"; sourceTree = ""; }; - 633BD4D90D2A90C80012A314 /* applications-internet.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "applications-internet.png"; path = "Icons/applications-internet.png"; sourceTree = ""; }; - 633BD69D0D2ACE520012A314 /* VLCKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = VLCKit.xcodeproj; path = ../framework/VLCKit.xcodeproj; sourceTree = SOURCE_ROOT; }; - 63541FA70D3BA1DB001F6433 /* VLCMediaLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaLayer.h; path = Sources/VLCMediaLayer.h; sourceTree = ""; }; - 63541FA80D3BA1DB001F6433 /* VLCMediaLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMediaLayer.m; path = Sources/VLCMediaLayer.m; sourceTree = ""; }; - 635422030D3BE019001F6433 /* VLCMainWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMainWindowController.h; path = Sources/VLCMainWindowController.h; sourceTree = ""; }; - 635422040D3BE019001F6433 /* VLCMainWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMainWindowController.m; path = Sources/VLCMainWindowController.m; sourceTree = ""; }; - 635424910D3C1394001F6433 /* VLCMediaListLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaListLayer.h; path = Sources/VLCMediaListLayer.h; sourceTree = ""; }; - 635424920D3C1394001F6433 /* VLCMediaListLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMediaListLayer.m; path = Sources/VLCMediaListLayer.m; sourceTree = ""; }; - 63874B180D25960600F738AD /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainWindow.xib; sourceTree = ""; }; - 638B823A0D35294500128F2B /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; - 638F47100D216C8F008E4912 /* playlist.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = playlist.png; path = ../../../modules/gui/qt4/pixmaps/playlist/playlist.png; sourceTree = SOURCE_ROOT; }; - 63A742B20D2759C1002D41A0 /* ExceptionHandling.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExceptionHandling.framework; path = /System/Library/Frameworks/ExceptionHandling.framework; sourceTree = ""; }; - 63E380A80D1C65A600FD6958 /* volume_high.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = volume_high.png; path = ../../../extras/package/macosx/Resources/volume_high.png; sourceTree = SOURCE_ROOT; }; - 63E380A90D1C65A600FD6958 /* volume_low.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = volume_low.png; path = ../../../extras/package/macosx/Resources/volume_low.png; sourceTree = SOURCE_ROOT; }; - 63E380AC0D1C65D100FD6958 /* play.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = play.png; path = ../../../extras/package/macosx/Resources/play.png; sourceTree = SOURCE_ROOT; }; - 63E380AD0D1C65D100FD6958 /* play_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = play_blue.png; path = ../../../extras/package/macosx/Resources/play_blue.png; sourceTree = SOURCE_ROOT; }; - 63E380B00D1C65F200FD6958 /* skip_forward_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = skip_forward_active.png; path = ../../../extras/package/macosx/Resources/skip_forward_active.png; sourceTree = SOURCE_ROOT; }; - 63E380B10D1C65F200FD6958 /* skip_forward_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = skip_forward_blue.png; path = ../../../extras/package/macosx/Resources/skip_forward_blue.png; sourceTree = SOURCE_ROOT; }; - 63E380B40D1C65FC00FD6958 /* skip_previous_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = skip_previous_active.png; path = ../../../extras/package/macosx/Resources/skip_previous_active.png; sourceTree = SOURCE_ROOT; }; - 63E380B50D1C65FC00FD6958 /* skip_previous_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = skip_previous_blue.png; path = ../../../extras/package/macosx/Resources/skip_previous_blue.png; sourceTree = SOURCE_ROOT; }; - 63E380DE0D1C6FD800FD6958 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = /System/Library/Frameworks/QuartzCore.framework; sourceTree = ""; }; - 63E768810D3503E200258089 /* VLCFullScreenControllerWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCFullScreenControllerWindow.h; path = Sources/VLCFullScreenControllerWindow.h; sourceTree = ""; }; - 63E768820D3503E200258089 /* VLCFullScreenControllerWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCFullScreenControllerWindow.m; path = Sources/VLCFullScreenControllerWindow.m; sourceTree = ""; }; - 63E768A40D3507EF00258089 /* fs_volume_slider_knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_slider_knob.png; path = ../../../extras/package/macosx/Resources/fs_volume_slider_knob.png; sourceTree = SOURCE_ROOT; }; - 63E768A50D3507EF00258089 /* fs_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_background.png; path = ../../../extras/package/macosx/Resources/fs_background.png; sourceTree = SOURCE_ROOT; }; - 63E768A60D3507EF00258089 /* fs_exit_fullscreen_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_exit_fullscreen_highlight.png; path = ../../../extras/package/macosx/Resources/fs_exit_fullscreen_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768A70D3507EF00258089 /* fs_exit_fullscreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_exit_fullscreen.png; path = ../../../extras/package/macosx/Resources/fs_exit_fullscreen.png; sourceTree = SOURCE_ROOT; }; - 63E768A80D3507EF00258089 /* fs_forward_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_forward_highlight.png; path = ../../../extras/package/macosx/Resources/fs_forward_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768A90D3507EF00258089 /* fs_forward.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_forward.png; path = ../../../extras/package/macosx/Resources/fs_forward.png; sourceTree = SOURCE_ROOT; }; - 63E768AA0D3507EF00258089 /* fs_pause_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_pause_highlight.png; path = ../../../extras/package/macosx/Resources/fs_pause_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768AB0D3507EF00258089 /* fs_pause.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_pause.png; path = ../../../extras/package/macosx/Resources/fs_pause.png; sourceTree = SOURCE_ROOT; }; - 63E768AC0D3507EF00258089 /* fs_play_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_play_highlight.png; path = ../../../extras/package/macosx/Resources/fs_play_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768AD0D3507EF00258089 /* fs_play.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_play.png; path = ../../../extras/package/macosx/Resources/fs_play.png; sourceTree = SOURCE_ROOT; }; - 63E768AE0D3507EF00258089 /* fs_rewind_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_rewind_highlight.png; path = ../../../extras/package/macosx/Resources/fs_rewind_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768AF0D3507EF00258089 /* fs_rewind.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_rewind.png; path = ../../../extras/package/macosx/Resources/fs_rewind.png; sourceTree = SOURCE_ROOT; }; - 63E768B00D3507EF00258089 /* fs_skip_next_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_skip_next_highlight.png; path = ../../../extras/package/macosx/Resources/fs_skip_next_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768B10D3507EF00258089 /* fs_skip_next.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_skip_next.png; path = ../../../extras/package/macosx/Resources/fs_skip_next.png; sourceTree = SOURCE_ROOT; }; - 63E768B20D3507EF00258089 /* fs_skip_previous_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_skip_previous_highlight.png; path = ../../../extras/package/macosx/Resources/fs_skip_previous_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768B30D3507EF00258089 /* fs_skip_previous.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_skip_previous.png; path = ../../../extras/package/macosx/Resources/fs_skip_previous.png; sourceTree = SOURCE_ROOT; }; - 63E768B40D3507EF00258089 /* fs_stop_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_stop_highlight.png; path = ../../../extras/package/macosx/Resources/fs_stop_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768B50D3507EF00258089 /* fs_stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_stop.png; path = ../../../extras/package/macosx/Resources/fs_stop.png; sourceTree = SOURCE_ROOT; }; - 63E768B60D3507EF00258089 /* fs_time_slider_knob_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_time_slider_knob_highlight.png; path = ../../../extras/package/macosx/Resources/fs_time_slider_knob_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768B70D3507EF00258089 /* fs_time_slider_knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_time_slider_knob.png; path = ../../../extras/package/macosx/Resources/fs_time_slider_knob.png; sourceTree = SOURCE_ROOT; }; - 63E768B80D3507EF00258089 /* fs_time_slider.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_time_slider.png; path = ../../../extras/package/macosx/Resources/fs_time_slider.png; sourceTree = SOURCE_ROOT; }; - 63E768B90D3507EF00258089 /* fs_volume_max_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_max_highlight.png; path = ../../../extras/package/macosx/Resources/fs_volume_max_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768BA0D3507EF00258089 /* fs_volume_max.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_max.png; path = ../../../extras/package/macosx/Resources/fs_volume_max.png; sourceTree = SOURCE_ROOT; }; - 63E768BB0D3507EF00258089 /* fs_volume_mute_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_mute_highlight.png; path = ../../../extras/package/macosx/Resources/fs_volume_mute_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E768BC0D3507EF00258089 /* fs_volume_mute.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_mute.png; path = ../../../extras/package/macosx/Resources/fs_volume_mute.png; sourceTree = SOURCE_ROOT; }; - 63E768BD0D3507EF00258089 /* fs_volume_slider_bar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_slider_bar.png; path = ../../../extras/package/macosx/Resources/fs_volume_slider_bar.png; sourceTree = SOURCE_ROOT; }; - 63E768BE0D3507EF00258089 /* fs_volume_slider_knob_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_slider_knob_highlight.png; path = ../../../extras/package/macosx/Resources/fs_volume_slider_knob_highlight.png; sourceTree = SOURCE_ROOT; }; - 63E76A520D35225700258089 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 8D1107320486CEB800E47090 /* VLC.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VLC.app; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8D11072E0486CEB800E47090 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 63E930C60D5F4463006B31CD /* VLCKit.framework in Frameworks */, - 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, - 63E380DF0D1C6FD800FD6958 /* QuartzCore.framework in Frameworks */, - 63A742B30D2759C1002D41A0 /* ExceptionHandling.framework in Frameworks */, - 63E76A530D35225700258089 /* Carbon.framework in Frameworks */, - 638B823B0D35294500128F2B /* QuickTime.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { - isa = PBXGroup; - children = ( - 638B823A0D35294500128F2B /* QuickTime.framework */, - 63A742B20D2759C1002D41A0 /* ExceptionHandling.framework */, - 63E380DE0D1C6FD800FD6958 /* QuartzCore.framework */, - 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, - ); - name = "Linked Frameworks"; - sourceTree = ""; - }; - 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 29B97324FDCFA39411CA2CEA /* AppKit.framework */, - 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, - 29B97325FDCFA39411CA2CEA /* Foundation.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 8D1107320486CEB800E47090 /* VLC.app */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* VLC */ = { - isa = PBXGroup; - children = ( - 63E76A520D35225700258089 /* Carbon.framework */, - 633BD6A40D2ACE5E0012A314 /* Dependencies */, - 63874AF40D2591CE00F738AD /* Sources */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - name = VLC; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 32CA4F630368D1EE00C91783 /* VLC_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - 63C551960C7F6AD100B202D3 /* Images */, - 8D1107310486CEB800E47090 /* Info.plist */, - 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, - 63874B170D25960600F738AD /* MainWindow.xib */, - 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, - 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; - 633BD4620D2A8DF30012A314 /* Internals */ = { - isa = PBXGroup; - children = ( - 633BD4B20D2A90470012A314 /* VLCExceptionHandler.h */, - 633BD4AF0D2A90470012A314 /* VLCExceptionHandler.m */, - ); - name = Internals; - sourceTree = ""; - }; - 633BD6A40D2ACE5E0012A314 /* Dependencies */ = { - isa = PBXGroup; - children = ( - 633BD69D0D2ACE520012A314 /* VLCKit.xcodeproj */, - ); - name = Dependencies; - sourceTree = ""; - }; - 63874AF40D2591CE00F738AD /* Sources */ = { - isa = PBXGroup; - children = ( - 633BD4B40D2A90470012A314 /* VLCController.h */, - 633BD4B10D2A90470012A314 /* VLCController.m */, - 63874AF60D25920800F738AD /* Additions */, - 633BD4620D2A8DF30012A314 /* Internals */, - 63874AF50D2591EF00F738AD /* Video */, - 63874AF70D25922800F738AD /* Media List Management */, - 63874B0E0D25928400F738AD /* Window Management */, - ); - name = Sources; - sourceTree = ""; - }; - 63874AF50D2591EF00F738AD /* Video */ = { - isa = PBXGroup; - children = ( - 633BD4B60D2A90470012A314 /* VLCBrowsableVideoView.h */, - 633BD4B30D2A90470012A314 /* VLCBrowsableVideoView.m */, - 63E768810D3503E200258089 /* VLCFullScreenControllerWindow.h */, - 63E768820D3503E200258089 /* VLCFullScreenControllerWindow.m */, - 63541FA70D3BA1DB001F6433 /* VLCMediaLayer.h */, - 63541FA80D3BA1DB001F6433 /* VLCMediaLayer.m */, - 635424910D3C1394001F6433 /* VLCMediaListLayer.h */, - 635424920D3C1394001F6433 /* VLCMediaListLayer.m */, - ); - name = Video; - sourceTree = ""; - }; - 63874AF60D25920800F738AD /* Additions */ = { - isa = PBXGroup; - children = ( - 633BD4AB0D2A90470012A314 /* VLCValueTransformer.h */, - 633BD4AA0D2A90470012A314 /* VLCValueTransformer.m */, - 633BD4B70D2A90470012A314 /* VLCAppBindings.h */, - 633BD4B50D2A90470012A314 /* VLCAppBindings.m */, - 633BD4B80D2A90470012A314 /* VLCAppAdditions.h */, - 633BD4B90D2A90470012A314 /* VLCAppAdditions.m */, - 633BD4BB0D2A90470012A314 /* ImageAndTextCell.h */, - 633BD4BA0D2A90470012A314 /* ImageAndTextCell.m */, - ); - name = Additions; - sourceTree = ""; - }; - 63874AF70D25922800F738AD /* Media List Management */ = { - isa = PBXGroup; - children = ( - 633BD4AE0D2A90470012A314 /* VLCMediaArrayController.h */, - 633BD4AC0D2A90470012A314 /* VLCMediaArrayController.m */, - ); - name = "Media List Management"; - sourceTree = ""; - }; - 63874B0E0D25928400F738AD /* Window Management */ = { - isa = PBXGroup; - children = ( - 633BD4B00D2A90470012A314 /* VLCMainWindow.h */, - 633BD4AD0D2A90470012A314 /* VLCMainWindow.m */, - 635422030D3BE019001F6433 /* VLCMainWindowController.h */, - 635422040D3BE019001F6433 /* VLCMainWindowController.m */, - ); - name = "Window Management"; - sourceTree = ""; - }; - 63C551960C7F6AD100B202D3 /* Images */ = { - isa = PBXGroup; - children = ( - 63E768860D35072F00258089 /* Categories Icons */, - 63E768850D35072600258089 /* Toolbar Items */, - 63E768DA0D3507F500258089 /* FullScreenControllerWindow */, - ); - name = Images; - sourceTree = ""; - }; - 63E768850D35072600258089 /* Toolbar Items */ = { - isa = PBXGroup; - children = ( - 63E380A80D1C65A600FD6958 /* volume_high.png */, - 63E380A90D1C65A600FD6958 /* volume_low.png */, - 63E380AC0D1C65D100FD6958 /* play.png */, - 63E380AD0D1C65D100FD6958 /* play_blue.png */, - 632F3E250D326FF0003BBC56 /* pause.png */, - 63E380B00D1C65F200FD6958 /* skip_forward_active.png */, - 63E380B10D1C65F200FD6958 /* skip_forward_blue.png */, - 63E380B40D1C65FC00FD6958 /* skip_previous_active.png */, - 63E380B50D1C65FC00FD6958 /* skip_previous_blue.png */, - ); - name = "Toolbar Items"; - sourceTree = ""; - }; - 63E768860D35072F00258089 /* Categories Icons */ = { - isa = PBXGroup; - children = ( - 638F47100D216C8F008E4912 /* playlist.png */, - 633BD4D80D2A90C80012A314 /* dialog-error.png */, - 633BD4D90D2A90C80012A314 /* applications-internet.png */, - ); - name = "Categories Icons"; - sourceTree = ""; - }; - 63E768DA0D3507F500258089 /* FullScreenControllerWindow */ = { - isa = PBXGroup; - children = ( - 63E768A40D3507EF00258089 /* fs_volume_slider_knob.png */, - 63E768A50D3507EF00258089 /* fs_background.png */, - 63E768A60D3507EF00258089 /* fs_exit_fullscreen_highlight.png */, - 63E768A70D3507EF00258089 /* fs_exit_fullscreen.png */, - 63E768A80D3507EF00258089 /* fs_forward_highlight.png */, - 63E768A90D3507EF00258089 /* fs_forward.png */, - 63E768AA0D3507EF00258089 /* fs_pause_highlight.png */, - 63E768AB0D3507EF00258089 /* fs_pause.png */, - 63E768AC0D3507EF00258089 /* fs_play_highlight.png */, - 63E768AD0D3507EF00258089 /* fs_play.png */, - 63E768AE0D3507EF00258089 /* fs_rewind_highlight.png */, - 63E768AF0D3507EF00258089 /* fs_rewind.png */, - 63E768B00D3507EF00258089 /* fs_skip_next_highlight.png */, - 63E768B10D3507EF00258089 /* fs_skip_next.png */, - 63E768B20D3507EF00258089 /* fs_skip_previous_highlight.png */, - 63E768B30D3507EF00258089 /* fs_skip_previous.png */, - 63E768B40D3507EF00258089 /* fs_stop_highlight.png */, - 63E768B50D3507EF00258089 /* fs_stop.png */, - 63E768B60D3507EF00258089 /* fs_time_slider_knob_highlight.png */, - 63E768B70D3507EF00258089 /* fs_time_slider_knob.png */, - 63E768B80D3507EF00258089 /* fs_time_slider.png */, - 63E768B90D3507EF00258089 /* fs_volume_max_highlight.png */, - 63E768BA0D3507EF00258089 /* fs_volume_max.png */, - 63E768BB0D3507EF00258089 /* fs_volume_mute_highlight.png */, - 63E768BC0D3507EF00258089 /* fs_volume_mute.png */, - 63E768BD0D3507EF00258089 /* fs_volume_slider_bar.png */, - 63E768BE0D3507EF00258089 /* fs_volume_slider_knob_highlight.png */, - ); - name = FullScreenControllerWindow; - sourceTree = ""; - }; - 63E930AA0D5F430E006B31CD /* Products */ = { - isa = PBXGroup; - children = ( - 63E930B20D5F430E006B31CD /* VLCKit.framework */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8D1107260486CEB800E47090 /* VLC */ = { - isa = PBXNativeTarget; - buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "VLC" */; - buildPhases = ( - 63FFDC300D2AE9D30092FC96 /* ShellScript */, - 8D1107290486CEB800E47090 /* Resources */, - 8D11072C0486CEB800E47090 /* Sources */, - 8D11072E0486CEB800E47090 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = VLC; - productInstallPath = "$(HOME)/Applications"; - productName = VLC; - productReference = 8D1107320486CEB800E47090 /* VLC.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "VLC" */; - compatibilityVersion = "Xcode 3.0"; - hasScannedForEncodings = 1; - mainGroup = 29B97314FDCFA39411CA2CEA /* VLC */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 63E930AA0D5F430E006B31CD /* Products */; - ProjectRef = 633BD69D0D2ACE520012A314 /* VLCKit.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 633BD70D0D2AE0DF0012A314 /* vlc-contrib-core-framework-app */, - 637F33DF0D2AEE05001E70AB /* vlc-framework-app */, - 8D1107260486CEB800E47090 /* VLC */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 63E930B20D5F430E006B31CD /* VLCKit.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = VLCKit.framework; - remoteRef = 63E930B10D5F430E006B31CD /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 8D1107290486CEB800E47090 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */, - 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, - 63E380AA0D1C65A600FD6958 /* volume_high.png in Resources */, - 63E380AB0D1C65A600FD6958 /* volume_low.png in Resources */, - 63E380AE0D1C65D100FD6958 /* play.png in Resources */, - 63E380AF0D1C65D100FD6958 /* play_blue.png in Resources */, - 63E380B20D1C65F200FD6958 /* skip_forward_active.png in Resources */, - 63E380B30D1C65F200FD6958 /* skip_forward_blue.png in Resources */, - 63E380B60D1C65FC00FD6958 /* skip_previous_active.png in Resources */, - 63E380B70D1C65FC00FD6958 /* skip_previous_blue.png in Resources */, - 638F47110D216C8F008E4912 /* playlist.png in Resources */, - 63874B190D25960600F738AD /* MainWindow.xib in Resources */, - 633BD4DA0D2A90C80012A314 /* dialog-error.png in Resources */, - 633BD4DB0D2A90C80012A314 /* applications-internet.png in Resources */, - 632F3E260D326FF0003BBC56 /* pause.png in Resources */, - 63E768BF0D3507EF00258089 /* fs_volume_slider_knob.png in Resources */, - 63E768C00D3507EF00258089 /* fs_background.png in Resources */, - 63E768C10D3507EF00258089 /* fs_exit_fullscreen_highlight.png in Resources */, - 63E768C20D3507EF00258089 /* fs_exit_fullscreen.png in Resources */, - 63E768C30D3507EF00258089 /* fs_forward_highlight.png in Resources */, - 63E768C40D3507EF00258089 /* fs_forward.png in Resources */, - 63E768C50D3507EF00258089 /* fs_pause_highlight.png in Resources */, - 63E768C60D3507EF00258089 /* fs_pause.png in Resources */, - 63E768C70D3507EF00258089 /* fs_play_highlight.png in Resources */, - 63E768C80D3507EF00258089 /* fs_play.png in Resources */, - 63E768C90D3507EF00258089 /* fs_rewind_highlight.png in Resources */, - 63E768CA0D3507EF00258089 /* fs_rewind.png in Resources */, - 63E768CB0D3507EF00258089 /* fs_skip_next_highlight.png in Resources */, - 63E768CC0D3507EF00258089 /* fs_skip_next.png in Resources */, - 63E768CD0D3507EF00258089 /* fs_skip_previous_highlight.png in Resources */, - 63E768CE0D3507EF00258089 /* fs_skip_previous.png in Resources */, - 63E768CF0D3507EF00258089 /* fs_stop_highlight.png in Resources */, - 63E768D00D3507EF00258089 /* fs_stop.png in Resources */, - 63E768D10D3507EF00258089 /* fs_time_slider_knob_highlight.png in Resources */, - 63E768D20D3507EF00258089 /* fs_time_slider_knob.png in Resources */, - 63E768D30D3507EF00258089 /* fs_time_slider.png in Resources */, - 63E768D40D3507EF00258089 /* fs_volume_max_highlight.png in Resources */, - 63E768D50D3507EF00258089 /* fs_volume_max.png in Resources */, - 63E768D60D3507EF00258089 /* fs_volume_mute_highlight.png in Resources */, - 63E768D70D3507EF00258089 /* fs_volume_mute.png in Resources */, - 63E768D80D3507EF00258089 /* fs_volume_slider_bar.png in Resources */, - 63E768D90D3507EF00258089 /* fs_volume_slider_knob_highlight.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 63FFDC300D2AE9D30092FC96 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - $SRCROOT/../Framework/build/$BUILD_VARIANTS/VLCKit.framework, - ); - outputPaths = ( - $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/VLCKit.framework, - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if test \"$SYMROOT\" == \"$PROJECT_DIR/build\"\nthen\n\tVLCFRAMEWORK=\"$SRCROOT/../Framework/build/$CONFIGURATION/VLCKit.framework\"\nelse\n\tVLCFRAMEWORK=\"$SYMROOT/$CONFIGURATION/VLCKit.framework\"\nfi\n/Developer/Library/PrivateFrameworks/DevToolsCore.framework/Resources/pbxcp -exclude .DS_Store -exclude CVS -exclude .svn -resolve-src-symlinks $VLCFRAMEWORK $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH\n\n\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8D11072C0486CEB800E47090 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D11072D0486CEB800E47090 /* main.m in Sources */, - 633BD4BC0D2A90470012A314 /* VLCValueTransformer.m in Sources */, - 633BD4BD0D2A90470012A314 /* VLCMediaArrayController.m in Sources */, - 633BD4BE0D2A90470012A314 /* VLCMainWindow.m in Sources */, - 633BD4BF0D2A90470012A314 /* VLCExceptionHandler.m in Sources */, - 633BD4C00D2A90470012A314 /* VLCController.m in Sources */, - 633BD4C10D2A90470012A314 /* VLCBrowsableVideoView.m in Sources */, - 633BD4C20D2A90470012A314 /* VLCAppBindings.m in Sources */, - 633BD4C30D2A90470012A314 /* VLCAppAdditions.m in Sources */, - 633BD4C40D2A90470012A314 /* ImageAndTextCell.m in Sources */, - 63E768830D3503E200258089 /* VLCFullScreenControllerWindow.m in Sources */, - 63541FA90D3BA1DB001F6433 /* VLCMediaLayer.m in Sources */, - 635422050D3BE019001F6433 /* VLCMainWindowController.m in Sources */, - 635424930D3C1394001F6433 /* VLCMediaListLayer.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 632F3C280D316FB5003BBC56 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8D1107260486CEB800E47090 /* VLC */; - targetProxy = 632F3C270D316FB5003BBC56 /* PBXContainerItemProxy */; - }; - 63E930B60D5F43E9006B31CD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8D1107260486CEB800E47090 /* VLC */; - targetProxy = 63E930B50D5F43E9006B31CD /* PBXContainerItemProxy */; - }; - 63E930B80D5F43FA006B31CD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "vlc-contrib-core-framework"; - targetProxy = 63E930B70D5F43FA006B31CD /* PBXContainerItemProxy */; - }; - 63E930BA0D5F4404006B31CD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = VLCKit; - targetProxy = 63E930B90D5F4404006B31CD /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 089C165DFE840E0CC02AAC07 /* English */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { - isa = PBXVariantGroup; - children = ( - 29B97319FDCFA39411CA2CEA /* English */, - ); - name = MainMenu.nib; - sourceTree = ""; - }; - 63874B170D25960600F738AD /* MainWindow.xib */ = { - isa = PBXVariantGroup; - children = ( - 63874B180D25960600F738AD /* English */, - ); - name = MainWindow.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 633BD70E0D2AE0DF0012A314 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - PRODUCT_NAME = "vlc-contrib-core-framework-app"; - }; - name = Debug; - }; - 633BD70F0D2AE0DF0012A314 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - PRODUCT_NAME = "vlc-contrib-core-framework-app"; - ZERO_LINK = NO; - }; - name = Release; - }; - 637F33E00D2AEE05001E70AB /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - PRODUCT_NAME = "vlc-framework-app"; - }; - name = Debug; - }; - 637F33E10D2AEE05001E70AB /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - PRODUCT_NAME = "vlc-framework-app"; - ZERO_LINK = NO; - }; - name = Release; - }; - C01FCF4B08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", - "\"$(SRCROOT)/../Framework/build/Debug\"", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_ENABLE_OBJC_GC = unsupported; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_NAME = VLC; - WRAPPER_EXTENSION = app; - ZERO_LINK = YES; - }; - name = Debug; - }; - C01FCF4C08A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(NATIVE_ARCH)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", - "\"$(SRCROOT)/../Framework/build/Debug\"", - ); - GCC_ENABLE_OBJC_GC = unsupported; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_MODEL_TUNING = G5; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_NAME = VLC; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(NATIVE_ARCH_32_BIT)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - PREBINDING = NO; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(NATIVE_ARCH_32_BIT)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - PREBINDING = NO; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 633BD7150D2AE1170012A314 /* Build configuration list for PBXAggregateTarget "vlc-contrib-core-framework-app" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 633BD70E0D2AE0DF0012A314 /* Debug */, - 633BD70F0D2AE0DF0012A314 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 637F33F80D2AEE67001E70AB /* Build configuration list for PBXAggregateTarget "vlc-framework-app" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 637F33E00D2AEE05001E70AB /* Debug */, - 637F33E10D2AEE05001E70AB /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "VLC" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4B08A954540054247B /* Debug */, - C01FCF4C08A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "VLC" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/projects/macosx/vlc_app/VLC_Prefix.pch b/projects/macosx/vlc_app/VLC_Prefix.pch deleted file mode 100644 index b625338788..0000000000 --- a/projects/macosx/vlc_app/VLC_Prefix.pch +++ /dev/null @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'VLC' target in the 'VLC' project -// - -#ifdef __OBJC__ - #import -#endif diff --git a/projects/macosx/vlc_app/main.m b/projects/macosx/vlc_app/main.m deleted file mode 100644 index 781edefd6b..0000000000 --- a/projects/macosx/vlc_app/main.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// main.m -// VLC -// -// Created by Pierre d'Herbemont on 11/08/07. -// Copyright __MyCompanyName__ 2007. All rights reserved. -// - -#import - -int main(int argc, char *argv[]) -{ - return NSApplicationMain(argc, (const char **) argv); -} -- 2.39.2