commit 1791b24f37b822c258758e371e99fbdfd14a8636 Author: Andy <88590076+AAndyProgram@users.noreply.github.com> Date: Tue Dec 7 09:52:01 2021 +0300 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ea61cf --- /dev/null +++ b/.gitignore @@ -0,0 +1,392 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates +ffmpeg.exe +ToDo.txt + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ +ffmpeg/ +Info/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Nuget personal access tokens and Credentials +nuget.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +.idea/ +*.sln.iml \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8f43622 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# Social networks crawler + +Program for downloading photo and video from Reddit and Twitter + +Enjoying the tool? Considering adding to my coffee fund :) + +[![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/andyprogram) + +# What can program do: +- Download pictures and videos from users' profiles: + - Reddit images; + - Reddit galleries of images; + - Redgifs hosted videos (https://www.redgifs.com/); + - Reddit hosted videos (downloading Reddit hosted video is going through ffmpeg); + - Twitter images; + - Twitter videos. +- Parse channel and view data. +- Add users from parsed channel. +- Labeling users. +- Filter exists users by label or group. + +# How does it works: + +## Reddit + +The program parsing all user's posts, gathering pictures' MD5 hash and compare with existing for remove duplicates. Then media will be downloaded. + +## Twitter + +The program parsing all user's posts and compare file names with existing for remove duplicates. Then media will be downloaded. + +# Requirements: + +- Windows 7, 8, 9, 10, 11 with NET Framework 4.6.1 or higher +- Authorization cookies and tokens for Twitter (if you want to download data from Twitter) +- Don't put program in the ```Program Files``` system folder (this is portable program and program settings are stored in the program folder) +- Just unpack program archive in any folder you want, copy ```ffmpeg.exe``` into and enjoy. :-) + +# Settings and usage + +The program has an intuitive interface. + +Just add user profile and press ```Start downloading``` button. + +Users can be added by patterns: +- https://twitter.com/SomeUserName +- https://reddit.com/user/SomeUserName +- u/SomeUserName +- SomeUserName (in this case you must to choose user site) + +More about users adding here + +## Using program as just video downloader + +Create a shortcut for the program. Open shortcut properties. On the ```Shortcut``` tab in ```Target``` field just add ```v``` at the end through the space. + +Example: ```D:\Programs\SCrawler\SCrawler.exe v``` \ No newline at end of file diff --git a/SCrawler.sln b/SCrawler.sln new file mode 100644 index 0000000..6271746 --- /dev/null +++ b/SCrawler.sln @@ -0,0 +1,60 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31515.178 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SCrawler", "SCrawler\SCrawler.vbproj", "{4A016FAD-9F07-4957-8BB2-AE86C88BA342}" +EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "PersonalUtilities", "..\..\MyUtilities\PersonalUtilities\PersonalUtilities.vbproj", "{8405896B-2685-4916-BC93-1FB514C323A9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FE5CE5B9-DDBE-4399-A17C-880893635307}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + README.md = README.md + Info\RedditUrlsInfo.txt = Info\RedditUrlsInfo.txt + Info\TwitterNewAlgo.txt = Info\TwitterNewAlgo.txt + Info\TwitterUrlsInfo.txt = Info\TwitterUrlsInfo.txt + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|x64.ActiveCfg = Debug|x64 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|x64.Build.0 = Debug|x64 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|x86.ActiveCfg = Debug|x86 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|x86.Build.0 = Debug|x86 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|Any CPU.Build.0 = Release|Any CPU + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|x64.ActiveCfg = Release|x64 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|x64.Build.0 = Release|x64 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|x86.ActiveCfg = Release|x86 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|x86.Build.0 = Release|x86 + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|x64.ActiveCfg = Debug|x64 + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|x64.Build.0 = Debug|x64 + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|x86.ActiveCfg = Debug|x86 + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|x86.Build.0 = Debug|x86 + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|Any CPU.Build.0 = Release|Any CPU + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|x64.ActiveCfg = Release|x64 + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|x64.Build.0 = Release|x64 + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|x86.ActiveCfg = Release|x86 + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4037B243-B6D7-4DF1-A4CC-4E86F4AD31BB} + EndGlobalSection +EndGlobal diff --git a/SCrawler/API/Base/SiteSettings.vb b/SCrawler/API/Base/SiteSettings.vb new file mode 100644 index 0000000..90d3435 --- /dev/null +++ b/SCrawler/API/Base/SiteSettings.vb @@ -0,0 +1,78 @@ +Imports PersonalUtilities.Tools +Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.XML.Base +Namespace API.Base + Friend Class SiteSettings : Implements IDisposable + Friend Const Header_Twitter_Authorization As String = "authorization" + Friend Const Header_Twitter_Token As String = "x-csrf-token" + Friend ReadOnly Site As Sites + Friend ReadOnly Responser As WEB.Response + Private ReadOnly _Path As XMLValue(Of SFile) + Friend Property Path As SFile + Get + If _Path.IsEmptyString Then _Path.Value = SFile.GetPath($"{Settings.GlobalPath.Value.PathWithSeparator}{Site}") + Return _Path.Value + End Get + Set(ByVal NewFile As SFile) + _Path.Value = NewFile + End Set + End Property + Private ReadOnly SettingsFile As SFile + Friend Sub New(ByVal s As Sites, ByRef _XML As XmlFile, ByVal GlobalPath As SFile) + Site = s + SettingsFile = $"{SettingsFolderName}\Responser_{s}.xml" + Responser = New WEB.Response(SettingsFile) + + If SettingsFile.Exists Then + Responser.LoadSettings() + Else + If Site = Sites.Twitter Then + With Responser + .ContentType = "application/json" + .Accept = "*/*" + .CookiesDomain = "twitter.com" + .Decoders.Add(SymbolsConverter.Converters.Unicode) + With .Headers + .Add("sec-ch-ua", " Not;A Brand" & Chr(34) & ";v=" & Chr(34) & "99" & Chr(34) & ", " & Chr(34) & + "Google Chrome" & Chr(34) & ";v=" & Chr(34) & "91" & Chr(34) & ", " & Chr(34) & "Chromium" & + Chr(34) & ";v=" & Chr(34) & "91" & Chr(34)) + .Add("sec-ch-ua-mobile", "?0") + .Add("sec-fetch-dest", "empty") + .Add("sec-fetch-mode", "cors") + .Add("sec-fetch-site", "same-origin") + .Add(Header_Twitter_Token, String.Empty) + .Add("x-twitter-active-user", "yes") + .Add("x-twitter-auth-type", "OAuth2Session") + .Add(Header_Twitter_Authorization, String.Empty) + End With + End With + ElseIf Site = Sites.Reddit Then + Responser.CookiesDomain = "reddit.com" + Responser.Decoders.Add(SymbolsConverter.Converters.Unicode) + End If + Responser.SaveSettings() + End If + _Path = New XMLValue(Of SFile)("Path", SFile.GetPath($"{GlobalPath.PathWithSeparator}{Site}"), _XML, {Site.ToString}, XMLValue(Of SFile).ToFilePath) + End Sub + Friend Sub Update() + Responser.SaveSettings() + End Sub +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then Responser.Dispose() + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Base/Structures.vb b/SCrawler/API/Base/Structures.vb new file mode 100644 index 0000000..63e77cb --- /dev/null +++ b/SCrawler/API/Base/Structures.vb @@ -0,0 +1,81 @@ +Namespace API.Base + Friend Module Structures + Friend Structure UserMedia : Implements IEquatable(Of UserMedia) + Friend Enum Types As Integer + Undefined = 0 + [Picture] = 1 + [Video] = 2 + [Text] = 3 + VideoPre = 10 + GIF = 50 + m3u8 = 100 + End Enum + Friend Enum States : Unknown : Tried : Downloaded : Skipped : End Enum + Friend Type As Types + Friend URL_BASE As String + Friend URL As String + Friend MD5 As String + Friend [File] As SFile + Friend Post As UserPost + Friend PictureOption As String + Friend State As States + Friend Sub New(ByVal _URL As String) + URL = _URL + URL_BASE = _URL + File = URL + Type = Types.Undefined + End Sub + Friend Sub New(ByVal _URL As String, ByVal _Type As Types) + Me.New(_URL) + Type = _Type + End Sub + Public Shared Widening Operator CType(ByVal _URL As String) As UserMedia + Return New UserMedia(_URL) + End Operator + Public Shared Widening Operator CType(ByVal m As UserMedia) As String + Return m.URL + End Operator + Public Overrides Function ToString() As String + Return URL + End Function + Friend Overloads Function Equals(ByVal Other As UserMedia) As Boolean Implements IEquatable(Of UserMedia).Equals + Return URL = Other.URL + End Function + Public Overrides Function Equals(ByVal Obj As Object) As Boolean + Return Equals(CType(Obj, UserMedia)) + End Function + End Structure + Friend Structure UserPost : Implements IEquatable(Of UserPost), IComparable(Of UserPost) + ''' Post ID + Friend ID As String + Friend [Date] As Date? +#Region "Channel compatible fields" + Friend UserID As String + Friend CachedFile As SFile +#End Region + Friend Function GetImage(ByVal s As Size, ByVal e As ErrorsDescriber, ByVal NullArg As Image) As Image + If Not CachedFile.IsEmptyString Then + Return If(PersonalUtilities.Tools.ImageRenderer.GetImage(SFile.GetBytes(CachedFile), s, e), NullArg.Clone) + Else + Return NullArg.Clone + End If + End Function +#Region "IEquatable, IComparable Support" + Friend Overloads Function Equals(ByVal Other As UserPost) As Boolean Implements IEquatable(Of UserPost).Equals + Return ID = Other.ID + End Function + Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean + Return Equals(DirectCast(Obj, UserPost)) + End Function + Friend Function CompareTo(ByVal Other As UserPost) As Integer Implements IComparable(Of UserPost).CompareTo + Return GetCompareValue(Me).CompareTo(GetCompareValue(Other)) + End Function +#End Region + Private Function GetCompareValue(ByVal Post As UserPost) As Long + Dim v& = 0 + If Post.Date.HasValue Then v = Post.Date.Value.Ticks * -1 + Return v + End Function + End Structure + End Module +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Base/UserDataBase.vb b/SCrawler/API/Base/UserDataBase.vb new file mode 100644 index 0000000..84e3e26 --- /dev/null +++ b/SCrawler/API/Base/UserDataBase.vb @@ -0,0 +1,961 @@ +Imports PersonalUtilities.Functions.XML +Imports System.IO +Imports System.Threading +Imports UState = SCrawler.API.Base.UserMedia.States +Namespace API.Base + Friend MustInherit Class UserDataBase : Implements IUserData + Friend Const UserFileAppender As String = "User" + Friend Event OnPictureUpdated As IUserData.OnPictureUpdatedEventHandler Implements IUserData.OnPictureUpdated + Protected Sub Raise_OnPictureUpdated() + RaiseEvent OnPictureUpdated(Me) + End Sub +#Region "Collection buttons" + Friend WithEvents BTT_CONTEXT_DOWN As ToolStripMenuItem + Friend WithEvents BTT_CONTEXT_EDIT As ToolStripMenuItem + Friend WithEvents BTT_CONTEXT_DELETE As ToolStripMenuItem + Friend WithEvents BTT_CONTEXT_OPEN_PATH As ToolStripMenuItem + Friend WithEvents BTT_CONTEXT_OPEN_SITE As ToolStripMenuItem + Friend Sub CreateButtons(ByVal CollectionIndex As Integer) + Dim tn$ = $"[{Site}] - {Name}" + Dim _tn$ = $"{Site}{Name}" + Dim tnn As Func(Of String, String) = Function(Input) $"{Input}{_tn}" + Dim i As Image = Nothing + Select Case Site + Case Sites.Reddit : i = My.Resources.RedditIcon.ToBitmap + Case Sites.Twitter : i = My.Resources.TwitterIcon.ToBitmap + End Select + BTT_CONTEXT_DOWN = New ToolStripMenuItem(tn, i) With {.Name = tnn("DOWN"), .Tag = CollectionIndex} + BTT_CONTEXT_EDIT = New ToolStripMenuItem(tn, i) With {.Name = tnn("EDIT"), .Tag = CollectionIndex} + BTT_CONTEXT_DELETE = New ToolStripMenuItem(tn, i) With {.Name = tnn("DELETE"), .Tag = CollectionIndex} + BTT_CONTEXT_OPEN_PATH = New ToolStripMenuItem(tn, i) With {.Name = tnn("PATH"), .Tag = CollectionIndex} + BTT_CONTEXT_OPEN_SITE = New ToolStripMenuItem(tn, i) With {.Name = tnn("SITE"), .Tag = CollectionIndex} + End Sub +#End Region +#Region "XML Declarations" + Private Const Name_Site As String = "Site" + Private Const Name_UserName As String = "UserName" + Private Const Name_FriendlyName As String = "FriendlyName" + Private Const Name_UserID As String = "UserID" + Private Const Name_Description As String = "Description" + Private Const Name_ParseUserMediaOnly As String = "ParseUserMediaOnly" + Private Const Name_Temporary As String = "Temporary" + Private Const Name_Favorite As String = "Favorite" + + Private Const Name_SeparateVideoFolder As String = "SeparateVideoFolder" + Private Const Name_CollectionName As String = "Collection" + Private Const Name_LabelsName As String = "Labels" + + Private Const Name_ReadyForDownload As String = "ReadyForDownload" + + Private Const Name_VideoCount As String = "VideoCount" + Private Const Name_PicturesCount As String = "PicturesCount" + Private Const Name_LastUpdated As String = "LastUpdated" + + Private Const Name_DataMerging As String = "DataMerging" +#Region "Downloaded data" + Private Const Name_MediaType As String = "Type" + Private Const Name_MediaURL As String = "URL" + Private Const Name_MediaHash As String = "Hash" + Private Const Name_MediaFile As String = "File" + Private Const Name_MediaPostID As String = "ID" + Private Const Name_MediaPostDate As String = "Date" +#End Region +#End Region +#Region "Declarations" + Friend MustOverride Property Site As Sites Implements IContentProvider.Site + Friend User As UserInfo + Friend Overridable Property Name As String Implements IContentProvider.Name + Get + Return User.Name + End Get + Set(ByVal NewName As String) + User.Name = NewName + User.UpdateUserFile() + Settings.UpdateUsersList(User) + End Set + End Property + Friend Overridable Property ID As String = String.Empty Implements IContentProvider.ID + Friend Overridable Property FriendlyName As String = String.Empty Implements IContentProvider.FriendlyName + Friend Property UserDescription As String = String.Empty Implements IContentProvider.Description + Friend Property ParseUserMediaOnly As Boolean = False Implements IUserData.ParseUserMediaOnly + Protected _Favorite As Boolean = False + Friend Overridable Property Favorite As Boolean Implements IContentProvider.Favorite + Get + Return _Favorite + End Get + Set(ByVal Fav As Boolean) + _Favorite = Fav + If _Favorite Then _Temporary = False + End Set + End Property + Protected _Temporary As Boolean = False + Friend Overridable Property Temporary As Boolean Implements IContentProvider.Temporary + Get + Return _Temporary + End Get + Set(ByVal Temp As Boolean) + _Temporary = Temp + If _Temporary Then _Favorite = False + End Set + End Property + Friend Overridable ReadOnly Property IsChannel As Boolean Implements IUserData.IsChannel + Get + Return User.IsChannel + End Get + End Property + Friend ReadOnly Property Self As IUserData Implements IUserData.Self + Get + Return Me + End Get + End Property +#Region "Images" + Friend Overridable Function GetUserPicture() As Image Implements IUserData.GetPicture + If Settings.ViewModeIsPicture Then + Return GetPicture() + Else + Return Nothing + End If + End Function + Friend Overridable Sub SetPicture(ByVal f As SFile) Implements IUserData.SetPicture + Try + If Not f.IsEmptyString AndAlso f.Exists Then + Using p As New UserImage(f, User.File) : p.Save() : End Using + End If + Catch ex As Exception + End Try + End Sub + Protected Function GetNullPicture(ByVal MaxHeigh As XML.Base.XMLValue(Of Integer)) As Bitmap + Return New Bitmap(CInt(DivideWithZeroChecking(MaxHeigh.Value, 100) * 75), MaxHeigh.Value) + End Function + Private Function GetPicture(Optional ByVal ReturnNullImageOnNothing As Boolean = True) As Image + Dim f As SFile = Nothing + Dim p As UserImage = Nothing + Dim DelPath As Boolean = True +BlockPictureFolder: + On Error GoTo BlockPictureScan + f = SFile.GetPath($"{MyFile.PathWithSeparator}Pictures") + If f.Exists(SFO.Path, False) Then + Dim PicList As List(Of SFile) = SFile.GetFiles(f, $"{UserImage.ImagePrefix}*.jpg") + If PicList.ListExists Then + PicList.Sort() + Dim l As SFile, s As SFile + l = PicList.Find(Function(ff) ff.Name.Contains(UserImage.ImagePostfix_Large)) + If Not l.IsEmptyString Then PicList.Remove(l) + s = PicList.Find(Function(ff) ff.Name.Contains(UserImage.ImagePostfix_Small)) + If Not s.IsEmptyString Then PicList.Remove(s) + If PicList.Count > 0 Then + p = New UserImage(PicList.First, l, s, MyFile) + GoTo BlockReturn + Else + f.Delete(SFO.Path, False, False, EDP.None) + DelPath = False + End If + End If + End If +BlockPictureScan: + On Error GoTo BlockDeletePictureFolder + Dim NewPicFile As SFile = SFile.GetFiles(MyFile.CutPath, "*.jpg|*.png",, + New ErrorsDescriber(EDP.ReturnValue) With { + .ReturnValue = New List(Of SFile), + .ReturnValueExists = True}).FirstOrDefault + If Not NewPicFile.IsEmptyString AndAlso NewPicFile.Exists Then + p = New UserImage(NewPicFile, MyFile) + p.Save() + GoTo BlockReturn + End If +BlockDeletePictureFolder: + On Error GoTo BlockReturn + If DelPath Then + f = SFile.GetPath($"{MyFile.PathWithSeparator}Pictures") + If f.Exists(SFO.Path, False) Then f.Delete(SFO.Path, False, False) + End If +BlockReturn: + On Error GoTo BlockNullPicture + If Not p Is Nothing Then + Dim i As Image = Nothing + Select Case Settings.ViewMode.Value + Case View.LargeIcon : i = p.Large.OriginalImage.Clone + Case View.SmallIcon : i = p.Small.OriginalImage.Clone + End Select + p.Dispose() + Return i + End If +BlockNullPicture: + If ReturnNullImageOnNothing Then + Select Case Settings.ViewMode.Value + Case View.LargeIcon : Return GetNullPicture(Settings.MaxLargeImageHeigh) + Case View.SmallIcon : Return GetNullPicture(Settings.MaxSmallImageHeigh) + End Select + End If + Return Nothing + End Function +#End Region +#Region "Separate folder" + Friend Property SeparateVideoFolder As Boolean? + Protected ReadOnly Property SeparateVideoFolderF As Boolean + Get + Return (SeparateVideoFolder.HasValue AndAlso SeparateVideoFolder.Value) OrElse Settings.SeparateVideoFolder.Value + End Get + End Property +#End Region +#Region "Collections support" + Protected _IsCollection As Boolean = False + Protected Friend ReadOnly Property IsCollection As Boolean Implements IUserData.IsCollection + Get + Return _IsCollection + End Get + End Property + Friend Overridable Property CollectionName As String Implements IUserData.CollectionName + Get + Return User.CollectionName + End Get + Set(ByVal NewCollection As String) + ChangeCollectionName(NewCollection, True) + End Set + End Property + Friend ReadOnly Property IncludedInCollection As Boolean Implements IUserData.IncludedInCollection + Get + Return User.IncludedInCollection + End Get + End Property + Friend Overridable Sub ChangeCollectionName(ByVal NewName As String, ByVal UpdateSettings As Boolean) + Dim u As UserInfo = User + u.CollectionName = NewName + u.IncludedInCollection = Not NewName.IsEmptyString + User = u + If UpdateSettings Then Settings.UpdateUsersList(User) + End Sub + Friend Overridable ReadOnly Property Labels As List(Of String) Implements IUserData.Labels +#End Region +#Region "Downloading params" + Protected _DataLoaded As Boolean = False + Protected _DataParsed As Boolean = False + Friend Property ReadyForDownload As Boolean = True Implements IUserData.ReadyForDownload +#End Region +#Region "Content" + Protected ReadOnly _ContentList As List(Of UserMedia) + Protected ReadOnly _ContentNew As List(Of UserMedia) + Protected ReadOnly _ContentForReparse As List(Of UserMedia) + Protected ReadOnly _TempMediaList As List(Of UserMedia) + Protected ReadOnly _TempPostsList As List(Of String) +#End Region +#Region "Files" + Friend Overridable Property MyFile As SFile Implements IUserData.File + Get + Return User.File + End Get + Set(ByVal f As SFile) + User.File = f + Settings.UpdateUsersList(User) + End Set + End Property + Protected MyFileData As SFile + Protected MyFileDataR As SFile + Protected MyFileDataRV As SFile + Protected MyFilePosts As SFile + Friend Overridable Property FileExists As Boolean = False Implements IUserData.FileExists + Friend Overridable Property DataMerging As Boolean + Get + Return User.Merged + End Get + Set(ByVal IsMerged As Boolean) + If Not User.Merged = IsMerged Then + User.Merged = IsMerged + User.UpdateUserFile() + Settings.UpdateUsersList(User) + End If + End Set + End Property +#End Region +#Region "Information" + Protected _CountVideo As Integer = 0 + Protected _CountPictures As Integer = 0 + Friend Overridable Property LastUpdated As Date? + Friend ReadOnly Property TotalContentCount As Integer + Get + Return _CountVideo + _CountPictures + End Get + End Property + Friend Overridable Property HasError As Boolean = False Implements IUserData.HasError + Private _DownloadedPicturesTotal As Integer = 0 + Private _DownloadedPicturesSession As Integer = 0 + Friend Property DownloadedPictures As Integer Implements IUserData.DownloadedPictures + Get + Return _DownloadedPicturesSession + End Get + Set(ByVal NewValue As Integer) + _DownloadedPicturesSession = NewValue + End Set + End Property + Private _DownloadedVideosTotal As Integer = 0 + Private _DownloadedVideosSession As Integer = 0 + Friend Property DownloadedVideos As Integer Implements IUserData.DownloadedVideos + Get + Return _DownloadedVideosSession + End Get + Set(ByVal NewValue As Integer) + _DownloadedVideosSession = NewValue + End Set + End Property + Friend Overridable ReadOnly Property DownloadedTotal(Optional ByVal Total As Boolean = True) As Integer Implements IUserData.DownloadedTotal + Get + If Total Then + Return _DownloadedPicturesTotal + _DownloadedVideosTotal + Else + Return _DownloadedPicturesSession + _DownloadedVideosSession + End If + End Get + End Property + Friend ReadOnly Property DownloadedInformation As String Implements IUserData.DownloadedInformation + Get + Dim luv$ = String.Empty + If LastUpdated.HasValue Then luv = $"{LastUpdated.Value.ToStringDate(ADateTime.Formats.BaseDateTime)}: " + Return $"{luv}{Name} [{Site}]{IIf(HasError, " (with errors)", String.Empty)}: P - {_DownloadedPicturesTotal}; V - {_DownloadedVideosTotal}" & + $" (P - {_CountPictures}; V - {_CountVideo})" + End Get + End Property +#End Region + Protected ReadOnly LNC As New ListAddParams(LAP.NotContainsOnly) +#End Region +#Region "LVI" + Friend ReadOnly Property LVIKey As String Implements IUserData.LVIKey + Get + If Not _IsCollection Then + Return $"{IIf(Site = Sites.Reddit, "R", "T")}_{Name}" + Else + Return $"CCCC_{CollectionName}" + End If + End Get + End Property + Private _LVIIndex As Integer = -1 + Private ReadOnly Property LVIIndex As Integer Implements IUserData.LVIIndex + Get + Return _LVIIndex + End Get + End Property + Friend Function GetLVI(ByVal Destination As ListView) As ListViewItem Implements IUserData.GetLVI + _LVIIndex = Destination.Items.Count + If Settings.ViewModeIsPicture Then + Return New ListViewItem(ToString(), LVIKey, GetLVIGroup(Destination)) With {.Name = LVIKey, .Tag = LVIKey} + Else + Return New ListViewItem(ToString(), GetLVIGroup(Destination)) With {.Name = LVIKey, .Tag = LVIKey} + End If + End Function + Friend Overridable ReadOnly Property FitToAddParams As Boolean Implements IUserData.FitToAddParams + Get + Select Case Settings.ShowingMode.Value + Case ShowingModes.Regular : Return Not Temporary And Not Favorite + Case ShowingModes.Temporary : Return Temporary + Case ShowingModes.Favorite : Return Favorite + Case ShowingModes.Labels : Return Settings.Labels.CurrentSelection.ListContains(Labels) + Case ShowingModes.NoLabels : Return Labels.Count = 0 + Case Else : Return True + End Select + End Get + End Property + Friend Function GetLVIGroup(ByVal Destination As ListView) As ListViewGroup Implements IUserData.GetLVIGroup + Try + If Settings.ShowingMode.Value = ShowingModes.Labels Then + If Labels.Count > 0 And Settings.Labels.CurrentSelection.Count > 0 Then + For i% = 0 To Labels.Count - 1 + If Settings.Labels.CurrentSelection.Contains(Labels(i)) Then Return Destination.Groups.Item(Labels(i)) + Next + Return Destination.Groups.Item(LabelsKeeper.NoLabeledName) + Else + Return Destination.Groups.Item(LabelsKeeper.NoLabeledName) + End If + Else + Return Destination.Groups.Item(GetLviGroupName(Site, Temporary, Favorite, IsCollection)) + End If + Catch ex As Exception + Return Destination.Groups.Item(LabelsKeeper.NoLabeledName) + End Try + End Function + Friend Overridable Function GetUserInformation() As String + Dim OutStr$ = $"User: {Name}" + OutStr.StringAppendLine($"Path: {MyFile.CutPath.Path}") + OutStr.StringAppendLine($"Total downloaded ({TotalContentCount.NumToString(ANumbers.Formats.Number, 3)}):") + OutStr.StringAppendLine($"Pictures: {_CountPictures.NumToString(ANumbers.Formats.Number, 3)}") + OutStr.StringAppendLine($"Videos: {_CountVideo.NumToString(ANumbers.Formats.Number, 3)}") + If Not UserDescription.IsEmptyString Then + OutStr.StringAppendLine(String.Empty) + OutStr.StringAppendLine(UserDescription) + End If + OutStr.StringAppendLine(String.Empty) + OutStr.StringAppendLine($"Last updated at: {AConvert(Of String)(LastUpdated, ADateTime.Formats.BaseDateTime, "not yet")}") + If _DataParsed Then + OutStr.StringAppendLine("Downloaded now:") + OutStr.StringAppendLine($"Pictures: {_CountPictures.NumToString(ANumbers.Formats.Number, 3)}") + OutStr.StringAppendLine($"Videos: {_CountVideo.NumToString(ANumbers.Formats.Number, 3)}") + End If + Return OutStr + End Function +#End Region +#Region "Initializer" + Private ReadOnly _InvokeImageHandler As Boolean + ''' By using this constructor you must set UserName and MyFile manually + Friend Sub New(Optional ByVal InvokeImageHandler As Boolean = True) + _InvokeImageHandler = InvokeImageHandler + _ContentList = New List(Of UserMedia) + _ContentNew = New List(Of UserMedia) + _ContentForReparse = New List(Of UserMedia) + _TempMediaList = New List(Of UserMedia) + _TempPostsList = New List(Of String) + Labels = New List(Of String) + If InvokeImageHandler Then ImageHandler(Me) + End Sub + ''' + Friend Overloads Shared Function GetInstance(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True) As IUserData + Select Case u.Site + Case Sites.Reddit : Return New Reddit.UserData(u, _LoadUserInformation) + Case Sites.Twitter : Return New Twitter.UserData(u, _LoadUserInformation) + Case Else : Throw New ArgumentOutOfRangeException("Site", $"Site [{u.Site}] information does not recognized by loader") + End Select + End Function +#End Region +#Region "Information & Content data files loader and saver" +#Region "User information" + Friend Overridable Sub LoadUserInformation() Implements IUserData.LoadUserInformation + Try + If MyFile.Exists Then + FileExists = True + Using x As New XmlFile(MyFile) With {.XmlReadOnly = True} + x.DefaultsLoading(False) + User.Site = Site + Site = x.Value(Name_Site).FromXML(Of Integer)(0) + User.Name = x.Value(Name_UserName) + ID = x.Value(Name_UserID) + FriendlyName = x.Value(Name_FriendlyName) + UserDescription = x.Value(Name_Description) + ParseUserMediaOnly = x.Value(Name_ParseUserMediaOnly).FromXML(Of Boolean)(False) + Temporary = x.Value(Name_Temporary).FromXML(Of Boolean)(False) + Favorite = x.Value(Name_Favorite).FromXML(Of Boolean)(False) + SeparateVideoFolder = AConvert(Of Boolean)(x.Value(Name_SeparateVideoFolder), Nothing) + ReadyForDownload = x.Value(Name_ReadyForDownload).FromXML(Of Boolean)(True) + _CountVideo = x.Value(Name_VideoCount).FromXML(Of Integer)(0) + _CountPictures = x.Value(Name_PicturesCount).FromXML(Of Integer)(0) + LastUpdated = AConvert(Of Date)(x.Value(Name_LastUpdated), ADateTime.Formats.BaseDateTime, Nothing) + DataMerging = x.Value(Name_DataMerging).FromXML(Of Boolean)(False) + ChangeCollectionName(x.Value(Name_CollectionName), False) + Labels.ListAddList(x.Value(Name_LabelsName).StringToList(Of String, List(Of String))("|", EDP.ReturnValue), LAP.NotContainsOnly, LAP.ClearBeforeAdd) + End Using + UpdateDataFiles() + _DataForReparseExists = MyFileDataR.Exists + End If + Catch ex As Exception + LogError(ex, "user information loading error") + End Try + End Sub + Friend Overridable Sub UpdateUserInformation() Implements IUserData.UpdateUserInformation + Try + MyFile.Exists(SFO.Path) + Using x As New XmlFile With {.Name = "User"} + x.Add(Name_Site, CInt(Site)) + x.Add(Name_UserName, User.Name) + x.Add(Name_UserID, ID) + x.Add(Name_FriendlyName, FriendlyName) + x.Add(Name_Description, UserDescription) + x.Add(Name_ParseUserMediaOnly, ParseUserMediaOnly.BoolToInteger) + x.Add(Name_Temporary, Temporary.BoolToInteger) + x.Add(Name_Favorite, Favorite.BoolToInteger) + If SeparateVideoFolder.HasValue Then + x.Add(Name_SeparateVideoFolder, SeparateVideoFolder.Value.BoolToInteger) + Else + x.Add(Name_SeparateVideoFolder, String.Empty) + End If + x.Add(Name_ReadyForDownload, ReadyForDownload.BoolToInteger) + x.Add(Name_VideoCount, _CountVideo) + x.Add(Name_PicturesCount, _CountPictures) + x.Add(Name_LastUpdated, AConvert(Of String)(LastUpdated, ADateTime.Formats.BaseDateTime, String.Empty)) + x.Add(Name_CollectionName, CollectionName) + x.Add(Name_LabelsName, Labels.ListToString(, "|", EDP.ReturnValue)) + x.Add(Name_DataMerging, DataMerging.BoolToInteger) + + x.Save(MyFile) + End Using + Settings.UpdateUsersList(User) + Catch ex As Exception + LogError(ex, "user information saving error") + End Try + End Sub +#End Region +#Region "User data" + Friend Overridable Overloads Sub LoadContentInformation() + UpdateDataFiles() + LoadContentInformation(_ContentList, MyFileData) + LoadContentInformation(_ContentForReparse, MyFileDataR) + LoadContentInformation(_TempMediaList, MyFileDataRV) + _DataForReparseExists = False + End Sub + Private Overloads Sub LoadContentInformation(ByRef _CLIST As List(Of UserMedia), ByVal f As SFile) + Try + If Not f.Exists Then Exit Sub + Using x As New XmlFile(f, ProtectionLevels.All, False) With {.XmlReadOnly = True, .AllowSameNames = True} + x.LoadData() + x.DefaultsLoading(False) + If x.Count > 0 Then + Dim fs$ = MyFile.CutPath.PathWithSeparator + Dim gfn As Func(Of String, String) = Function(ByVal Input As String) As String + If Input.IsEmptyString Then + Return String.Empty + Else + If Input.Contains("\") Then + Return New SFile(Input).File + Else + Return Input + End If + End If + End Function + For Each v As EContainer In x + _CLIST.Add(New UserMedia With { + .Type = AConvert(Of Integer)(v.Attribute(Name_MediaType).Value, 0), + .URL = v.Attribute(Name_MediaURL).Value, + .URL_BASE = v.Value, + .MD5 = v.Attribute(Name_MediaHash).Value, + .File = fs & gfn.Invoke(v.Attribute(Name_MediaFile).Value), + .Post = New UserPost With { + .ID = v.Attribute(Name_MediaPostID).Value, + .[Date] = AConvert(Of Date)(v.Attribute(Name_MediaPostDate).Value, ParsersDataDateProvider, Nothing)} + }) + Next + End If + _DataLoaded = True + End Using + Catch ex As Exception + LogError(ex, "history loading error") + End Try + End Sub + Friend Sub UpdateContentInformation(ByRef _CLIST As List(Of UserMedia), ByVal f As SFile) + Try + UpdateDataFiles() + If f.IsEmptyString Then Exit Sub + f.Exists(SFO.Path) + Using x As New XmlFile With {.AllowSameNames = True, .Name = "Data"} + If _CLIST.Count > 0 Then + For Each i As UserMedia In _CLIST + x.Add(New EContainer("MediaData", i.URL_BASE, + {New EAttribute(Name_MediaType, CInt(i.Type)), + New EAttribute(Name_MediaURL, i.URL), + New EAttribute(Name_MediaHash, i.MD5), + New EAttribute(Name_MediaFile, i.File.File), + New EAttribute(Name_MediaPostID, i.Post.ID), + New EAttribute(Name_MediaPostDate, AConvert(Of String)(i.Post.Date, ParsersDataDateProvider, String.Empty)) + })) + Next + End If + x.Save(MyFileData) + End Using + Catch ex As Exception + LogError(ex, "history saving error") + End Try + End Sub +#End Region +#End Region +#Region "Open site, folder" + Friend Overridable Sub OpenSite() Implements IContentProvider.OpenSite + Try + Dim URL$ = String.Empty + Select Case Site + Case Sites.Reddit : URL = $"https://www.reddit.com/user/{Name}/" + Case Sites.Twitter : URL = $"https://twitter.com/{Name}" + Case Else : MsgBoxE($"Site [{Site}] opening does not implemented", MsgBoxStyle.Exclamation) + End Select + If Not URL.IsEmptyString Then Process.Start(URL) + Catch ex As Exception + MsgBoxE($"Error on trying to open [{Site}] page of user [{Name}]", MsgBoxStyle.Critical) + End Try + End Sub + Friend Overridable Sub OpenFolder() Implements IUserData.OpenFolder + MyFile.CutPath.Open(SFO.Path, EDP.None) + End Sub +#End Region +#Region "Download functions and options" + Friend Overridable Property DownloadReparseOnly As Boolean = False Implements IUserData.DownloadReparseOnly + Private _DataForReparseExists As Boolean = False + Friend Overridable ReadOnly Property DataForReparseExists As Boolean Implements IUserData.DataForReparseExists + Get + Return _ContentForReparse.Count > 0 Or _DataForReparseExists + End Get + End Property + Friend Overridable Sub DownloadData(ByVal Token As CancellationToken) Implements IContentProvider.DownloadData + Dim Canceled As Boolean = False + Try + UpdateDataFiles() + Dim UpPic As Boolean = Settings.ViewModeIsPicture AndAlso GetPicture(False) Is Nothing + _DownloadedPicturesSession = 0 + _DownloadedVideosSession = 0 + _TempMediaList.Clear() + _TempPostsList.Clear() + + If Not _DataLoaded Then LoadContentInformation() + + If Not DownloadReparseOnly Then + If MyFilePosts.Exists Then _TempPostsList.ListAddList(File.ReadAllLines(MyFilePosts)) + If _ContentList.Count > 0 Then _TempPostsList.ListAddList(_ContentList.Select(Function(u) u.Post.ID), LNC) + Token.ThrowIfCancellationRequested() + DownloadDataF(Token) + Token.ThrowIfCancellationRequested() + End If + + ReparseVideo(Token) + If Token.IsCancellationRequested Then + If Not DownloadReparseOnly Then + If _TempMediaList.Count > 0 AndAlso _TempMediaList.Exists(Function(c) c.Type = UserMedia.Types.VideoPre) Then + TextSaver.SaveTextToFile((From c As UserMedia In _TempMediaList + Where c.Type = UserMedia.Types.VideoPre + Select c.URL).ListToString(, Environment.NewLine), MyFileDataRV, True,, EDP.SendInLog) + Else + If MyFileDataRV.Exists Then MyFileDataRV.Delete(,,, EDP.SendInLog) + End If + End If + Else + If Not DownloadReparseOnly And _TempPostsList.Count > 0 Then TextSaver.SaveTextToFile(_TempPostsList.ListToString(, Environment.NewLine), MyFilePosts, True,, EDP.None) + _ContentNew.ListAddList(_TempMediaList, LAP.ClearBeforeAdd) + End If + + Dim r% = 0 + Do While r <= 2 And (_ContentNew.Count > 0 Or _ContentForReparse.Count > 0) And Not Token.IsCancellationRequested + DownloadContent(Token) + If _ContentNew.Count > 0 Then + _ContentForReparse.ListAddList(_ContentNew.Where(Function(c) c.State = UState.Tried Or c.State = UState.Unknown), LNC) + _ContentList.ListAddList(_ContentNew.Where(Function(c) c.State = UState.Downloaded), LNC) + End If + If _ContentForReparse.Count > 0 Then _ContentForReparse.RemoveAll(Function(c) _ContentList.Contains(c)) + _ContentNew.Clear() + If _ContentForReparse.Count > 0 Then _ContentNew.ListAddList(_ContentForReparse, LNC) + r += 1 + Loop + + _CountPictures = _ContentList.LongCount(Function(c) c.Type = UserMedia.Types.Picture) + _CountVideo = _ContentList.LongCount(Function(c) c.Type = UserMedia.Types.Video) + If DownloadedPictures + DownloadedVideos > 0 Then + LastUpdated = Now + If Labels.Contains(LabelsKeeper.NoParsedUser) Then Labels.Remove(LabelsKeeper.NoParsedUser) + UpdateContentInformation(_ContentList, MyFileData) + UpdateUserInformation() + End If + If _ContentForReparse.Count > 0 Then UpdateContentInformation(_ContentForReparse, MyFileDataR) + _DownloadedPicturesTotal += _DownloadedPicturesSession + _DownloadedVideosTotal += _DownloadedVideosSession + If UpPic Then Raise_OnPictureUpdated() + Catch oex As OperationCanceledException When Token.IsCancellationRequested + MyMainLOG = $"{Site} - {Name}: downloading canceled" + Canceled = True + Catch ex As Exception + LogError(ex, "downloading data error") + HasError = True + Finally + If Not Canceled Then _DataParsed = True ': LastUpdated = Now + _ContentNew.Clear() + DownloadReparseOnly = False + If _ContentForReparse.Count = 0 And MyFileDataR.Exists Then MyFileDataR.Delete(,,, EDP.SendInLog) + End Try + End Sub + Private Sub UpdateDataFiles() + If Not User.File.IsEmptyString Then + MyFileData = User.File + MyFileData.Name &= "_Data" + MyFileDataR = MyFileData + MyFileDataR.Name &= "_REPARSE" + MyFileDataRV = MyFileData + MyFileDataRV.Name &= "_RVideo" + MyFilePosts = User.File + MyFilePosts.Name &= "_Posts" + MyFilePosts.Extension = "txt" + Else + Throw New ArgumentNullException("User.File", "User file does not detected") + End If + End Sub + Protected MustOverride Sub DownloadDataF(ByVal Token As CancellationToken) + Protected MustOverride Sub ReparseVideo(ByVal Token As CancellationToken) + Protected MustOverride Sub DownloadContent(ByVal Token As CancellationToken) +#End Region +#Region "Delete, Move, Merge" + Friend Overridable Function Delete() As Integer Implements IUserData.Delete + Dim f As SFile = SFile.GetPath(MyFile.CutPath.Path) + If f.Exists(SFO.Path, False) AndAlso f.Delete(SFO.Path, False, False) Then + ImageHandler(Me, False) + Settings.UsersList.Remove(User) + Settings.UpdateUsersList() + Settings.Users.Remove(Me) + Downloader.UserRemove(Me) + Dispose(True) + Return 1 + Else + Return 0 + End If + End Function + Friend Overridable Function MoveFiles(ByVal __CollectionName As String, ByVal _MergeData As Boolean) As Boolean Implements IUserData.MoveFiles + Dim UserBefore As UserInfo = User + Try + Dim f As SFile + Dim Removed As Boolean + If IncludedInCollection Then + Settings.Users.Add(Me) + Removed = False + User.CollectionName = String.Empty + User.IncludedInCollection = False + Else + Settings.Users.Remove(Me) + Removed = True + User.CollectionName = __CollectionName + User.IncludedInCollection = True + End If + User.UpdateUserFile() + f = User.File.CutPath(, EDP.ThrowException) + If f.Exists(SFO.Path, False) Then + If If(SFile.GetFiles(f,, SearchOption.AllDirectories), New List(Of SFile)).Count > 0 AndAlso + MsgBoxE({$"Destination directory [{f.Path}] already exists and contains files!" & vbCr & + "By continuing, this directory and all files will be deleted", + "Destination directory is not empty!"}, MsgBoxStyle.Exclamation,,, {"Delete", "Cancel"}) = 1 Then + MsgBoxE("Operation canceled", MsgBoxStyle.Exclamation) + User = UserBefore + If Removed Then Settings.Users.Add(Me) Else Settings.Users.Remove(Me) + Return False + End If + f.Delete(SFO.Path, False, False, EDP.ThrowException) + End If + f.CutPath.Exists(SFO.Path) + Directory.Move(UserBefore.File.CutPath(, EDP.ThrowException).Path, f.Path) + Settings.UsersList.Remove(UserBefore) + Settings.UpdateUsersList(User) + UpdateUserInformation() + Return True + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Files moving error") + User = UserBefore + Return False + End Try + End Function + Friend Overloads Sub MergeData() + Dim UserBefore As UserInfo = User + Try + If DataMerging Then + Throw New InvalidOperationException($"{Site} - {Name}: data already merged") With {.HelpLink = 1} + Else + Dim files As List(Of SFile) = Nothing + Dim allFiles As List(Of SFile) = Nothing + Dim fSource As SFile, fDest As SFile + Dim ReplacingPath$ = UserBefore.File.CutPath.Path + Dim dirs As List(Of SFile) = SFile.GetDirectories(UserBefore.File.CutPath,, SearchOption.AllDirectories) + Dim FilesMover As Action = Sub() + If files.ListExists Then + For Each fSource In files + fDest = fSource + fDest.Path = User.File.CutPath.PathWithSeparator & fSource.Path.Replace(ReplacingPath, String.Empty) + fDest.Exists(SFO.Path,, EDP.ThrowException) + fDest = CheckFile(fDest, allFiles) + File.Move(fSource, fDest) + Next + files.Clear() + End If + End Sub + DataMerging = True + If dirs.ListExists Then + For Each dir As SFile In dirs + allFiles = SFile.GetFiles(SFile.GetPath(User.File.CutPath.PathWithSeparator & + dir.Path.Replace(ReplacingPath, String.Empty)),,, EDP.ReturnValue) + files = SFile.GetFiles(dir,,, EDP.ReturnValue) + FilesMover.Invoke + Next + End If + allFiles = SFile.GetFiles(User.File.CutPath,,, EDP.ReturnValue) + + files = SFile.GetFiles(UserBefore.File.CutPath,,, EDP.ReturnValue) + FilesMover.Invoke + If SFile.GetFiles(UserBefore.File.CutPath,, SearchOption.AllDirectories, + New ErrorsDescriber(False, False, False, New List(Of SFile))).Count = 0 Then + UserBefore.File.CutPath.Delete(SFO.Path, False, False, EDP.SendInLog) + End If + UpdateUserInformation() + End If + Catch ex As Exception + LogError(ex, "[UserDataBase.MergeData]") + End Try + End Sub + Private Function CheckFile(ByVal f As SFile, ByRef List As IEnumerable(Of SFile)) As SFile + If List.ListExists Then + Dim p As New RegexStructure(".+?\s{0,1}\((\d+)\)|.+",,,,,,, String.Empty, EDP.ReturnValue) + Dim i% = List.Where(Function(ff) CStr(RegexReplace(ff.Name, p)).Trim.ToLower = f.Name.Trim.ToLower).Count + If i > 0 Then f.Name &= $" ({i + 1})" + End If + Return f + End Function +#End Region +#Region "Errors functions" + Protected Sub LogError(ByVal ex As Exception, ByVal Message As String) + ErrorsDescriber.Execute(EDP.SendInLog, ex, $"{IIf(IncludedInCollection, $"{CollectionName}-", String.Empty)}{Site} - {Name}: {Message}") + End Sub + Protected Sub ErrorDownloading(ByVal f As SFile, ByVal URL As String) + If Not f.Exists Then MyMainLOG = $"Error downloading from [{URL}] to [{f}]" + End Sub +#End Region + Public Overrides Function ToString() As String + If Settings.ViewModeIsPicture Then + If IsCollection Then + Return CollectionName + Else + Return IIf(FriendlyName.IsEmptyString, Name, FriendlyName) + End If + Else + Dim t$ = String.Empty + If Temporary Then + t = " (T)" + ElseIf Favorite Then + t = " (F)" + End If + If IsCollection Then + Return $"Collection [{CollectionName}]{t}" + Else + Return $"[{Site}]{t} {IIf(FriendlyName.IsEmptyString, Name, FriendlyName)}" + End If + End If + End Function +#Region "Buttons actions" + Private Sub BTT_CONTEXT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DOWN.Click + Downloader.Add(Me) + End Sub + Private Sub BTT_CONTEXT_EDIT_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_EDIT.Click + Using f As New Editors.UserCreatorForm(Me) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then UpdateUserInformation() + End Using + End Sub + Private Sub BTT_CONTEXT_DELETE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DELETE.Click + End Sub + Private Sub BTT_CONTEXT_OPEN_PATH_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_PATH.Click + OpenFolder() + End Sub + Private Sub BTT_CONTEXT_OPEN_SITE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_SITE.Click + OpenSite() + End Sub +#End Region +#Region "IComparable Support" + Friend Overridable Function CompareTo(ByVal Other As UserDataBase) As Integer Implements IComparable(Of UserDataBase).CompareTo + Dim x% = CompareValue(Me) + Dim y% = CompareValue(Other) + If x.CompareTo(y) = 0 Then + Return Name.CompareTo(Other.Name) + Else + Return x.CompareTo(y) + End If + End Function + Protected Function CompareValue(ByVal x As UserDataBase) As Integer + Dim OutValue% = CInt(x.Site) * 10000 + If x.IsCollection Then OutValue -= 1000 + If x.Temporary Then OutValue += 2000 + If x.Favorite Then OutValue -= 500 + Return OutValue + End Function + Friend Overridable Function CompareTo(ByVal Obj As Object) As Integer Implements IComparable.CompareTo + Return CompareTo(DirectCast(Obj, UserDataBase)) + End Function +#End Region +#Region "IEquatable Support" + Friend Overridable Overloads Function Equals(ByVal Other As UserDataBase) As Boolean Implements IEquatable(Of UserDataBase).Equals + Return Site = Other.Site And Name = Other.Name + End Function + Public Overrides Function Equals(ByVal Obj As Object) As Boolean + Return Equals(DirectCast(Obj, UserDataBase)) + End Function +#End Region +#Region "IDisposable Support" + Protected disposedValue As Boolean = False + Friend ReadOnly Property Disposed As Boolean + Get + Return disposedValue + End Get + End Property + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + _ContentList.Clear() + _ContentNew.Clear() + _TempMediaList.Clear() + _TempPostsList.Clear() + If Not BTT_CONTEXT_DOWN Is Nothing Then BTT_CONTEXT_DOWN.Dispose() + If Not BTT_CONTEXT_EDIT Is Nothing Then BTT_CONTEXT_EDIT.Dispose() + If Not BTT_CONTEXT_DELETE Is Nothing Then BTT_CONTEXT_DELETE.Dispose() + If Not BTT_CONTEXT_OPEN_PATH Is Nothing Then BTT_CONTEXT_OPEN_PATH.Dispose() + If Not BTT_CONTEXT_OPEN_SITE Is Nothing Then BTT_CONTEXT_OPEN_SITE.Dispose() + If _InvokeImageHandler Then ImageHandler(Me, False) + End If + disposedValue = True + End If + End Sub + Protected Overloads Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class + Friend Interface IContentProvider + Property Site As Sites + Property Name As String + Property ID As String + Property FriendlyName As String + Property Description As String + Property Favorite As Boolean + Property Temporary As Boolean + Sub OpenSite() + Sub DownloadData(ByVal Token As CancellationToken) + End Interface + Friend Interface IUserData : Inherits IContentProvider, IComparable(Of UserDataBase), IComparable, IEquatable(Of UserDataBase), IDisposable + Event OnPictureUpdated(ByVal User As IUserData) + Property ParseUserMediaOnly As Boolean +#Region "Images" + Function GetPicture() As Image + Sub SetPicture(ByVal f As SFile) +#End Region +#Region "Collection support" + ReadOnly Property IsCollection As Boolean + Property CollectionName As String + ReadOnly Property IncludedInCollection As Boolean + ReadOnly Property Labels As List(Of String) +#End Region + ReadOnly Property IsChannel As Boolean + Property ReadyForDownload As Boolean + Property [File] As SFile + Property FileExists As Boolean + Property DownloadedPictures As Integer + Property DownloadedVideos As Integer + ReadOnly Property DownloadedTotal(Optional ByVal Total As Boolean = True) As Integer + ReadOnly Property DownloadedInformation As String + Property HasError As Boolean + ReadOnly Property FitToAddParams As Boolean + ReadOnly Property LVIKey As String + ReadOnly Property LVIIndex As Integer + Function GetLVI(ByVal Destination As ListView) As ListViewItem + Function GetLVIGroup(ByVal Destination As ListView) As ListViewGroup + Sub LoadUserInformation() + Sub UpdateUserInformation() + ''' + ''' 0 - Nothing removed
+ ''' 1 - User removed
+ ''' 2 - Collection removed
+ ''' 3 - Collection splitted + '''
+ Function Delete() As Integer + Function MoveFiles(ByVal CollectionName As String, ByVal MergeData As Boolean) As Boolean + Sub OpenFolder() + Property DownloadReparseOnly As Boolean + ReadOnly Property DataForReparseExists As Boolean + ReadOnly Property Self As IUserData + End Interface + Friend Interface IChannelLimits + Property AutoGetLimits As Boolean + Property DownloadLimitCount As Integer? + Property DownloadLimitPost As String + Property DownloadLimitDate As Date? + Overloads Sub SetLimit(Optional ByVal Post As String = "", Optional ByVal Count As Integer? = Nothing, Optional ByVal [Date] As Date? = Nothing) + Overloads Sub SetLimit(ByVal Source As IChannelLimits) + End Interface + Friend Interface IChannelData : Inherits IContentProvider, IChannelLimits + Property SkipExistsUsers As Boolean + Property SaveToCache As Boolean + End Interface +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/Channel.vb b/SCrawler/API/Reddit/Channel.vb new file mode 100644 index 0000000..7d66fce --- /dev/null +++ b/SCrawler/API/Reddit/Channel.vb @@ -0,0 +1,304 @@ +Imports PersonalUtilities.Tools +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Functions.XML +Imports SCrawler.API.Base +Namespace API.Reddit + Friend Class Channel : Implements ICollection(Of UserPost), IEquatable(Of Channel), IComparable(Of Channel), + IRangeSwitcherContainer(Of UserPost), ILoaderSaver, IMyEnumerator(Of UserPost), IChannelLimits, IDisposable +#Region "XML Nodes' Names" + Private Const Name_Name As String = "Name" + Private Const Name_ID As String = "ID" + Private Const Name_Date As String = "Date" + Private Const Name_PostsNode As String = "Posts" +#End Region + Friend Const DefaultDownloadLimitCount As Integer = 1000 + Friend Property Name As String = String.Empty + Friend Property ID As String = String.Empty + Friend ReadOnly Property CUser As UserInfo + Get + Return New UserInfo(Me) + End Get + End Property + Friend ReadOnly Property PostsLatest As List(Of UserPost) + Friend ReadOnly Property Posts As List(Of UserPost) + Friend ReadOnly Property PostsAll As List(Of UserPost) + Get + Return ListAddList(Nothing, Posts).ListAddList(PostsLatest).ListSort + End Get + End Property + Private ReadOnly Property Source As IEnumerable(Of UserPost) Implements IRangeSwitcherContainer(Of UserPost).Source + Get + Return Posts + End Get + End Property + Friend Property LatestParsedDate As Date? = Nothing + Private _Downloading As Boolean = False + Friend ReadOnly Property Downloading As Boolean + Get + Return _Downloading + End Get + End Property + Friend ReadOnly Property File As SFile + Get + Return $"{ChannelsCollection.ChannelsPath.PathWithSeparator}{ID}.xml" + End Get + End Property + Friend ReadOnly Property CachePath As SFile + Get + Return $"{ChannelsCollection.ChannelsPathCache.PathWithSeparator}{ID}\" + End Get + End Property + Friend ReadOnly Property Count As Integer Implements ICollection(Of UserPost).Count, IMyEnumerator(Of UserPost).MyEnumeratorCount + Get + Return Posts.Count + End Get + End Property + Default Friend ReadOnly Property Item(ByVal Index As Integer) As UserPost Implements IMyEnumerator(Of UserPost).MyEnumeratorObject + Get + Return Posts(Index) + End Get + End Property + Private ReadOnly Property Range As RangeSwitcher(Of UserPost) +#Region "Limits Support" + Private _DownloadLimitCount As Integer? = Nothing + Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount + Get + If AutoGetLimits Then + If LatestParsedDate.HasValue OrElse Not DownloadLimitPost.IsEmptyString Then + Return Nothing + ElseIf _DownloadLimitCount.HasValue Then + Return _DownloadLimitCount + Else + Return DefaultDownloadLimitCount + End If + Else + Return _DownloadLimitCount + End If + End Get + Set(ByVal NewLimit As Integer?) + _DownloadLimitCount = NewLimit + End Set + End Property + Private _DownloadLimitPost As String = String.Empty + Friend Property DownloadLimitPost As String Implements IChannelLimits.DownloadLimitPost + Get + Dim PID$ = ListAddList(Nothing, Posts, LAP.NotContainsOnly).ListAddList(PostsLatest, LAP.NotContainsOnly).ListSort.FirstOrDefault.ID + If AutoGetLimits And Not PID.IsEmptyString Then + Return PID + Else + Return _DownloadLimitPost + End If + End Get + Set(ByVal NewLimit As String) + _DownloadLimitPost = NewLimit + End Set + End Property + Private _DownloadLimitDate As Date? = Nothing + Friend Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate + Get + If AutoGetLimits And LatestParsedDate.HasValue Then + Return LatestParsedDate + Else + Return _DownloadLimitDate + End If + End Get + Set(ByVal NewLimit As Date?) + _DownloadLimitDate = NewLimit + End Set + End Property + Friend Overloads Sub SetLimit(Optional ByVal MaxPost As String = "", Optional ByVal MaxCount As Integer? = Nothing, + Optional ByVal MinDate As Date? = Nothing) Implements IChannelLimits.SetLimit + DownloadLimitPost = MaxPost + DownloadLimitCount = MaxCount + DownloadLimitDate = MinDate + End Sub + Friend Overloads Sub SetLimit(ByVal Source As IChannelLimits) Implements IChannelLimits.SetLimit + With Source + DownloadLimitCount = .DownloadLimitCount + DownloadLimitPost = .DownloadLimitPost + DownloadLimitDate = .DownloadLimitDate + AutoGetLimits = .AutoGetLimits + End With + End Sub + Friend Property AutoGetLimits As Boolean = True Implements IChannelLimits.AutoGetLimits +#End Region + Friend Sub New() + Posts = New List(Of UserPost) + PostsLatest = New List(Of UserPost) + Range = New RangeSwitcher(Of UserPost)(Me) + End Sub + Friend Sub New(ByVal f As SFile) + Me.New + LoadData(f, False) + End Sub + Public Shared Widening Operator CType(ByVal f As SFile) As Channel + Return New Channel(f) + End Operator + Public Overrides Function ToString() As String + If Not Name.IsEmptyString Then + Return Name + Else + Return ID + End If + End Function + Friend Sub Delete() + If File.Exists Then File.Delete() + End Sub + Friend Sub DownloadData(ByVal Token As Threading.CancellationToken, Optional ByVal SkipExists As Boolean = True, + Optional ByVal p As MyProgress = Nothing) + Try + _Downloading = True + Using d As New UserData(CUser, False, False) With { + .Progress = p, + .SaveToCache = True, + .SkipExistsUsers = SkipExists, + .ChannelInfo = Me + } + d.SetLimit(Me) + d.DownloadData(Token) + Posts.ListAddList(d.GetNewChannelPosts(), LAP.NotContainsOnly) + Posts.Sort() + LatestParsedDate = If(Posts.FirstOrDefault(Function(pp) pp.Date.HasValue).Date, LatestParsedDate) + Token.ThrowIfCancellationRequested() + End Using + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Finally + _Downloading = False + End Try + End Sub +#Region "ICollection Support" + Private ReadOnly Property IsReadOnly As Boolean = False Implements ICollection(Of UserPost).IsReadOnly + Friend Sub Add(ByVal _Item As UserPost) Implements ICollection(Of UserPost).Add + If Not Contains(_Item) Then Posts.Add(_Item) + End Sub + Friend Sub AddRange(ByVal _Items As IEnumerable(Of UserPost)) + If _Items.ListExists Then + For Each i As UserPost In _Items : Add(i) : Next + End If + End Sub + Friend Sub Clear() Implements ICollection(Of UserPost).Clear + Posts.Clear() + End Sub + Friend Function Contains(ByVal _Item As UserPost) As Boolean Implements ICollection(Of UserPost).Contains + Return Count > 0 AndAlso Posts.Contains(_Item) + End Function + Private Sub CopyTo(ByVal _Array() As UserPost, ByVal ArrayIndex As Integer) Implements ICollection(Of UserPost).CopyTo + Throw New NotImplementedException() + End Sub + Friend Function Remove(ByVal _Item As UserPost) As Boolean Implements ICollection(Of UserPost).Remove + Return Posts.Remove(_Item) + End Function +#End Region +#Region "IEnumerable Support" + Friend Function GetEnumerator() As IEnumerator(Of UserPost) Implements IEnumerable(Of UserPost).GetEnumerator + Return New MyEnumerator(Of UserPost)(Me) + End Function + Friend Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator + Return GetEnumerator() + End Function +#End Region +#Region "IEquatable Support" + Friend Overloads Function Equals(ByVal Other As Channel) As Boolean Implements IEquatable(Of Channel).Equals + Return ID = Other.ID + End Function + Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean + If Not Obj Is Nothing Then + If TypeOf Obj Is String Then + Return ID = CStr(Obj) + Else + Return Equals(DirectCast(Obj, Channel)) + End If + Else + Return False + End If + End Function +#End Region +#Region "IComparable Support" + Friend Function CompareTo(ByVal Other As Channel) As Integer Implements IComparable(Of Channel).CompareTo + If Not Name.IsEmptyString And Not Other.Name.IsEmptyString Then + Return Name.CompareTo(Other.Name) + Else + Return ID.CompareTo(Other.ID) + End If + End Function +#End Region +#Region "IXMLContainer Support" + Friend Overloads Function LoadData(Optional ByVal f As SFile = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean Implements ILoaderSaver.Load + Return LoadData(File, False, e) + End Function + Friend Overloads Function LoadData(ByVal f As SFile, ByVal PartialLoad As Boolean, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean + If f.Exists Then + Using x As New XmlFile(f, ProtectionLevels.All, False) With {.XmlReadOnly = True, .AllowSameNames = True} + x.LoadData() + x.DefaultsLoading(False) + If x.Count > 0 Then + Dim XMLDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) + Name = x.Value(Name_Name) + ID = x.Value(Name_ID) + LatestParsedDate = AConvert(Of Date)(x.Value(Name_Date), XMLDateProvider, Nothing) + If Not PartialLoad Then + With x(Name_PostsNode).XmlIfNothing + If .Count > 0 Then .ForEach(Sub(ee) PostsLatest.Add(New UserPost With { + .ID = ee.Attribute(Name_ID), + .[Date] = AConvert(Of Date)(ee.Attribute(Name_Date).Value, XMLDateProvider, Nothing)})) + End With + End If + End If + End Using + End If + Return True + End Function + Friend Overloads Function Save(Optional ByVal f As SFile = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean Implements ILoaderSaver.Save + Dim XMLDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) + Using x As New XmlFile With {.AllowSameNames = True, .Name = "Channel"} + x.DefaultsLoading(False) + x.Add(Name_Name, Name) + x.Add(Name_ID, ID) + If Posts.Count > 0 Or PostsLatest.Count > 0 Then + Dim tmpPostList As List(Of UserPost) = Nothing + tmpPostList.ListAddList(Posts).ListAddList(PostsLatest) + tmpPostList.Sort() + LatestParsedDate = tmpPostList.FirstOrDefault(Function(pd) pd.Date.HasValue).Date + x.Add(Name_Date, AConvert(Of String)(LatestParsedDate, XMLDateProvider, String.Empty)) + x.Add(Name_PostsNode, String.Empty) + With x(Name_PostsNode) + tmpPostList.Take(200).ToList.ForEach(Sub(p) .Add(New EContainer("Post", + String.Empty, + { + New EAttribute(Name_ID, p.ID), + New EAttribute(Name_Date, AConvert(Of String)(p.Date, XMLDateProvider, String.Empty)) + }) + ) + ) + End With + tmpPostList.Clear() + End If + x.Save(File) + End Using + Return True + End Function +#End Region +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + Posts.Clear() + PostsLatest.Clear() + Range.Dispose() + If CachePath.Exists(SFO.Path, False) Then CachePath.Delete(SFO.Path, False, False, EDP.SendInLog) + End If + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/ChannelsCollection.vb b/SCrawler/API/Reddit/ChannelsCollection.vb new file mode 100644 index 0000000..d2fe219 --- /dev/null +++ b/SCrawler/API/Reddit/ChannelsCollection.vb @@ -0,0 +1,141 @@ +Imports PersonalUtilities.Tools +Imports PersonalUtilities.Forms.Toolbars +Imports SCrawler.API.Base +Imports System.Threading +Namespace API.Reddit + Friend Class ChannelsCollection : Implements ICollection(Of Channel), IMyEnumerator(Of Channel), IChannelLimits, IDisposable + Friend Shared ReadOnly Property ChannelsPath As SFile = $"{SettingsFolderName}\Channels\" + Friend Shared ReadOnly Property ChannelsPathCache As SFile = $"{Settings.GlobalPath.Value.PathWithSeparator}_CachedData\" + Private ReadOnly Channels As List(Of Channel) + Friend ReadOnly Property Downloading As Boolean + Get + If Count > 0 Then + Return Channels.Exists(Function(c) c.Downloading) + Else + Return False + End If + End Get + End Property +#Region "Limits Support" + Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount + Private Property DownloadLimitPost As String Implements IChannelLimits.DownloadLimitPost + Friend Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate + Friend Overloads Sub SetLimit(Optional ByVal MaxPost As String = "", Optional ByVal MaxCount As Integer? = Nothing, + Optional ByVal MinDate As Date? = Nothing) Implements IChannelLimits.SetLimit + 'DownloadLimitPost = MaxPost + DownloadLimitCount = MaxCount + DownloadLimitDate = MinDate + End Sub + Friend Overloads Sub SetLimit(ByVal Source As IChannelLimits) Implements IChannelLimits.SetLimit + With Source + DownloadLimitCount = .DownloadLimitCount + DownloadLimitDate = .DownloadLimitDate + AutoGetLimits = .AutoGetLimits + End With + End Sub + Friend Property AutoGetLimits As Boolean = True Implements IChannelLimits.AutoGetLimits +#End Region + Friend Sub New() + Channels = New List(Of Channel) + End Sub + Friend Sub Load() + If ChannelsPath.Exists(SFO.Path, False) Then + Dim files As List(Of SFile) = SFile.GetFiles(ChannelsPath, "*.xml") + If files.ListExists Then files.ForEach(Sub(f) Add(f)) + End If + End Sub + Friend Sub Update() + If Count > 0 Then Channels.ForEach(Sub(c) c.Save()) + End Sub + Friend ReadOnly Property Count As Integer Implements ICollection(Of Channel).Count, IMyEnumerator(Of Channel).MyEnumeratorCount + Get + Return Channels.Count + End Get + End Property + Default Friend ReadOnly Property Item(ByVal Index As Integer) As Channel Implements IMyEnumerator(Of Channel).MyEnumeratorObject + Get + Return Channels(Index) + End Get + End Property + ''' + Friend ReadOnly Property Find(ByVal ChannelID As String) As Channel + Get + If Count > 0 Then + For i% = 0 To Count - 1 + If Item(i).ID = ChannelID Then Return Item(i) + Next + End If + Throw New ArgumentException($"Channel ID [{ChannelID}] does not found in channels collection", "ChannelID") With {.HelpLink = 1} + 'Return Nothing + End Get + End Property + Friend Sub DownloadData(ByVal Token As CancellationToken, Optional ByVal SkipExists As Boolean = True, + Optional ByVal p As MyProgress = Nothing) + Try + If Count > 0 Then + Dim t As New List(Of Task) + For Each c As Channel In Channels + If Not c.Downloading Then t.Add(Task.Run(Sub() + c.SetLimit(Me) + c.DownloadData(Token, SkipExists, p) + End Sub)) + Next + If t.Count > 0 Then Task.WaitAll(t.ToArray) + Token.ThrowIfCancellationRequested() + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + End Try + End Sub +#Region "ICollection Support" + Private ReadOnly Property IsReadOnly As Boolean = False Implements ICollection(Of Channel).IsReadOnly + Friend Sub Add(ByVal _Item As Channel) Implements ICollection(Of Channel).Add + If Not Contains(_Item) Then Channels.Add(_Item) + End Sub + Friend Sub Clear() Implements ICollection(Of Channel).Clear + Channels.ListClearDispose + End Sub + Private Sub CopyTo(ByVal _Array() As Channel, ByVal ArrayIndex As Integer) Implements ICollection(Of Channel).CopyTo + Throw New NotImplementedException() + End Sub + Friend Function Contains(ByVal _Item As Channel) As Boolean Implements ICollection(Of Channel).Contains + Return Count > 0 AndAlso Channels.Contains(_Item) + End Function + Friend Function Remove(ByVal _Item As Channel) As Boolean Implements ICollection(Of Channel).Remove + If Count > 0 Then + Dim i% = Channels.IndexOf(_Item) + If i >= 0 Then + With Channels(i) : .Delete() : .Dispose() : End With + Channels.RemoveAt(i) + Return True + End If + End If + Return False + End Function +#End Region +#Region "IEnumerable Support" + Friend Function GetEnumerator() As IEnumerator(Of Channel) Implements IEnumerable(Of Channel).GetEnumerator + Return New MyEnumerator(Of Channel)(Me) + End Function + Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator + Return GetEnumerator() + End Function +#End Region +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then Update() : Clear() + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/Declarations.vb b/SCrawler/API/Reddit/Declarations.vb new file mode 100644 index 0000000..7016975 --- /dev/null +++ b/SCrawler/API/Reddit/Declarations.vb @@ -0,0 +1,33 @@ +Imports PersonalUtilities.Functions.XML.Base +Namespace API.Reddit + Friend Module Declarations + Friend ReadOnly JsonNodesJson() As NodeParams = {New NodeParams("posts", True, True, True, True, 3)} + Friend ReadOnly ChannelJsonNodes() As NodeParams = {New NodeParams("data", True, True, True, True, 1), + New NodeParams("children", True, True, True)} + Friend ReadOnly UrlBasePattern As New RegexStructure("(?<=/)([^/]+?\.[\w]{3,4})(?=(\?|\Z))", True, False) + Friend ReadOnly VideoRegEx As New RegexStructure("http.{0,1}://[^" & Chr(34) & "]+?mp4", True, False) + Friend ReadOnly DateProvider As New JsonDate + Friend ReadOnly DateProviderChannel As New JsonDateChannel + Private ReadOnly EUR_PROVIDER As New ANumbers(ANumbers.Modes.EUR) + Friend Class JsonDate : Implements ICustomProvider + ''' + Friend Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider, + Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object Implements ICustomProvider.Convert + Return ADateTime.ParseUnicodeJS(Value, NothingArg, e) + End Function + Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat + Throw New NotImplementedException("GetFormat does not available in this context") + End Function + End Class + Friend Class JsonDateChannel : Implements ICustomProvider + ''' + Friend Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider, + Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object Implements ICustomProvider.Convert + Return ADateTime.ParseUnicode(AConvert(Of Integer)(Value, EUR_PROVIDER, Value), NothingArg, e) + End Function + Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat + Throw New NotImplementedException("GetFormat does not available in this context") + End Function + End Class + End Module +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/M3U8.vb b/SCrawler/API/Reddit/M3U8.vb new file mode 100644 index 0000000..71d60d8 --- /dev/null +++ b/SCrawler/API/Reddit/M3U8.vb @@ -0,0 +1,100 @@ +Imports System.Net +Imports SCrawler.API.Reddit.M3U8_Declarations +Imports PersonalUtilities.Tools.WEB +Namespace API.Reddit.M3U8_Declarations + Friend Module M3U8_Declarations + Friend ReadOnly BaseUrlPattern As New RegexStructure("([htps:/]{7,8}.+?/.+?)(?=/)", True, False,,,,,, EDP.ReturnValue) + Friend ReadOnly PlayListRegEx_1 As New RegexStructure("(#EXT-X-STREAM-INF)(.+)(RESOLUTION=)(\d+)(.+?[\r\n]{1,2})(.+?)([\r\n]{1,2})", True, False,,, + RegexReturn.List,, New List(Of String), + New ErrorsDescriber(False, False, True, New List(Of String))) + Friend ReadOnly PlayListRegEx_2 As New RegexStructure("(?<=#EXT-X-BYTERANGE.+?[\r\n]{1,2})(.+)(?=[\r\n]{0,2})", True, False,,, RegexReturn.List,, + New List(Of String), + New ErrorsDescriber(False, False, True, New List(Of String))) + Friend ReadOnly DPED As New ErrorsDescriber(EDP.SendInLog + EDP.ReturnValue) + End Module +End Namespace +Namespace API.Reddit + Friend NotInheritable Class M3U8 + Private Sub New() + End Sub + Private Structure Resolution : Implements IRegExCreator, IComparable(Of Resolution) + Friend File As String + Friend Resolution As Integer + Friend Function CreateFromArray(ByVal ParamsArray() As String) As IRegExCreator Implements IRegExCreator.CreateFromArray + If ParamsArray.ArrayExists Then + File = ParamsArray(0) + If ParamsArray.Length > 1 Then Resolution = AConvert(Of Integer)(ParamsArray(1), 0) + End If + Return Me + End Function + Friend Function CompareTo(ByVal Other As Resolution) As Integer Implements IComparable(Of Resolution).CompareTo + Return Resolution.CompareTo(Other.Resolution) * -1 + End Function + End Structure + Private Shared Function GetPlaylistUrls(ByVal PlayListURL As String, ByVal BaseUrl As String) As List(Of String) + Try + If Not BaseUrl.IsEmptyString Then + Using w As New WebClient + Dim r$ = w.DownloadString(PlayListURL) + If Not r.IsEmptyString Then + Dim l As List(Of Resolution) = RegexFields(Of Resolution)(r, {PlayListRegEx_1}, {6, 4}) + If l.ListExists Then + l.Sort() + Dim pls$ = $"{BaseUrl}/{l.First.File}" + r = w.DownloadString(pls) + If Not r.IsEmptyString Then + Dim lp As New ListAddParams(LAP.NotContainsOnly) With { + .Converter = Function(input) $"{BaseUrl}/{input}", + .e = New ErrorsDescriber(False, False, True, New List(Of String))} + Return ListAddList(Of String, List(Of String))(Nothing, DirectCast(RegexReplace(r, PlayListRegEx_2), List(Of String)), lp).ListIfNothing + End If + End If + End If + End Using + End If + Return New List(Of String) + Catch ex As Exception + Return ErrorsDescriber.Execute(DPED, ex, "[M3U8.GetPlaylistUrls]", New List(Of String)) + End Try + End Function + Private Shared Function Save(ByVal URLs As List(Of String), ByVal f As SFile) As SFile + Dim CachePath As SFile = Nothing + Try + If URLs.ListExists Then + Dim ConcatFile As SFile = f + ConcatFile.Name = "PlayListFile" + ConcatFile.Extension = "mp4" + CachePath = $"{f.PathWithSeparator}_Cache\{SFile.GetDirectories($"{f.PathWithSeparator}_Cache\",,, EDP.ReturnValue).ListIfNothing.Count + 1}\" + If CachePath.Exists(SFO.Path) Then + Dim p As New SFileNumbers(ConcatFile.Name,,, New ANumbers(ANumbers.Modes.USA) With {.GroupSeparator = String.Empty, .FormatMode = ANumbers.Formats.General}) + ConcatFile = SFile.Indexed_IndexFile(ConcatFile,, p, EDP.ReturnValue) + Dim i% + Dim eFiles As New List(Of SFile) + Dim dFile As SFile = CachePath + dFile.Extension = New SFile(URLs(0)).Extension + If dFile.Extension.IsEmptyString Then dFile.Extension = "ts" + Using w As New WebClient + For i = 0 To URLs.Count - 1 + dFile.Name = $"ConPart_{i}" + w.DownloadFile(URLs(i), dFile) + eFiles.Add(dFile) + Next + End Using + f = FFMPEG.ConcatenateFiles(eFiles, "ffmpeg.exe", ConcatFile, p, DPED) + eFiles.Clear() + Return f + End If + End If + Return Nothing + Catch ex As Exception + Return ErrorsDescriber.Execute(DPED, ex, "[M3U8.Save]", New SFile) + Finally + If Not CachePath.IsEmptyString AndAlso CachePath.Exists(SFO.Path, False) Then CachePath.Delete(SFO.Path, False, False, DPED) + End Try + End Function + Friend Shared Function Download(ByVal URL As String, ByVal f As SFile) As SFile + Dim BaseUrl$ = RegexReplace(URL, BaseUrlPattern) + Return Save(GetPlaylistUrls(URL, BaseUrl), f) + End Function + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/UserData.vb b/SCrawler/API/Reddit/UserData.vb new file mode 100644 index 0000000..1bba813 --- /dev/null +++ b/SCrawler/API/Reddit/UserData.vb @@ -0,0 +1,468 @@ +Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Tools.ImageRenderer +Imports PersonalUtilities.Tools.WebDocuments.JSON +Imports System.Net +Imports System.Threading +Imports SCrawler.API.Base +Imports UStates = SCrawler.API.Base.UserMedia.States +Imports UTypes = SCrawler.API.Base.UserMedia.Types +Namespace API.Reddit + Friend Class UserData : Inherits UserDataBase : Implements IChannelData + Friend Overrides Property Site As Sites = Sites.Reddit +#Region "Channels Support" +#Region "IChannelLimits Support" + Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount + Friend Property DownloadLimitPost As String Implements IChannelLimits.DownloadLimitPost + Friend Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate + Friend Overloads Sub SetLimit(Optional ByVal MaxPost As String = "", Optional ByVal MaxCount As Integer? = Nothing, + Optional ByVal MinDate As Date? = Nothing) Implements IChannelLimits.SetLimit + DownloadLimitPost = MaxPost + DownloadLimitCount = MaxCount + DownloadLimitDate = MinDate + End Sub + Friend Overloads Sub SetLimit(ByVal Source As IChannelLimits) Implements IChannelLimits.SetLimit + With Source + DownloadLimitCount = .DownloadLimitCount + DownloadLimitPost = .DownloadLimitPost + DownloadLimitDate = .DownloadLimitDate + AutoGetLimits = .AutoGetLimits + End With + End Sub + Friend Property AutoGetLimits As Boolean = True Implements IChannelLimits.AutoGetLimits +#End Region + Friend Property ChannelInfo As Channel + Private ReadOnly ChannelPostsNames As New List(Of String) + Friend Property SkipExistsUsers As Boolean = True Implements IChannelData.SkipExistsUsers + Private ReadOnly _ExistsUsersNames As List(Of String) + Friend Property SaveToCache As Boolean = False Implements IChannelData.SaveToCache + Friend Function GetNewChannelPosts() As IEnumerable(Of UserPost) + If _ContentNew.Count > 0 Then Return (From c As UserMedia In _ContentNew + Where Not c.Post.CachedFile.IsEmptyString And c.State = UStates.Downloaded + Select c.Post) Else Return Nothing + End Function +#End Region + Private _Progress As MyProgress + Friend Property Progress As MyProgress + Get + If _Progress Is Nothing Then Return MainProgress Else Return _Progress + End Get + Set(ByVal p As MyProgress) + _Progress = p + End Set + End Property +#Region "Initializers" + ''' Video downloader initializer + Private Sub New() + End Sub + ''' Default initializer + Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True, Optional ByVal InvokeImageHandler As Boolean = True) + MyBase.New(InvokeImageHandler) + ChannelPostsNames = New List(Of String) + _ExistsUsersNames = New List(Of String) + User = u + If _LoadUserInformation Then LoadUserInformation() + End Sub +#End Region +#Region "Download Overrides" + Friend Overrides Sub DownloadData(ByVal Token As CancellationToken) + If IsChannel Then + ChannelPostsNames.ListAddList(ChannelInfo.PostsAll.Select(Function(p) p.ID), LNC) + If SkipExistsUsers Then _ExistsUsersNames.ListAddList(Settings.UsersList.Select(Function(p) p.Name), LNC) + DownloadDataF(Token) + ReparseVideo(Token) + _ContentNew.ListAddList(_TempMediaList, LAP.ClearBeforeAdd) + DownloadContent(Token) + Else + MyBase.DownloadData(Token) + End If + End Sub + Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken) + If IsChannel Then + _DownloadedChannelPosts = 0 + DownloadDataChannel(String.Empty, Token) + Else + DownloadDataUser(String.Empty, Token) + End If + End Sub +#End Region +#Region "Download Functions (User, Channel)" + Private Sub DownloadDataUser(ByVal POST As String, ByVal Token As CancellationToken) + Dim URL$ = String.Empty + Try + Dim PostID$ = String.Empty + Dim PostDate$ + Dim n As EContainer, nn As EContainer, s As EContainer + Dim NewPostDetected As Boolean = False + Dim ExistsDetected As Boolean = False + Dim _ItemsBefore% + Dim added As Boolean + Dim __ItemType$ + Dim tmpType As UTypes + Dim CheckNode As Predicate(Of EContainer) = Function(e) e("author").XmlIfNothingValue("/").ToLower.Equals(Name.ToLower) + Dim UPicType As Func(Of String, UTypes) = Function(input) IIf(input = "image", UTypes.Picture, UTypes.GIF) + + URL = $"https://gateway.reddit.com/desktopapi/v1/user/{Name}/posts?rtj=only&allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort=new&t=all&layout=classic" + Token.ThrowIfCancellationRequested() + Dim r$ = GetSiteResponse(URL) + If Not r.IsEmptyString Then + Using w As EContainer = JsonDocument.Parse(r) + If w.Count > 0 Then + n = w.GetNode(JsonNodesJson) + If Not n Is Nothing AndAlso n.Count > 0 Then + For Each nn In n + Token.ThrowIfCancellationRequested() + If nn.Count > 0 Then + PostID = nn.Name + If PostID.IsEmptyString AndAlso nn.Contains("id") Then PostID = nn("id").Value + If nn.Contains("created") Then PostDate = nn("created").Value Else PostDate = String.Empty + If Not _TempPostsList.Contains(PostID) Then + NewPostDetected = True + _TempPostsList.Add(PostID) + Else + ExistsDetected = True + Continue For + End If + If CheckNode(nn) Then + _ItemsBefore = _TempMediaList.Count + added = True + s = nn.ItemF({"source", "url"}) + If s.XmlIfNothingValue("/").Contains("redgifs.com") Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre, s.Value, PostID, PostDate,, IsChannel), LNC) + Else + s = nn.ItemF({"media"}).XmlIfNothing + __ItemType = s("type").XmlIfNothingValue + Select Case __ItemType + Case "gallery" : DownloadGallery(s, PostID, PostDate) + Case "image", "gifvideo" + If s.Contains("content") Then _ + _TempMediaList.ListAddValue(MediaFromData(UPicType(__ItemType), s.Value("content"), + PostID, PostDate,, IsChannel), LNC) + Case "video" + If s("hlsUrl").XmlIfNothingValue("/").ToLower.Contains("m3u8") Then _ + _TempMediaList.ListAddValue(MediaFromData(UTypes.m3u8, s.Value("hlsUrl"), + PostID, PostDate,, IsChannel), LNC) + Case Else : added = False + End Select + End If + If Not added Then + s = nn.ItemF({"source", "url"}).XmlIfNothing + If Not s.IsEmptyString AndAlso TryFile(s.Value) Then + With s.Value.ToLower + Select Case True + Case .Contains("redgifs") : tmpType = UTypes.VideoPre + Case .Contains("m3u8") : tmpType = UTypes.m3u8 + Case .Contains(".gif") And TryFile(s.Value) : tmpType = UTypes.GIF + Case TryFile(s.Value) : tmpType = UTypes.Picture + Case Else : tmpType = UTypes.Undefined + End Select + End With + If Not tmpType = UTypes.Undefined Then _ + _TempMediaList.ListAddValue(MediaFromData(tmpType, s.Value, PostID, PostDate,, IsChannel), LNC) + End If + End If + End If + End If + Next + End If + End If + End Using + If POST.IsEmptyString And ExistsDetected Then Exit Sub + If Not PostID.IsEmptyString And NewPostDetected Then DownloadDataUser(PostID, Token) + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, $"data downloading error [{URL}]") + HasError = True + End Try + End Sub + Private _DownloadedChannelPosts As Integer = 0 + Private Sub DownloadDataChannel(ByVal POST As String, ByVal Token As CancellationToken) + Dim URL$ = String.Empty + Try + Dim PostID$ = String.Empty + Dim PostDate$, _UserID$, tmpUrl$ + Dim n As EContainer, nn As EContainer, s As EContainer, ss As EContainer + Dim NewPostDetected As Boolean = False + Dim ExistsDetected As Boolean = False + Dim eCount As Predicate(Of EContainer) = Function(e) e.Count > 0 + Dim lDate As Date? + + URL = $"https://reddit.com/r/{Name}/new.json?allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort=new&t=all&layout=classic" + Token.ThrowIfCancellationRequested() + Dim r$ = GetSiteResponse(URL) + If Not r.IsEmptyString Then + Using w As EContainer = JsonDocument.Parse(r).XmlIfNothing + If w.Count > 0 Then + n = w.GetNode(ChannelJsonNodes) + If Not n Is Nothing AndAlso n.Count > 0 Then + For Each nn In n + Token.ThrowIfCancellationRequested() + s = nn.ItemF({eCount}) + If Not s Is Nothing AndAlso s.Count > 0 Then + PostID = s.Value("name") + If PostID.IsEmptyString AndAlso s.Contains("id") Then PostID = s("id").Value + + If ChannelPostsNames.Contains(PostID) Then ExistsDetected = True : Continue For 'Exit Sub + If DownloadLimitCount.HasValue AndAlso _DownloadedChannelPosts >= DownloadLimitCount.Value Then Exit Sub + If Not DownloadLimitPost.IsEmptyString AndAlso DownloadLimitPost = PostID Then Exit Sub + If DownloadLimitDate.HasValue AndAlso _TempMediaList.Count > 0 Then + With (From __u In _TempMediaList Where __u.Post.Date.HasValue Select __u.Post.Date.Value) + If .Count > 0 Then lDate = .Min Else lDate = Nothing + End With + If lDate.HasValue AndAlso lDate.Value <= DownloadLimitDate.Value Then Exit Sub + End If + NewPostDetected = True + + If s.Contains("created") Then PostDate = s("created").Value Else PostDate = String.Empty + _UserID = s.Value("author") + + If SkipExistsUsers AndAlso _ExistsUsersNames.Count > 0 AndAlso + Not _UserID.IsEmptyString AndAlso _ExistsUsersNames.Contains(_UserID) Then Continue For + + tmpUrl = s.Value("url") + If Not tmpUrl.IsEmptyString AndAlso tmpUrl.Contains("redgifs.com") Then + If SaveToCache Then + tmpUrl = s.Value({"media", "oembed"}, "thumbnail_url") + If Not tmpUrl.IsEmptyString Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) + _DownloadedChannelPosts += 1 + End If + Else + _TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) + _DownloadedChannelPosts += 1 + End If + ElseIf s.Item("media_metadata").XmlIfNothing.Count > 0 Then + DownloadGallery(s, PostID, PostDate, _UserID, SaveToCache) + _DownloadedChannelPosts += 1 + ElseIf s.Contains("preview") Then + ss = s.ItemF({"preview", "images", eCount, "source", "url"}).XmlIfNothing + If Not ss.Value.IsEmptyString Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, ss.Value, PostID, PostDate, _UserID, IsChannel), LNC) + _DownloadedChannelPosts += 1 + End If + End If + End If + Next + End If + End If + End Using + If POST.IsEmptyString And ExistsDetected Then Exit Sub + If Not PostID.IsEmptyString And NewPostDetected Then DownloadDataChannel(PostID, Token) + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, $"channel data downloading error [{URL}]") + HasError = True + End Try + End Sub +#End Region +#Region "Download Base Functions" + Private Sub DownloadGallery(ByVal w As EContainer, ByVal PostID As String, ByVal PostDate As String, + Optional ByVal _UserID As String = Nothing, Optional ByVal FirstOnly As Boolean = False) + Try + Dim cn$ = IIf(IsChannel, "media_metadata", "mediaMetadata") + If Not w Is Nothing AndAlso w(cn).XmlIfNothing.Count > 0 Then + Dim t As EContainer + For Each n As EContainer In w(cn) + t = n.ItemF({"s", "u"}) + If Not t Is Nothing AndAlso Not t.Value.IsEmptyString Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, t.Value, PostID, PostDate, _UserID, IsChannel), LNC) + If FirstOnly Then Exit For + End If + Next + End If + Catch ex As Exception + LogError(ex, "gallery parsing error") + HasError = True + End Try + End Sub + Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken) + Try + Token.ThrowIfCancellationRequested() + If _TempMediaList.Count > 0 AndAlso _TempMediaList.Exists(Function(p) p.Type = UTypes.VideoPre) Then + Dim r$, v$ + Dim m As UserMedia + For i% = _TempMediaList.Count - 1 To 0 Step -1 + Token.ThrowIfCancellationRequested() + If _TempMediaList(i).Type = UTypes.VideoPre Then + m = _TempMediaList(i) + r = GetSiteResponse(m.URL) + _TempMediaList(i) = New UserMedia + If Not r.IsEmptyString Then + v = RegexReplace(r, VideoRegEx) + If Not v.IsEmptyString Then + _TempMediaList(i) = New UserMedia With {.Type = UTypes.Video, .URL = v, .File = v, .Post = m.Post} + Else + _TempMediaList.RemoveAt(i) + End If + End If + End If + Next + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, "video reparsing error") + End Try + End Sub + Friend Shared Function GetVideoInfo(ByVal URL As String) As UserMedia + Try + If Not URL.IsEmptyString AndAlso URL.Contains("redgifs") Then + Using r As New UserData + r._TempMediaList.Add(MediaFromData(UTypes.VideoPre, URL, String.Empty, String.Empty,, False)) + r.ReparseVideo(Nothing) + If r._TempMediaList.ListExists Then Return r._TempMediaList(0) + End Using + End If + Return Nothing + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.ShowMainMsg + EDP.SendInLog, ex, "Video searching error") + End Try + End Function +#End Region +#Region "Structure creator" + Protected Shared Function MediaFromData(ByVal t As UTypes, ByVal _URL As String, ByVal PostID As String, ByVal PostDate As String, + Optional ByVal _UserID As String = "", Optional ByVal IsChannel As Boolean = False) As UserMedia + If _URL.IsEmptyString And t = UTypes.Picture Then Return Nothing + _URL = LinkFormatterSecure(RegexReplace(_URL.Replace("\", String.Empty), LinkPattern)) + Dim m As New UserMedia(_URL, t) With {.Post = New UserPost With {.ID = PostID, .UserID = _UserID}} + If t = UTypes.Picture Or t = UTypes.GIF Then m.File = CStr(RegexReplace(m.URL, FilesPattern)) Else m.File = Nothing + If m.URL.Contains("preview") Then m.URL = $"https://i.redd.it/{m.File.File}" + If Not PostDate.IsEmptyString Then m.Post.Date = AConvert(Of Date)(PostDate, If(IsChannel, DateProviderChannel, DateProvider), Nothing) Else m.Post.Date = Nothing + Return m + End Function + Private Function TryFile(ByVal URL As String) As Boolean + Try + If Not URL.IsEmptyString AndAlso URL.Contains(".jpg") Then + Dim f As SFile = CStr(RegexReplace(URL, FilesPattern)) + Return Not f.IsEmptyString And Not f.File.IsEmptyString + End If + Return False + Catch ex As Exception + Return False + End Try + End Function +#End Region + Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken) + Try + Dim i% + Token.ThrowIfCancellationRequested() + If _ContentNew.Count > 0 Then + _ContentNew.RemoveAll(Function(c) c.URL.IsEmptyString) + If _ContentNew.Count > 0 Then + MyFile.Exists(SFO.Path) + Dim MyDir$ + If IsChannel And SaveToCache Then + MyDir = ChannelInfo.CachePath.PathNoSeparator + Else + MyDir = MyFile.CutPath.PathNoSeparator + End If + Dim HashList As New List(Of String) + If _ContentList.Count > 0 Then HashList.ListAddList((From h In _ContentList Where Not h.MD5.IsEmptyString Select h.MD5), LNC) + Dim f As SFile + Dim v As UserMedia + Dim cached As Boolean = IsChannel And SaveToCache + Dim vsf As Boolean = SeparateVideoFolderF + Dim ImgFormat As Imaging.ImageFormat + Dim bDP As New ErrorsDescriber(EDP.None) + Dim MD5BS As Func(Of String, UTypes, + SFile, Boolean, String) = Function(ByVal __URL As String, ByVal __MT As UTypes, + ByVal __File As SFile, ByVal __IsBase As Boolean) As String + Try + If __MT = UTypes.GIF Then + ImgFormat = Imaging.ImageFormat.Gif + ElseIf __IsBase Then + ImgFormat = GetImageFormat(CStr(RegexReplace(__URL, UrlBasePattern))) + Else + ImgFormat = GetImageFormat(__File) + End If + Return ByteArrayToString(GetMD5(SFile.GetBytesFromNet(__URL, bDP), ImgFormat)) + Catch hash_ex As Exception + Return String.Empty + End Try + End Function + Dim m$ + Using w As New WebClient + If vsf Then SFileShares.SFileExists($"{MyDir}\Video\", SFO.Path) + Progress.TotalCount += _ContentNew.Count + For i = 0 To _ContentNew.Count - 1 + Token.ThrowIfCancellationRequested() + v = _ContentNew(i) + v.State = UStates.Tried + If v.Type = UTypes.Picture Then v.File = v.URL + If v.File.IsEmptyString Then + f = v.URL + Else + f = v.File + End If + f.Separator = "\" + m = String.Empty + If (v.Type = UTypes.Picture Or v.Type = UTypes.GIF) And Not cached Then + m = MD5BS(v.URL, v.Type, f, False) + If m.IsEmptyString AndAlso Not v.URL_BASE.IsEmptyString AndAlso Not v.URL_BASE = v.URL Then + m = MD5BS(v.URL_BASE, v.Type, f, True) + If Not m.IsEmptyString Then v.URL = v.URL_BASE + End If + End If + + If (Not m.IsEmptyString AndAlso Not HashList.Contains(m)) Or Not (v.Type = UTypes.Picture Or + v.Type = UTypes.GIF) Or cached Then + If Not cached Then HashList.Add(m) + v.MD5 = m + f.Path = MyDir + Try + If (v.Type = UTypes.Video Or v.Type = UTypes.m3u8) And vsf Then f.Path = $"{f.PathWithSeparator}Video" + If v.Type = UTypes.m3u8 Then + f = M3U8.Download(v.URL, f) + Else + w.DownloadFile(v.URL, f.ToString) + End If + If Not v.Type = UTypes.m3u8 Or Not f.IsEmptyString Then + Select Case v.Type + Case UTypes.Picture : DownloadedPictures += 1 : _CountPictures += 1 + Case UTypes.Video, UTypes.m3u8 : DownloadedVideos += 1 : _CountVideo += 1 + End Select + v.File = f + v.Post.CachedFile = f + v.State = UStates.Downloaded + End If + Catch wex As Exception + If Not IsChannel Then ErrorDownloading(f, v.URL) + End Try + Else + v.State = UStates.Skipped + End If + _ContentNew(i) = v + Progress.Perform() + Next + End Using + End If + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, "content downloading error") + HasError = True + End Try + End Sub + Protected Function GetSiteResponse(ByVal URL As String) As String + Try + Return Settings.Site(Sites.Reddit).Responser.GetResponse(URL,, EDP.ThrowException) + Catch ex As Exception + HasError = True + Dim e As EDP = EDP.SendInLog + Dim OptText$ = String.Empty + If Settings.Site(Sites.Reddit).Responser.StatusCode = HttpStatusCode.NotFound Then + e += EDP.ThrowException + OptText = ": USER NOT FOUND" + Else + e += EDP.ReturnValue + End If + Return ErrorsDescriber.Execute(e, ex, $"[{Site} - {Name}: GetSiteResponse([{URL}])]{OptText}", String.Empty) + End Try + End Function + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue And disposing Then ChannelPostsNames.Clear() : _ExistsUsersNames.Clear() + MyBase.Dispose(disposing) + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Twitter/Declarations.vb b/SCrawler/API/Twitter/Declarations.vb new file mode 100644 index 0000000..b254f7c --- /dev/null +++ b/SCrawler/API/Twitter/Declarations.vb @@ -0,0 +1,9 @@ +Imports PersonalUtilities.Functions.XML.Base +Namespace API.Twitter + Friend Module Declarations + Friend DateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) + Friend ReadOnly VideoNode As NodeParams() = {New NodeParams("video_info", True, True, True, True, 10)} + Friend ReadOnly VideoSizeRegEx As New RegexStructure("\d+x(\d+)",,,, 1,,, String.Empty, EDP.ReturnValue) + Friend ReadOnly UserIdRegEx As New RegexStructure("user_id.:.(\d+)",,,, 1,,, String.Empty, EDP.ReturnValue) + End Module +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Twitter/UserData.vb b/SCrawler/API/Twitter/UserData.vb new file mode 100644 index 0000000..5d5e3f9 --- /dev/null +++ b/SCrawler/API/Twitter/UserData.vb @@ -0,0 +1,264 @@ +Imports PersonalUtilities.Tools.WebDocuments.JSON +Imports PersonalUtilities.Functions.XML +Imports System.Net +Imports System.Threading +Imports SCrawler.API.Base +Imports UStates = SCrawler.API.Base.UserMedia.States +Namespace API.Twitter + Friend Class UserData : Inherits UserDataBase +#Region "Declarations" + Friend Overrides Property Site As Sites = Sites.Twitter + Private Structure Sizes : Implements IComparable(Of Sizes) + Friend Value As Integer + Friend Name As String + Friend ReadOnly HasError As Boolean + Friend Sub New(ByVal _Value As String, ByVal _Name As String) + Try + Value = _Value + Name = _Name + Catch ex As Exception + HasError = True + End Try + End Sub + Friend Function CompareTo(ByVal Other As Sizes) As Integer Implements IComparable(Of Sizes).CompareTo + Return Value.CompareTo(Other.Value) * -1 + End Function + Friend Shared Function Reparse(ByRef Current As Sizes, ByVal Other As Sizes, ByVal LargeContained As Boolean) As Sizes + If LargeContained And Current.Name.IsEmptyString And Current.Value > Other.Value Then Current.Name = "large" + Return Current + End Function + Friend Shared Function ApplyLarge(ByRef s As Sizes) As Sizes + s.Name = "large" + Return s + End Function + End Structure +#End Region +#Region "Initializer" + Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True) + User = u + If _LoadUserInformation Then LoadUserInformation() + End Sub +#End Region +#Region "Download functions" + Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken) + DownloadData(String.Empty, Token) + End Sub + Private Overloads Sub DownloadData(ByVal POST As String, ByVal Token As CancellationToken) + Dim URL$ = String.Empty + Try + Dim PostID$ = String.Empty + Dim PostDate$ + Dim m As EContainer, nn As EContainer, s As EContainer + Dim NewPostDetected As Boolean = False + Dim ExistsDetected As Boolean = False + + Dim PicNode As Predicate(Of EContainer) = Function(e) e.Count > 0 AndAlso e.Contains("media_url") + Dim UID As Func(Of EContainer, String) = Function(e) e.XmlIfNothing.Item({"user", "id"}).XmlIfNothingValue + + URL = $"https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={Name}&count=200&exclude_replies=false&include_rts=1&tweet_mode=extended" + If Not POST.IsEmptyString Then URL &= $"&max_id={POST}" + + Token.ThrowIfCancellationRequested() + Dim r$ = Settings.Site(Sites.Twitter).Responser.GetResponse(URL,, EDP.ThrowException) + If Not r.IsEmptyString Then + Using w As EContainer = JsonDocument.Parse(r) + If Not w Is Nothing AndAlso w.Count > 0 Then + For Each nn In w + Token.ThrowIfCancellationRequested() + If nn.Count > 0 Then + PostID = nn.Value("id") + If ID.IsEmptyString Then + ID = UID(nn) + If Not ID.IsEmptyString Then UpdateUserInformation() + End If + + 'Date Pattern: + 'Sat Jan 01 01:10:15 +0000 2000 + If nn.Contains("created_at") Then PostDate = nn("created_at").Value Else PostDate = String.Empty + + If Not _TempPostsList.Contains(PostID) Then + NewPostDetected = True + _TempPostsList.Add(PostID) + Else + ExistsDetected = True + Continue For + End If + + If Not ParseUserMediaOnly OrElse (Not nn.Contains("retweeted_status") OrElse + (Not ID.IsEmptyString AndAlso UID(nn("retweeted_status")) = ID)) Then + If Not CheckVideoNode(nn, PostID, PostDate) Then + s = nn.ItemF({"extended_entities", "media"}) + If s Is Nothing OrElse s.Count = 0 Then s = nn.ItemF({"retweeted_status", "extended_entities", "media"}) + If Not s Is Nothing AndAlso s.Count > 0 Then + For Each m In s + If m.Count > 0 AndAlso m.Contains("media_url") Then + _TempMediaList.ListAddValue(MediaFromData(m("media_url").Value, + PostID, PostDate, GetPictureOption(m)), LNC) + End If + Next + End If + End If + End If + End If + Next + End If + End Using + If POST.IsEmptyString And ExistsDetected Then Exit Sub + If Not PostID.IsEmptyString And NewPostDetected Then DownloadData(PostID, Token) + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, $"data downloading error [{URL}]") + HasError = True + End Try + End Sub + Friend Shared Function GetVideoInfo(ByVal URL As String) As UserMedia + Try + If URL.Contains("twitter") Then + Dim PostID$ = RegexReplace(URL, New RegexStructure("(?<=/)\d+", True, False,,,,, String.Empty)) + If Not PostID.IsEmptyString Then + Dim r$ = Settings.Site(Sites.Twitter).Responser.GetResponse($"https://api.twitter.com/1.1/statuses/show.json?id={PostID}",, + EDP.ReturnValue) + If Not r.IsEmptyString Then + Using j As EContainer = JsonDocument.Parse(r) + If j.ListExists Then + Dim u$ = GetVideoNodeURL(j) + If Not u.IsEmptyString Then Return MediaFromData(u, PostID, String.Empty) + End If + End Using + End If + End If + End If + Return Nothing + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.ShowMainMsg + EDP.SendInLog, ex, "Video searching error") + End Try + End Function +#Region "Picture options" + Private Function GetPictureOption(ByVal w As EContainer) As String + Try + Dim ww As EContainer = w("sizes") + If Not ww Is Nothing AndAlso ww.Count > 0 Then + Dim l As New List(Of Sizes) + Dim LargeContained As Boolean = ww.Contains("large") + For Each v As EContainer In ww + If v.Count > 0 AndAlso v.Contains("h") Then l.Add(New Sizes(v.Value("h"), v.Name)) + Next + If l.Count > 0 Then + l.Sort() + If l(0).Name.IsEmptyString And LargeContained Then Return "large" Else Return l(0).Name + End If + End If + Return String.Empty + Catch ex As Exception + LogError(ex, "[GetPictureOption]") + Return String.Empty + End Try + End Function +#End Region +#Region "Video options" + Private Function CheckVideoNode(ByVal w As EContainer, ByVal PostID As String, ByVal PostDate As String) As Boolean + Try + Dim URL$ = GetVideoNodeURL(w) + If Not URL.IsEmptyString Then _TempMediaList.ListAddValue(MediaFromData(URL, PostID, PostDate), LNC) : Return True + Return False + Catch ex As Exception + LogError(ex, "[CheckVideoNode]") + Return False + End Try + End Function + Private Shared Function GetVideoNodeURL(ByVal w As EContainer) As String + Dim v As EContainer = w.GetNode(VideoNode) + If Not v Is Nothing AndAlso v.Count > 0 Then + Dim l As New List(Of Sizes) + Dim u$ + Dim nn As EContainer + For Each n As EContainer In v + If n.Count > 0 Then + For Each nn In n + If nn("content_type").XmlIfNothingValue("none").Contains("mp4") AndAlso nn.Contains("url") Then + u = nn.Value("url") + l.Add(New Sizes(RegexReplace(u, VideoSizeRegEx), u)) + End If + Next + End If + Next + If l.Count > 0 Then l.RemoveAll(Function(s) s.HasError) + If l.Count > 0 Then l.Sort() : Return l(0).Name + End If + Return String.Empty + End Function + Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken) + End Sub +#End Region + Private Shared Function MediaFromData(ByVal _URL As String, ByVal PostID As String, ByVal PostDate As String, + Optional ByVal _PictureOption As String = "") As UserMedia + _URL = LinkFormatterSecure(RegexReplace(_URL.Replace("\", String.Empty), LinkPattern)) + Dim m As New UserMedia(_URL) With {.PictureOption = _PictureOption, .Post = New UserPost With {.ID = PostID}} + If Not m.URL.IsEmptyString Then m.File = CStr(RegexReplace(m.URL, FilesPattern)) + If Not m.PictureOption.IsEmptyString And Not m.File.IsEmptyString And Not m.URL.IsEmptyString Then + m.URL_BASE = $"{m.URL.Replace($".{m.File.Extension}", String.Empty)}?format={m.File.Extension}&name={m.PictureOption}" + End If + If Not PostDate.IsEmptyString Then m.Post.Date = AConvert(Of Date)(PostDate, Declarations.DateProvider, Nothing) Else m.Post.Date = Nothing + Return m + End Function +#End Region + Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken) + Try + Dim i% + Token.ThrowIfCancellationRequested() + If _ContentNew.Count > 0 Then + _ContentNew.RemoveAll(Function(c) c.URL.IsEmptyString) + If _ContentNew.Count > 0 Then + MyFile.Exists(SFO.Path) + Dim MyDir$ = MyFile.CutPath.Path + Dim vsf As Boolean = SeparateVideoFolderF + Dim f As SFile + Dim v As UserMedia + Using w As New WebClient + If vsf Then SFileShares.SFileExists($"{MyDir}\Video\", SFO.Path) + MainProgress.TotalCount += _ContentNew.Count + For i = 0 To _ContentNew.Count - 1 + Token.ThrowIfCancellationRequested() + v = _ContentNew(i) + v.State = UStates.Tried + If v.File.IsEmptyString Then + f = v.URL + Else + f = v.File + End If + f.Separator = "\" + f.Path = MyDir + + If v.URL_BASE.IsEmptyString Then v.URL_BASE = v.URL + + If Not v.File.IsEmptyString AndAlso Not v.URL_BASE.IsEmptyString Then + Try + If f.Extension = "mp4" And vsf Then f.Path = $"{f.PathWithSeparator}Video" + w.DownloadFile(v.URL_BASE, f.ToString) + Select Case f.Extension + Case "mp4" : v.Type = UserMedia.Types.Video : DownloadedVideos += 1 : _CountVideo += 1 + Case Else : v.Type = UserMedia.Types.Picture : DownloadedPictures += 1 : _CountPictures += 1 + End Select + v.File = f + v.State = UStates.Downloaded + Catch wex As Exception + ErrorDownloading(f, v.URL_BASE) + End Try + Else + v.State = UStates.Skipped + End If + _ContentNew(i) = v + MainProgress.Perform() + Next + End Using + End If + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, "content downloading error") + HasError = True + End Try + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/UserDataBind.vb b/SCrawler/API/UserDataBind.vb new file mode 100644 index 0000000..3efbd3f --- /dev/null +++ b/SCrawler/API/UserDataBind.vb @@ -0,0 +1,471 @@ +Imports PersonalUtilities.Tools +Imports System.Threading +Imports SCrawler.API.Base +Namespace API + Friend Class UserDataBind : Inherits UserDataBase : Implements ICollection(Of IUserData), IMyEnumerator(Of IUserData) + Friend Event OnCollectionSelfRemoved() +#Region "Declarations" + Friend Overrides Property Site As Sites = Sites.Undefined + Friend ReadOnly Property Collections As List(Of IUserData) + Private _CollectionName As String = String.Empty + Friend Overrides Property CollectionName As String + Get + If Count > 0 Then + Return Collections(0).CollectionName + Else + Return _CollectionName + End If + End Get + Set(ByVal NewName As String) + ChangeCollectionName(NewName, True) + End Set + End Property + Friend Overrides Sub ChangeCollectionName(ByVal NewName As String, ByVal UpdateSettings As Boolean) + _CollectionName = NewName + If Count > 0 Then Collections.ForEach(Sub(c) c.CollectionName = NewName) + End Sub + Friend Overrides Property FriendlyName As String + Get + If Count > 0 Then + Return Collections(0).FriendlyName + Else + Return String.Empty + End If + End Get + Set(ByVal NewName As String) + If Count > 0 Then Collections.ForEach(Sub(c) + c.FriendlyName = NewName + c.UpdateUserInformation() + End Sub) + End Set + End Property +#Region "Images" + Friend Overrides Sub SetPicture(ByVal f As SFile) + If Count > 0 Then Collections.ForEach(Sub(c) c.SetPicture(f)) + End Sub + Friend Overrides Function GetUserPicture() As Image + If Count > 0 Then + Return Collections(0).GetPicture + Else + Return GetNullPicture(Settings.MaxLargeImageHeigh) + End If + End Function +#End Region + Friend Overrides ReadOnly Property DownloadedTotal(Optional ByVal Total As Boolean = True) As Integer + Get + If Count > 0 Then + Return Collections.Select(Function(u) u.DownloadedTotal(Total)).Sum + Else + Return 0 + End If + End Get + End Property + Friend ReadOnly Property Count As Integer Implements ICollection(Of IUserData).Count, IMyEnumerator(Of IUserData).MyEnumeratorCount + Get + If Collections Is Nothing Then + Return 0 + Else + Return Collections.Count + End If + End Get + End Property + Friend Overrides Property MyFile As SFile + Get + If Count > 0 Then Return Collections(0).File Else Return Nothing + End Get + Set(ByVal NewFile As SFile) + End Set + End Property + Friend Overrides Property FileExists As Boolean + Get + If Count > 0 Then + Return Collections.Exists(Function(c) c.FileExists) + Else + Return False + End If + End Get + Set(ByVal IsExists As Boolean) + End Set + End Property + Friend Overrides Property DataMerging As Boolean + Get + If Count > 0 Then + Return DirectCast(Collections(0), UserDataBase).DataMerging + Else + Return False + End If + End Get + Set(ByVal IsMerged As Boolean) + MergeData(IsMerged) + End Set + End Property + Friend Overrides Property HasError As Boolean + Get + Return MyBase.HasError Or (Count > 0 AndAlso Collections.Exists(Function(c) c.HasError)) + End Get + Set(ByVal __HasError As Boolean) + MyBase.HasError = __HasError + If Count > 0 Then Collections.ForEach(Sub(c) c.HasError = False) + End Set + End Property + Friend Overrides Property Temporary As Boolean + Get + If Count > 0 Then + Return Collections(0).Temporary + Else + Return False + End If + End Get + Set(ByVal Temp As Boolean) + Collections.ForEach(Sub(c) c.Temporary = Temp) + UpdateUserInformation() + End Set + End Property + Friend Overrides Property Favorite As Boolean + Get + If Count > 0 Then + Return Collections(0).Favorite + Else + Return False + End If + End Get + Set(ByVal Fav As Boolean) + Collections.ForEach(Sub(c) c.Favorite = Fav) + UpdateUserInformation() + End Set + End Property + Friend Overrides ReadOnly Property Labels As List(Of String) + Get + If Count > 0 Then + Return ListAddList(Nothing, Collections.SelectMany(Function(c) c.Labels), LAP.NotContainsOnly) + Else + Return New List(Of String) + End If + End Get + End Property + Friend Overrides Function GetUserInformation() As String + Dim OutStr$ = String.Empty + If Count > 0 Then Collections.ForEach(Sub(c) OutStr.StringAppendLine(DirectCast(c, UserDataBase).GetUserInformation(), $"{vbCrLf}{vbCrLf}")) + Return OutStr + End Function + Friend Overrides Property LastUpdated As Date? + Get + If Count > 0 Then + With If((From c In Collections + Where DirectCast(c, UserDataBase).LastUpdated.HasValue + Select DirectCast(c, UserDataBase).LastUpdated.Value).ToList, New List(Of Date)) + If .Count > 0 Then Return .Max + End With + End If + Return Nothing + End Get + Set(ByVal NewDate As Date?) + End Set + End Property + Friend Overrides ReadOnly Property FitToAddParams As Boolean + Get + Return Count > 0 AndAlso Collections.Exists(Function(c) c.FitToAddParams) + End Get + End Property +#Region "Context buttons" + Friend ReadOnly Property ContextDown As ToolStripMenuItem() + Get + If Count > 0 Then + Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_DOWN).ToArray + Else + Return New ToolStripMenuItem() {} + End If + End Get + End Property + Friend ReadOnly Property ContextEdit As ToolStripMenuItem() + Get + If Count > 0 Then + Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_EDIT).ToArray + Else + Return New ToolStripMenuItem() {} + End If + End Get + End Property + Friend ReadOnly Property ContextDelete As ToolStripMenuItem() + Get + If Count > 0 Then + Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_DELETE).ToArray + Else + Return New ToolStripMenuItem() {} + End If + End Get + End Property + Friend ReadOnly Property ContextPath As ToolStripMenuItem() + Get + If Count > 0 Then + Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_OPEN_PATH).ToArray + Else + Return New ToolStripMenuItem() {} + End If + End Get + End Property + Friend ReadOnly Property ContextSite As ToolStripMenuItem() + Get + If Count > 0 Then + Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_OPEN_SITE).ToArray + Else + Return New ToolStripMenuItem() {} + End If + End Get + End Property +#End Region +#End Region + Friend Sub New() + _IsCollection = True + Collections = New List(Of IUserData) + 'ImageHandler(Me, True) + End Sub + Friend Sub New(ByVal _Name As String) + Me.New + CollectionName = _Name + End Sub + Friend Overrides Sub LoadUserInformation() + If Count > 0 Then Collections.ForEach(Sub(c) c.LoadUserInformation()) + End Sub + Friend Overrides Sub UpdateUserInformation() + If Count > 0 Then Collections.ForEach(Sub(c) c.UpdateUserInformation()) + End Sub + Friend Overrides Sub LoadContentInformation() + If Count > 0 Then Collections.ForEach(Sub(c) DirectCast(c, UserDataBase).LoadContentInformation()) + End Sub + Friend Overrides Property DownloadReparseOnly As Boolean + Get + If Count > 0 Then Return Collections(0).DownloadReparseOnly Else Return False + End Get + Set(ByVal DRO As Boolean) + If Count > 0 Then Collections.ForEach(Sub(u) u.DownloadReparseOnly = DRO) + End Set + End Property + Friend Overrides ReadOnly Property DataForReparseExists As Boolean + Get + If Count > 0 Then + Return Collections.Exists(Function(u) u.DataForReparseExists) + Else + Return False + End If + End Get + End Property + Friend Overrides Sub DownloadData(ByVal Token As CancellationToken) + If Count > 0 Then Downloader.AddRange(Collections) + End Sub + Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken) + End Sub + Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken) + End Sub + Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken) + End Sub + Private Sub User_OnPictureUpdated(ByVal User As IUserData) + Raise_OnPictureUpdated() + End Sub + Friend Overrides Sub OpenSite() + If Count > 0 Then Collections(0).OpenSite() + End Sub + Friend Overrides Sub OpenFolder() + Try + If Count > 0 Then Collections(0).File.CutPath(2).Open(SFO.Path, EDP.None) + Catch ex As Exception + End Try + End Sub +#Region "ICollection Support" + Default Friend ReadOnly Property Item(ByVal Index As Integer) As IUserData Implements IMyEnumerator(Of IUserData).MyEnumeratorObject + Get + Return Collections(Index) + End Get + End Property + Private ReadOnly Property IsReadOnly As Boolean Implements ICollection(Of IUserData).IsReadOnly + Get + Return False + End Get + End Property + Friend Overloads Sub Add(ByVal _Item As IUserData) Implements ICollection(Of IUserData).Add + With _Item + .Temporary = Temporary + .Favorite = Favorite + ImageHandler(_Item, False) + AddHandler _Item.OnPictureUpdated, AddressOf User_OnPictureUpdated + Dim m As Boolean = DataMerging + If .MoveFiles(CollectionName, m) Then + Collections.Add(_Item) + DirectCast(_Item, UserDataBase).CreateButtons(Count - 1) + End If + End With + End Sub + ''' FOR SETTINGS START LOADING ONLY + Friend Overloads Sub Add(ByVal u As UserInfo, Optional ByVal _LoadData As Boolean = True) + Select Case u.Site + Case Sites.Reddit : Collections.Add(New Reddit.UserData(u, _LoadData)) + Case Sites.Twitter : Collections.Add(New Twitter.UserData(u, _LoadData)) + Case Else : Exit Sub + End Select + With DirectCast(Collections(Count - 1), UserDataBase) + .CreateButtons(Count - 1) + AddHandler .BTT_CONTEXT_DELETE.Click, AddressOf BTT_CONTEXT_DELETE_Click + End With + AddHandler Collections(Count - 1).OnPictureUpdated, AddressOf User_OnPictureUpdated + End Sub + Friend Sub AddRange(ByVal _Items As IEnumerable(Of IUserData)) + If Not _Items Is Nothing AndAlso _Items.Count > 0 Then + For i% = 0 To _Items.Count - 1 : Add(_Items(i)) : Next + End If + End Sub + Friend Overrides Function MoveFiles(ByVal __CollectionName As String, ByVal _MergeData As Boolean) As Boolean + Throw New NotImplementedException("Files moving does not available if collection context") + End Function + Friend Overloads Sub MergeData(ByVal Merging As Boolean) + If Count > 0 Then + If Merging Then + If DataMerging Then + MsgBoxE($"Collection [{CollectionName}] data already merged") + Else + If Collections.Count > 1 Then + Collections.ForEach(Sub(c) DirectCast(c, UserDataBase).MergeData()) + MsgBoxE($"Collection [{CollectionName}] data merged") + Else + MsgBoxE($"Collection [{CollectionName}] contains only one user profile" & vbCr & + "Data merging available from two and more profiles in collection!", MsgBoxStyle.Exclamation) + End If + End If + Else + If DataMerging Then + MsgBoxE($"Collection [{CollectionName}] data is already merged" & vbCr & + "Combined data can not be undone", MsgBoxStyle.Critical) + Else + MsgBoxE($"Collection [{CollectionName}] data was never merged") + End If + End If + End If + End Sub + Friend Sub Clear() Implements ICollection(Of IUserData).Clear + Collections.ListClearDispose + End Sub + Friend Function Contains(ByVal _Item As IUserData) As Boolean Implements ICollection(Of IUserData).Contains + Return Collections.Contains(_Item) + End Function + Private Sub CopyTo(ByVal _Array() As IUserData, ByVal _ArrayIndex As Integer) Implements ICollection(Of IUserData).CopyTo + Throw New NotImplementedException("[CopyTo] method does not supported in collections context") + End Sub + Friend Function Remove(ByVal _Item As IUserData) As Boolean Implements ICollection(Of IUserData).Remove + If DataMerging Then + MsgBoxE($"Collection [{CollectionName}] data is already merged" & vbCr & + "Combined data can not be undone" & vbCr & + "Operation canceled", MsgBoxStyle.Critical) + Return False + Else + DirectCast(_Item, UserDataBase).MoveFiles(String.Empty, False) + ImageHandler(_Item) + Return Collections.Remove(_Item) + End If + End Function + Friend Overrides Function Delete() As Integer + If Count > 0 Then + If MsgBoxE({$"Collection may contain data{vbCr}Do you really want to delete collection and all of it files?", "Collection deleting"}, + MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then + Settings.Users.Remove(Me) + Collections.ForEach(Sub(c) c.Delete()) + Downloader.UserRemove(Me) + ImageHandler(Me, False) + Collections.ListClearDispose + Dispose(False) + Return 2 + Else + If DataMerging Then + MsgBoxE($"Collection [{CollectionName}] data are already merged{vbCr}Cannot split merged collection{vbCr}Operation canceled", MsgBoxStyle.Exclamation) + Return 0 + End If + If MsgBoxE({$"Do you want to delete collection only?{vbCr}Users will not be deleted", "Collection deleting"}, + MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then + Dim f As SFile = Collections(0).File.CutPath(2) + Settings.Users.Remove(Me) + Collections.ForEach(Sub(c) + c.MoveFiles(String.Empty, False) + ImageHandler(c) + End Sub) + Collections.Clear() + f.Delete(SFO.Path,,, EDP.SendInLog) + Downloader.UserRemove(Me) + ImageHandler(Me, False) + Dispose(False) + Return 3 + Else + MsgBoxE("Operation canceled") + End If + End If + End If + Return 0 + End Function + Private Sub BTT_CONTEXT_DELETE_Click(sender As Object, e As EventArgs) + With DirectCast(sender, ToolStripMenuItem) + Dim i% = AConvert(Of Integer)(.Tag, -1) + If i >= 0 Then + Dim n$ = Collections(i).Name + Dim s$ = Collections(i).Site.ToString + If MsgBoxE({$"Do you really want to delete user profile [{n}] of site [{s}]?" & vbCr & + "This profile will be removed from collection and all data will be erased", + "Profile removing"}, MsgBoxStyle.Exclamation,,, {"Process", "Cancel"}) = 0 Then + Collections(i).Delete() + Collections(i).Dispose() + Collections.RemoveAt(i) + MsgBoxE($"User profile [{n}] of site [{s}] has been removed") + If Count = 0 Then + Settings.Users.Remove(Me) + ImageHandler(Me, False) + RaiseEvent OnCollectionSelfRemoved() + Dispose(False) + End If + Else + MsgBoxE("Operation canceled") + End If + End If + End With + End Sub +#Region "IEnumerable Support" + Private Function GetEnumerator() As IEnumerator(Of IUserData) Implements IEnumerable(Of IUserData).GetEnumerator + Return New MyEnumerator(Of IUserData)(Me) + End Function + Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator + Return GetEnumerator() + End Function +#End Region +#End Region + Friend Overrides Function CompareTo(ByVal Other As UserDataBase) As Integer + If TypeOf Other Is UserDataBind Then + Dim x% = CompareValue(Me) + Dim y% = CompareValue(Other) + If x.CompareTo(y) = 0 Then + Return CollectionName.CompareTo(Other.CollectionName) + Else + Return x.CompareTo(y) + End If + Else + Return -1 + End If + End Function + Friend Overrides Function CompareTo(ByVal Obj As Object) As Integer + If TypeOf Obj Is UserDataBind Then + Return CompareTo(DirectCast(Obj, UserDataBind)) + Else + Return -1 + End If + End Function + Friend Overrides Function Equals(ByVal Other As UserDataBase) As Boolean + If Other.IsCollection Then + Return CollectionName = Other.CollectionName + Else + Return Count > 0 AndAlso Collections.Exists(Function(u) u.Equals(Other)) + End If + End Function +#Region "IDisposable Support" + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then Collections.ListClearDispose + End If + MyBase.Dispose(disposing) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/App.config b/SCrawler/App.config new file mode 100644 index 0000000..5534e28 --- /dev/null +++ b/SCrawler/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SCrawler/Channels/ChannelViewForm.Designer.vb b/SCrawler/Channels/ChannelViewForm.Designer.vb new file mode 100644 index 0000000..f2a31ba --- /dev/null +++ b/SCrawler/Channels/ChannelViewForm.Designer.vb @@ -0,0 +1,225 @@ + +Partial Friend Class ChannelViewForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim SEP_2 As System.Windows.Forms.ToolStripSeparator + Dim SEP_3 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_2 As System.Windows.Forms.ToolStripSeparator + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(ChannelViewForm)) + Me.TT_MAIN = New System.Windows.Forms.ToolTip(Me.components) + Me.ToolbarTOP = New System.Windows.Forms.ToolStrip() + Me.BTT_DOWNLOAD = New System.Windows.Forms.ToolStripButton() + Me.BTT_STOP = New System.Windows.Forms.ToolStripButton() + Me.BTT_ADD_USERS = New System.Windows.Forms.ToolStripButton() + Me.ToolbarBOTTOM = New System.Windows.Forms.StatusStrip() + Me.PR_CN = New System.Windows.Forms.ToolStripProgressBar() + Me.LBL_STATUS = New System.Windows.Forms.ToolStripStatusLabel() + Me.LIST_POSTS = New System.Windows.Forms.ListView() + Me.LCONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components) + Me.BTT_C_OPEN_USER = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_C_OPEN_POST = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_C_OPEN_PICTURE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_C_OPEN_FOLDER = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_C_ADD_TO_BLACKLIST = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_C_REMOVE_FROM_SELECTED = New System.Windows.Forms.ToolStripMenuItem() + SEP_1 = New System.Windows.Forms.ToolStripSeparator() + SEP_2 = New System.Windows.Forms.ToolStripSeparator() + SEP_3 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_2 = New System.Windows.Forms.ToolStripSeparator() + Me.ToolbarTOP.SuspendLayout() + Me.ToolbarBOTTOM.SuspendLayout() + Me.LCONTEXT.SuspendLayout() + Me.SuspendLayout() + ' + 'SEP_1 + ' + SEP_1.Name = "SEP_1" + SEP_1.Size = New System.Drawing.Size(6, 25) + ' + 'SEP_2 + ' + SEP_2.Name = "SEP_2" + SEP_2.Size = New System.Drawing.Size(6, 25) + ' + 'SEP_3 + ' + SEP_3.Name = "SEP_3" + SEP_3.Size = New System.Drawing.Size(6, 25) + ' + 'CONTEXT_SEP_1 + ' + CONTEXT_SEP_1.Name = "CONTEXT_SEP_1" + CONTEXT_SEP_1.Size = New System.Drawing.Size(302, 6) + ' + 'ToolbarTOP + ' + Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden + Me.ToolbarTOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_DOWNLOAD, Me.BTT_STOP, SEP_1, Me.BTT_ADD_USERS, SEP_2, SEP_3}) + Me.ToolbarTOP.Location = New System.Drawing.Point(0, 0) + Me.ToolbarTOP.Name = "ToolbarTOP" + Me.ToolbarTOP.Size = New System.Drawing.Size(744, 25) + Me.ToolbarTOP.TabIndex = 0 + ' + 'BTT_DOWNLOAD + ' + Me.BTT_DOWNLOAD.AutoToolTip = False + Me.BTT_DOWNLOAD.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_DOWNLOAD.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWNLOAD.Name = "BTT_DOWNLOAD" + Me.BTT_DOWNLOAD.Size = New System.Drawing.Size(104, 22) + Me.BTT_DOWNLOAD.Text = "Download (F5)" + ' + 'BTT_STOP + ' + Me.BTT_STOP.Enabled = False + Me.BTT_STOP.Image = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_STOP.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_STOP.Name = "BTT_STOP" + Me.BTT_STOP.Size = New System.Drawing.Size(51, 22) + Me.BTT_STOP.Text = "Stop" + Me.BTT_STOP.ToolTipText = "Stop downloading" + ' + 'BTT_ADD_USERS + ' + Me.BTT_ADD_USERS.Image = Global.SCrawler.My.Resources.Resources.PlusPIC + Me.BTT_ADD_USERS.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_ADD_USERS.Name = "BTT_ADD_USERS" + Me.BTT_ADD_USERS.Size = New System.Drawing.Size(49, 22) + Me.BTT_ADD_USERS.Text = "Add" + Me.BTT_ADD_USERS.ToolTipText = "Add pending users to collection (F8)" + ' + 'ToolbarBOTTOM + ' + Me.ToolbarBOTTOM.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.PR_CN, Me.LBL_STATUS}) + Me.ToolbarBOTTOM.Location = New System.Drawing.Point(0, 439) + Me.ToolbarBOTTOM.Name = "ToolbarBOTTOM" + Me.ToolbarBOTTOM.Size = New System.Drawing.Size(744, 22) + Me.ToolbarBOTTOM.TabIndex = 1 + ' + 'PR_CN + ' + Me.PR_CN.Name = "PR_CN" + Me.PR_CN.Size = New System.Drawing.Size(200, 16) + ' + 'LBL_STATUS + ' + Me.LBL_STATUS.Name = "LBL_STATUS" + Me.LBL_STATUS.Size = New System.Drawing.Size(0, 17) + ' + 'LIST_POSTS + ' + Me.LIST_POSTS.CheckBoxes = True + Me.LIST_POSTS.ContextMenuStrip = Me.LCONTEXT + Me.LIST_POSTS.Dock = System.Windows.Forms.DockStyle.Fill + Me.LIST_POSTS.HideSelection = False + Me.LIST_POSTS.Location = New System.Drawing.Point(0, 25) + Me.LIST_POSTS.MultiSelect = False + Me.LIST_POSTS.Name = "LIST_POSTS" + Me.LIST_POSTS.Size = New System.Drawing.Size(744, 414) + Me.LIST_POSTS.TabIndex = 2 + Me.LIST_POSTS.UseCompatibleStateImageBehavior = False + ' + 'LCONTEXT + ' + Me.LCONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_C_OPEN_USER, Me.BTT_C_OPEN_POST, Me.BTT_C_OPEN_PICTURE, Me.BTT_C_OPEN_FOLDER, CONTEXT_SEP_1, Me.BTT_C_REMOVE_FROM_SELECTED, CONTEXT_SEP_2, Me.BTT_C_ADD_TO_BLACKLIST}) + Me.LCONTEXT.Name = "LCONTEXT" + Me.LCONTEXT.Size = New System.Drawing.Size(306, 170) + ' + 'BTT_C_OPEN_USER + ' + Me.BTT_C_OPEN_USER.Name = "BTT_C_OPEN_USER" + Me.BTT_C_OPEN_USER.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_OPEN_USER.Text = "Open user" + ' + 'BTT_C_OPEN_POST + ' + Me.BTT_C_OPEN_POST.Name = "BTT_C_OPEN_POST" + Me.BTT_C_OPEN_POST.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_OPEN_POST.Text = "Open post" + ' + 'BTT_C_OPEN_PICTURE + ' + Me.BTT_C_OPEN_PICTURE.Name = "BTT_C_OPEN_PICTURE" + Me.BTT_C_OPEN_PICTURE.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_OPEN_PICTURE.Text = "Open picture" + ' + 'BTT_C_OPEN_FOLDER + ' + Me.BTT_C_OPEN_FOLDER.Name = "BTT_C_OPEN_FOLDER" + Me.BTT_C_OPEN_FOLDER.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_OPEN_FOLDER.Text = "Open folder" + ' + 'BTT_C_ADD_TO_BLACKLIST + ' + Me.BTT_C_ADD_TO_BLACKLIST.Name = "BTT_C_ADD_TO_BLACKLIST" + Me.BTT_C_ADD_TO_BLACKLIST.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_ADD_TO_BLACKLIST.Text = "Add/Remove this user to/from the BlackList" + ' + 'CONTEXT_SEP_2 + ' + CONTEXT_SEP_2.Name = "CONTEXT_SEP_2" + CONTEXT_SEP_2.Size = New System.Drawing.Size(302, 6) + ' + 'BTT_C_REMOVE_FROM_SELECTED + ' + Me.BTT_C_REMOVE_FROM_SELECTED.AutoToolTip = True + Me.BTT_C_REMOVE_FROM_SELECTED.Name = "BTT_C_REMOVE_FROM_SELECTED" + Me.BTT_C_REMOVE_FROM_SELECTED.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_REMOVE_FROM_SELECTED.Text = "Remove user from selected" + Me.BTT_C_REMOVE_FROM_SELECTED.ToolTipText = "Remove this user from selected users if user was added to" + ' + 'ChannelViewForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(744, 461) + Me.Controls.Add(Me.LIST_POSTS) + Me.Controls.Add(Me.ToolbarBOTTOM) + Me.Controls.Add(Me.ToolbarTOP) + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.KeyPreview = True + Me.MinimumSize = New System.Drawing.Size(760, 500) + Me.Name = "ChannelViewForm" + Me.Text = "Channels" + Me.ToolbarTOP.ResumeLayout(False) + Me.ToolbarTOP.PerformLayout() + Me.ToolbarBOTTOM.ResumeLayout(False) + Me.ToolbarBOTTOM.PerformLayout() + Me.LCONTEXT.ResumeLayout(False) + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Private WithEvents ToolbarTOP As ToolStrip + Private WithEvents ToolbarBOTTOM As StatusStrip + Private WithEvents LIST_POSTS As ListView + Private WithEvents PR_CN As ToolStripProgressBar + Private WithEvents LBL_STATUS As ToolStripStatusLabel + Private WithEvents BTT_DOWNLOAD As ToolStripButton + Private WithEvents TT_MAIN As ToolTip + Private WithEvents BTT_STOP As ToolStripButton + Private WithEvents BTT_ADD_USERS As ToolStripButton + Private WithEvents LCONTEXT As ContextMenuStrip + Private WithEvents BTT_C_OPEN_USER As ToolStripMenuItem + Private WithEvents BTT_C_OPEN_POST As ToolStripMenuItem + Private WithEvents BTT_C_OPEN_PICTURE As ToolStripMenuItem + Private WithEvents BTT_C_OPEN_FOLDER As ToolStripMenuItem + Private WithEvents BTT_C_ADD_TO_BLACKLIST As ToolStripMenuItem + Private WithEvents BTT_C_REMOVE_FROM_SELECTED As ToolStripMenuItem +End Class \ No newline at end of file diff --git a/SCrawler/Channels/ChannelViewForm.resx b/SCrawler/Channels/ChannelViewForm.resx new file mode 100644 index 0000000..0eaaeec --- /dev/null +++ b/SCrawler/Channels/ChannelViewForm.resx @@ -0,0 +1,1280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + False + + + False + + + False + + + 241, 17 + + + 17, 17 + + + 124, 17 + + + 342, 17 + + + False + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/wMARv8PAEX/IgBF/0AARf9fAEX/fQBF/5wARf+6AEX/zQBF + /90ARf/rAEX/8wBF//gARf/8AEX//ABF//gARf/zAEX/6wBF/90ARf/NAEX/ugBF/5wARf99AEX/XwBF + /0AARf8iAEb/DwBG/wMARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAR/8DAEb/FABG/zQARf9dAEX/iwBF + /7MARf/RAEX/5wBF//QARf/6AEX//gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF//oARf/0AEX/5wBF/9EARf+zAEX/iwBF/10ARv80AEb/FABH + /wMAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASf8AAD//AABG + /wYARv8iAEX/UwBF/4sARf/AAEX/5QBF//cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9wBF/+UARf/AAEX/iwBF/1MARv8iAEb/BgA//wAASf8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/AwBF/x4ARv9WAEX/mQBF/9MARf/0AEX//gBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/+AEX/9ABF/9MARf+ZAEb/VgBF/x4ARv8DAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAJv8AAEb/DABF/zsARf+FAEX/zABF + //QARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/0AEX/zABF + /4UARf87AEb/DAAm/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAASv8AAEb/EwBF/1AARf+nAEX/5gBF//0ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//QBF/+YARf+nAEX/UABG/xMASv8AAEf/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAT/8AAEb/FABF/1oARf+3AEX/8ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/wAEX/twBF/1oARv8UAE//AABH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI/wAAQ/8AAEX/DgBF + /1QARf+2AEX/8gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8gBF + /7YARf9UAEX/DgBD/wAASP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/BgBG/z4ARf+mAEX/8ABF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+mAEb/PgBG/wYARv8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAFP/AABG/yAARf+FAEX/4wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/jAEX/hQBG/yAAU/8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEb/AABG/wkARf9SAEX/wwBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/7AEX/wwBF + /1IARv8JAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARv8eAEX/igBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/4oARv8eADz/AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARv8DAEX/QABF/7sARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/+wBF/7sARf9AAEf/AwBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEb/CgBF/2MARf/cAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9wARf9jAEb/CgBG + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF + /xUARf+HAEX/7wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+8ARf+HAEX/FQBF/wAARf8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEf/AABD/wAARf8hAEX/oQBF//gARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //gARf+hAEX/IQBD/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAQv8AAEb/LQBF + /7UARf/8AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//wARf+1AEX/LQBB/wAAR/8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAD3/AABG/zMARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/AAEb/MwA9/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARf83AEX/xgBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/GAEX/NwA8 + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABG/wAAQ/8AAEb/MwBF/8YARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/GAEb/MwBD/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAET/AABF/ywARf/AAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/AAEX/LABE/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABF/wAARf8hAEX/tQBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+1AEX/IQBF/wAARf8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/FQBF/6EARf/9AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//0ARf+hAEX/FQBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABG/woARf+HAEX/+QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//kARf+HAEb/CgBF + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAASP8CAEX/YwBF/+4ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+4ARf9jAEj/AgBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARv8AAEP/AABF/0AARf/cAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AET//wBE//8AQ///AEP//wBC//8AQv//AEP//wBD//8AQ///AEP//wBC//8AQv//AEP//wBD + //8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /9wARf9AAEP/AABG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARf8eAEX/uwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//wBD//8AQ///AUT//wZJ//8QUP//HFn//yxk//87b///SHj//1F/ + //9Xhf//W4f//1uH//9Xhf//UX///0h4//87b///K2T//xxZ//8QUP//Bkn//wFE//8AQ///AEP//wBE + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/7sARf8eAEX/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARv8AAEf/CABF/4oARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///AEP//wNG//8RUf//L2f//1WC + //97n///n7j//7vN///Q3f//4en//+rw///x9f//9ff///b5///3+f//9/n///b5///19///8fX//+rw + ///g6f//0N3//7rM//+euP//e57//1SB//8uZv//EVH//wNG//8AQ///AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/+wBF/4oAR/8IAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABC/wAARf9TAEX/6wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8AQ///Bkn//yNe//9Wg///i6r//7vO///h6f//9fj///7+//////////////////////////////// + ///////////////////////////////////////////////////////////////////9/v//9fj//+Hp + //+6zf//iqn//1WC//8iXf//Bkn//wBD//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/1MAQv8AAEb/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARf8AAEX/IABF/8MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBD//8CRf//HVn//1eE//+atf//1N////X3//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9Pf//9Pf//+ZtP//VoP//xxZ + //8CRf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/wwBF/yAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABH/wUARf+FAEX//ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8GSP//MGf//3uf + ///J1///9Pf///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////09///x9b//3qd//8uZv//Bkj//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/8AEX/hQBG + /wUARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI + /wAARP8AAEb/PgBF/+IARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//8FR///MWj//42s///d5v///P3///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////+/z//9zl//+Lqv//L2f//wRH//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/iAEX/PgBE/wAASP8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/w4ARf+lAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8BRP//JmD//4Sl///b5f///f7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////39///a5P//gqT//yRf + //8BRP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf+lAEb/DgBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAAQv8AAEX/VABF/+8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///DU3//1+K///M2v///P3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/P//ytn//1yI//8MTf//AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/+8ARf9UAEL/AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/xQARf+1AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//yZf//+ZtP//8fX///////////////////// + //////////////////////////////////////////////////////////////////////////////39 + ///09///6O7//9vl///O2///xNT//77Q//++0P//w9P//87b///b5f//6O7///T3///9/f////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8PT//5ez//8kXv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/7UARv8UAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARP8AAEX/WgBF//MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wJF + //9Cdf//xNP///39//////////////////////////////////////////////////////////////// + ///////////////////9/v//7fL//8nX//+dt///dZr//1KA//84bP//JV///xtY//8VVP//ElL//xFS + //8VVP//Glj//yVf//83bP//UoD//3SZ//+dt///yNf//+zx///9/v////////////////////////// + /////////////////////////////////////////////////////////f3//8HS//9Ac///AkX//wBE + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8wBF/1oARP8AAEb/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABF/xMARf+3AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8FR///WYb//9zl//////////////////////////////// + ///////////////////////////////////////////////////4+v//y9n//4Sl//9Ddf//GVf//wZJ + //8ARP//AEP//wBD//8AQ///AEP//wBD//8ARP//AET//wBD//8AQ///AEP//wBD//8AQv//AET//wZJ + //8ZVv//QnT//4Ok///K2P//9/n///////////////////////////////////////////////////// + /////////////////////////////9rk//9Wg///BEf//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/twBF/xMARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAARP8AAEX/UABF//AARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Bkj//2SN + ///m7f////////////////////////////////////////////////////////////////////////// + ///8/f//zNn//2qS//8fW///A0b//wBD//8ARP//AET//wBD//8AQv//AEP//wFF//8ER///CEr//wlL + //8JS///CEn//wRH//8BRf//AEP//wBC//8AQ///AET//wBE//8AQ///A0b//x5a//9okf//ytj///v8 + /////////////////////////////////////////////////////////////////////////////+Tr + //9hi///BUf//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/wAEX/UABE + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/wwARf+nAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wNG//9gi///6O7///////////////////////////////////// + ////////////////////////////////////////8vX//5Sw//8lX///AUT//wBD//8ARP//AEP//wJF + //8PT///KGL//0l5//9nkP//gqT//5ay//+kvP//q8H//6vB//+kvP//lrL//4Ok//9nkf//Snr//yli + //8PT///AkX//wBD//8ARP//AEP//wFE//8kXv//ka7///H1//////////////////////////////// + /////////////////////////////////////////////+bt//9diP//A0b//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+nAEb/DABF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAABI + /wAARf8AAEX/OwBF/+YARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Tn3//+Hp + //////////////////////////////////////////////////////////////////////////////H1 + //93m///DE3//wBD//8ARP//AEP//w1O//88cP//faD//7bJ///c5f//8fX///r7//////////////// + //////////////////////////////r8///x9f//3Ob//7bK//9+of//PXH//w5O//8AQ///AET//wBD + //8LTP//dJn///D0//////////////////////////////////////////////////////////////// + /////////////+Do//9Le///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /+YARf87AEX/AABG/wAAAAAAAAAAAAAAAAAAAAAAAEb/AABH/wMARf+FAEX//gBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEP//zBn///P3P////////////////////////////////////////// + ////////////////////////////////////////uMv//xFQ//8AQ///AET//wpL//9MfP//qsH//+fu + ///9/f////////////////////////////////////////////////////////////////////////// + //////////////3+///o7v//rML//059//8KS///AET//wBD//8QTv//tMj///////////////////// + /////////////////////////////////////////////////////////////8za//8tZf//AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//gBF/4UASP8DAEb/AAAAAAAAAAAAAAAAAAAA + AAAARf8AAEX/HgBF/8wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8SUf//pr7///// + //////////////////////////////////////////////////////////////////////////////// + //++z///F1T//wBB//8ZVv//i6r//+vw//////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////7PH//46s + //8aV///AEL//xVT//+7zf////////////////////////////////////////////////////////// + /////////////////////////////6O8//8QUP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/zABG/x4ARv8AAAAAAAAAAAAAAAAAAEb/AABF/wAARf9WAEX/9ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AUX//2eQ///19/////////////////////////////////////////// + //////////////////////////////////////////////X4//+euP//aZH//7DF///5+/////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+vv//7LH//9pkf//m7b///X3//////////////// + ////////////////////////////////////////////////////////////////////////8/b//2ON + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/0AEX/VgBF/wAARv8AAAAAAAAA + AAAARv8AAEb/BgBF/5kARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8kXv//zdr///// + //////////////////////////////////////////////////////////////////////////////// + //////////////7+///7/P///v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v8///+/v////////////////////////////////////////////////////////// + ////////////////////////////////////////ytj//yFd//8ARP//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf+ZAEb/BgBG/wAAAAAAAAAAAABF/wAARv8iAEX/0wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AUX//3ab///7/P////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///6/P//cpj//wFF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9MARv8iAEX/AAAA + AAAAR/8AAEX/AABF/1MARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8bWP//yNf///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////E1P//GVf//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9ABF/1MARf8AAEf/AABG/wAASP8DAEX/iwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEP//1SB///z9v////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////L1//9Qfv//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/iwBI + /wMARv8AAEb/AABG/xQARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ER///k6////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////46s//8DR///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEb/FABG/wAARf8AAEb/NABF/+UARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//xVU///D0/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////v9D//xNS//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /+UARv80AEX/AABF/wAARf9cAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///LmX//+Hp + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////f5///KmP//wBD + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+ABF/1wARf8AAEj/AwBF/4sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBC//9Gd///8PT///////////////////////////////////// + //////////////////////////////////////////////////////////////X3///Q3f//r8T//6a+ + //+4y///3uf///v8//////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+/z//97n//+3y///pr3//67E + ///Q3f//9ff///////////////////////////////////////////////////////////////////// + /////////////////////////////+/z//9DdP//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/iwBI/wMARv8PAEX/swBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//1WD + ///2+P////////////////////////////////////////////////////////////////////////// + //////////////3+///H1v//YIv//x9b//8LTP//CEr//w5P//8uZv//gaP//+Lq//////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+Lq//+Bo///Lmb//w5P//8ISv//C0z//x9b//9giv//x9b///39//////////////// + ////////////////////////////////////////////////////////////////////////9ff//1GA + //8AQv//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+zAEb/DwBF/yIARf/RAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///XIj///j6//////////////////////////////// + ///////////////////////////////////////////////////9/v//rcP//ydh//8AQ///AEP//wBE + //8ARP//AET//wBD//8ER///S3z//9bh//////////////////////////////////////////////// + ///////////////////////////////////////////////////W4f//S3v//wRH//8AQ///AET//wBE + //8ARP//AEP//wBD//8mYP//rcL///3+//////////////////////////////////////////////// + ///////////////////////////////////3+f//WIX//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/9EARf8iAEX/QABF/+cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9Yhf//9/n///////////////////////////////////////////////////////////////////// + /////////////8fW//8nYf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8ARP//VoP//+vx + //////////////////////////////////////////////////////////////////////////////// + ////////6/H//1aD//8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8nYP//x9b///// + //////////////////////////////////////////////////////////////////////////////b4 + //9Ugv//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5wBF/0AARf9fAEX/8wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEH//0p5///y9v////////////////////////// + ///////////////////////////////////////////////////1+P//YIv//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8LTP//oLn///////////////////////////////////// + //////////////////////////////////////////////////+guf//C0z//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBD//9gi///9fj///////////////////////////////////// + ////////////////////////////////////////8fX//0d2//8AQf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/zAEX/XwBF/30ARf/6AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //8PT///dZr///X4//////////////////////////////////////////////////////////////// + /////////////9Dd//8fW///AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9Ugf//9Pf///////////////////////////////////////////////////////////////////// + ////////9Pf//1SB//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//x9b + ///Q3f////////////////////////////////////////////////////////////////////////// + ///09///dZr//xFQ//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//oARf99AEX/nABF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//K2T//6W9///y9v////////////////////////// + ////////////////////////////////////////////////////////r8T//wtM//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//y9m///j6/////////////////////////// + ///////////////////////////////////////////////////j6///L2b//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//C0z//6/E//////////////////////////////// + ///////////////////////////////////////////////////z9v//qL///y1l//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF/5wARf+6AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//zBn + ///C0v////////////////////////////////////////////////////////////////////////// + //////////////////+mvv//CEr//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///JmD//97n//////////////////////////////////////////////////////////////// + /////////////97n//8mYP//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8ISv//pr7///////////////////////////////////////////////////////////////////// + ////////////////////////xNT//zNp//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/ugBF + /84ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8aV///s8f///////////////////////////////////// + /////////////////////////////////////////////////////////////7jL//8PT///AET//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//84bf//6O7///////////////////// + ////////////////////////////////////////////////////////6O7//zht//8AQ///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//w9P//+4y/////////////////////////// + ////////////////////////////////////////////////////////////////////////tsr//xxY + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/OAEX/3QBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//Akb//3Wa + ///6+/////////////////////////////////////////////////////////////////////////// + ////////////////////////3uf//y9m//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEP//2mR///5+/////////////////////////////////////////////////////////// + ///////////////////5+///aZH//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///L2b//97n//////////////////////////////////////////////////////////////// + ///////////////////////////////////6/P//eZ3//wJG//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /90ARf/rAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8fW///zdr///////////////////////////////////// + ///////////////////////////////////////////////////////////////////8/f//gqP//wRH + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8aVv//vc////////////////////// + //////////////////////////////////////////////////////////////////+9z///Glb//wBD + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wRH//+Co////P3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///Q3P//Il3//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF//MARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//1KA + ///09/////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////i6v//THz//wBE//8ARP//AEX//wBF//8ARf//AEX//wBF + //8AQ///Ckv//4Kk///5+v////////////////////////////////////////////////////////// + //////////////////////////////n6//+CpP//Ckv//wBD//8ARf//AEX//wBF//8ARf//AEX//wBE + //8ARP//THz//+Lq//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////X4//9Wg///AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/zAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//faD///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///X4f//VoP//wpM//8AQv//AEP//wBD//8AQ///AEP//xlW//+CpP//7/T///////////////////// + /////////////////////////////////////////////////////////////////////////////+/0 + //+CpP//GVb//wBD//8AQ///AEP//wBD//8AQ///Ckz//1aD///X4f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////4Kj//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//gARf/8AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wRH + //+UsP////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////s8f//oLn//1SB//8vZv//JmD//zht + //9okf//vc////j6//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////j6//+9z///aJH//zht//8mYP//L2b//1SB + //+guf//6/H///////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////mLP//wVH//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//ABF//wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//BEf//5ay//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9Pf//+Pr///e5///6O7///n7//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////5+///6O7//97n///j6///9Pf///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+atf//BUj//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/8AEX/+ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARP//f6L///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////4Ol//8BRf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//gARf/zAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//9Ugv//9Pf///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////2+P//WIT//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8wBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEP//yBc///O2/////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9Hd//8jXv//AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/rAEX/3QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//Akb//3ic///6+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////7/P//e5///wNG//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/90ARf/OAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARP//G1j//7XJ//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////7jL//8dWf//AET//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/zgBF/7oARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Mmn//8TU + /////////////////////////////////////////////////////////////+vw///a5P///P3///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/z//9jj///q7/////////////////////////////////////////// + ///////////////////H1v//NWv//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+6AEX/nABF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//LmX//6i////z9/////////////////////////// + //////////////z9///Q3P//Wob//y1l//+Usf//7fL///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+zx//+Sr///K2T//1eE + ///O2////P3////////////////////////////////////////09///q8H//zBn//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF/5wARf99AEX/+gBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///ElH//12I//+wxf//4On///P2///3+f//9fj//+rw///H1v//gKL//yli//8BRf//AEP//wtM + //9Ugv//vc7///f5//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////b4//+7zf//UoH//wpL//8AQ///AUX//yhh//9+of//x9b//+rw///1+P//9/n///P2 + ///h6f//ssb//1+K//8TUv//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/6AEX/fQBF + /18ARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AET//w5P//8uZv//THz//1mG + //9Tgf//O2///xlX//8DRv//AEP//wBF//8ARf//AET//wBE//8YVv//aZH//8jX///3+f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////f5///H1v//Z5D//xdV//8ARP//AET//wBF + //8ARf//AEP//wNG//8YVv//O2///1OB//9Zhv//TXz//y9m//8PT///AET//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//MARf9fAEX/QABF/+cARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//wBD//8AQv//AEP//wBC//8AQ///AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBE//8BRP//Hlr//2WO//+6zP//8PT///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+/0 + //+5zP//ZI3//x1Z//8BRP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AEL//wBD + //8AQv//AEP//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5wBF + /0AARf8iAEX/0QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AET//xRT + //9Nff//lbH//9Pf///2+P////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9vj//9Le//+TsP//THz//xRT//8ARP//AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/RAEX/IgBG/w8ARf+zAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wBD//8FSP//I17//1qG//+Usf//x9b//+rw + ///6/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////r7///r8P//x9b//5Sw//9Zhf//I13//wVI + //8AQ///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /7MARv8PAEb/AwBF/4sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8AQ///AEP//wVH//8YVv//PnH//2iR//+Sr///uMv//9fi///p7///9Pf///r7 + ///+/v/////////////////////////////////////////////+/v//+vv///P2///n7v//1uH//7nM + //+Sr///Z5D//z5x//8YVv//BUf//wBD//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/iwBI/wMARf8AAEX/XABF//gARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8AQ///AEP//wRH//8PUP//Il3//zlu//9Qf///ZY///3id//+IqP//kq///8fW///+/v///////+7y + //+guf//iKj//3qd//9mj///Tn3//zZr//8hXP//EFD//wRH//8AQ///AEP//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //gARf9cAEX/AABF/wAARv80AEX/5QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AEP//wBC + //8AQ///AET//wFF//8BRf//YIr///j6////////4+v//zNp//8AQ///AET//wBD//8AQv//AEP//wBD + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5QBG/zQARf8AAEb/AABG/xQARf/AAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBC//84bf//6O7///// + ///1+P//VYL//wBC//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/AAEb/FABG/wAARv8AAEj/AwBF/4sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//xpY///M2f////////////9/of//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/4sASP8DAEb/AABH/wAARf8AAEX/UwBF + //QARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//CUv//6e+ + /////////////6rA//8KS///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/0AEX/UwBF/wAAR/8AAAAAAABF/wAARv8iAEX/0wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//fJ////7+////////ztv//xxZ//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9MARv8iAEX/AAAAAAAAAAAAAEb/AABH + /wYARf+ZAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9SgP//9Pf////////p7///Om///wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/mQBH/wYARv8AAAAAAAAAAAAAR/8AAEX/AABG/1YARf/0AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//y5m///h6f////////j6//9hi///AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//QARv9WAEX/AABH/wAAAAAAAAAAAAAA + AAAARf8AAEX/HgBF/8wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARP//FFP//8LS/////////////4yr//8CRv//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/zABG/x4ARv8AAAAAAAAAAAAAAAAAAAAAAABG/wAAR/8DAEX/hQBF//4ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8GSP//m7b/////////////tcn//w5P + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//4ARf+FAEj/AwBG/wAAAAAAAAAAAAAA + AAAAAAAAAEj/AABF/wAARf87AEX/5gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//9vlv///P3////////X4v//JF7//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///Akb//wZI + //8ER///AEP//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/5gBF/zsARf8AAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/wwARf+nAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEL//0d4///w9P///////+/z + //9Fdv//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARP//F1X//1KA//+IqP//nrj//5Sw//9qkv//KmP//wNG//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+nAEb/DABF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAET/AABF/1EARf/wAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8AQ///JV///9nj////////+/z//22U//8AQ///AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//A0b//0V3//+6zP//8/b///// + //////////////r8///V4P//b5X//w5O//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/8ABF/1EARP8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEb/EwBF + /7cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8PT///t8r///// + ////////mbT//wVI//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//9Nff//3eb////////////////////////////////////////09///haX//wtM + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+3AEb/EwBF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAQv8AAEX/WgBF//MARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wNG//+Prf/////////////A0f//E1L//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///JWD//8rZ//////////////// + ///////////////////////////////////v8///Wob//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/8wBF/1oAQv8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARv8UAEX/tQBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//2ON + ///5+////////+Do//8sZf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//92m////P3///////////////////////////////////////////////////// + //+7zf//FFP//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+1AEb/FABG/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AABC/wAARf9UAEX/7wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///PHD//+vw////////9Pf//1B///8AQ///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQv//Dk3//7XJ//////////////// + /////////////////////////////////////////////+rw//88cP//AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/7wBF/1QAQv8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABG/w4ARf+lAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8dWv//0N3////////+/v//ep3//wBE//8ARf//AEX//wBF//8ARf//AEX//wBE//8ARP//AEP//wBD + //8DRv//Dk///yNe//9Xg///3+f///////////////////////////////////////////////////// + ////////9vj//1aD//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+lAEb/DgBF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASP8AAET/AABF/z4ARf/iAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wpM//+swv////////////+lvf//CEr//wBE + //8ARP//AEP//wBC//8BRf//Ckz//xxZ//87b///Yoz//42s//+2yv//2OP///D0///+/v////////// + ///////////////////////////////////////////////////2+P//VoP//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/4gBF/z4ARP8AAEj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/BQBF/4UARf/8AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AUX//4Kj/////////////8rY//8ZVv//BUj//xZV//8xaP//VoP//4Ci//+rwf//z9z//+rv + ///5+v////////////////////////////////////////////////////////////////////////// + /////////////+rw//88cP//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//wARf+FAEb/BQBG/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEb/IABF + /8MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQv//V4T///b4////////7fL//5Cu + //+dt///xdX//+Tr///1+P///v7///////////////////////////////////v8///u8///5+3///z9 + ////////////////////////////////////////////////////////u83//xRT//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/wwBG/yAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAP/8AAEX/UwBF/+sARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//8yaf//5Ov//////////////v7///////////////////////////////////3+ + ///09///4On//8HR//+atf//bpX//0R2//9Bc///y9n///////////////////////////////////// + /////////////+/z//9ahv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/+sARf9TAD//AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAAR/8IAEX/igBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//xZV///F1f////////// + ///////////////////3+f//5+7//8vZ//+mvv//e57//1F///8tZf//FFP//wVI//8AQ///AEL//wBD + //9Nff//3eb////////////////////////////////////////09///haX//wtM//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/7AEX/igBH/wgARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARf8eAEX/uwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//BEf//3ic///t8v//7fL//9Xg//+xxv//iKj//12I//83bP//Glf//wlK + //8BRP//AEP//wBD//8ARP//AEX//wBF//8ARf//AEX//wNG//9Gd///us3///P3//////////////// + ///6/P//1eD//2+V//8OTv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/7sARf8eAEX/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEb/AABD/wAARf9AAEX/3ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Dk7//0J0 + //9Bc///IVz//wxN//8CRv//AEP//wBD//8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBE//8YVf//VIL//4io//+dt///lLD//2qS//8qY///A0b//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/cAEX/QABD/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABI/wIARf9jAEX/7gBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AEP//wBD//8AQ///AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AkX//wZI + //8ER///AEP//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/7gBF/2MASP8CAEb/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/woARf+HAEX/+QBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //kARf+HAEb/CgBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABF + /xUARf+hAEX//QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/9AEX/oQBF/xUARf8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF/yEARf+1AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /7UARf8hAEX/AABF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAET/AABG/ywARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEX/LABE/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEP/AABG/zMARf/GAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/xgBG + /zMAQ/8AAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AADz/AABF/zcARf/GAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/8YARf83ADz/AABH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAD3/AABG + /zMARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEb/MwA9 + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAEH/AABF/y0ARf+1AEX//ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/8AEX/tQBF/y0AQf8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAEP/AABF/yEARf+hAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+ABF/6EARf8hAEP/AABH + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF/xUARf+HAEX/7wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/+8ARf+HAEX/FQBF/wAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/woARf9jAEX/3ABF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/cAEX/YwBG/woARv8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABH + /wMARf9AAEX/uwBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/7AEX/uwBF/0AAR/8DAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARv8eAEX/igBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/4oARv8eAD//AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABG/wAARv8JAEX/UgBF/8MARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+wBF + /8MARf9SAEb/CQBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAASP8AAEX/IABF + /4UARf/jAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+MARf+FAEX/IABI/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEb/BgBG/z4ARf+mAEX/8ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+mAEb/PgBG + /wYARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAASP8AAEP/AABF/w4ARf9UAEX/tQBF//IARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//IARf+1AEX/VABF/w4AQ/8AAEj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AABP/wAARv8UAEX/WgBF + /7cARf/wAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+3AEX/WgBG/xQAT/8AAEf/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARP8AAEX/EwBF/1AARf+nAEX/5gBF//0ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//QBF + /+YARf+nAEX/UABF/xMARP8AAEX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AACf/AABG/wwARf87AEX/hQBF/8wARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9ABF/8wARf+FAEX/OwBG/wwAJ/8AAEf/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAAR/8DAEb/HgBF + /1YARf+YAEX/0wBF//QARf/+AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//4ARf/0AEX/0wBF/5gARf9WAEb/HgBH + /wMARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASf8AAD//AABG/wYARv8iAEX/UwBF/4sARf/AAEX/5QBF + //cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/9wBF + /+UARf/AAEX/iwBF/1MARv8iAEb/BgA//wAASf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAEf/AwBG/xQARv80AEX/XQBF/4sARf+zAEX/0QBF/+cARf/0AEX/+gBF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //4ARf/6AEX/9ABF/+cARf/RAEX/swBF/4sARf9dAEb/NABG/xQAR/8DAEf/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAEf/AwBG/w8ARf8iAEX/QABF/18ARf99AEX/nABF/7oARf/NAEX/3QBF/+sARf/zAEX/+ABF + //wARf/8AEX/+ABF//MARf/rAEX/3QBF/80ARf+6AEX/nABF/30ARf9fAEX/QABF/yIARv8PAEf/AwBH + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////wAAAA////////////////AAAAAA//////////////+AAAAAA + B/////////////8AAAAAAAD////////////8AAAAAAAAP///////////8AAAAAAAAA///////////8AA + AAAAAAAD//////////8AAAAAAAAAAP/////////8AAAAAAAAAAA/////////+AAAAAAAAAAAH/////// + /+AAAAAAAAAAAAf////////AAAAAAAAAAAAD////////AAAAAAAAAAAAAP///////gAAAAAAAAAAAAB/ + //////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAP/////+AAAAAAAAAA + AAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAP////4AAAAA + AAAAAAAAAAB////8AAAAAAAAAAAAAAAAP///+AAAAAAAAAAAAAAAAB////AAAAAAAAAAAAAAAAAP///w + AAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAAAAAD///AAAAAAAAAAAAAAAAA + A///gAAAAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAA + AAAAAAB//gAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA/+AAAAAAA + AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAA + AAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAA + AA/wAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAA + AAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//wAAAAAA + AAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//gAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAD///A + AAAAAAAAAAAAAAAAA///4AAAAAAAAAAAAAAAAAf///AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAA + D///+AAAAAAAAAAAAAAAAB////wAAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAf////wAAAAAAAAAA + AAAAAP////+AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAB//////wAAAA + AAAAAAAAAA//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAP//////+AAAAAAAAAAAAAH////// + /wAAAAAAAAAAAAD////////AAAAAAAAAAAAD////////4AAAAAAAAAAAB/////////gAAAAAAAAAAB// + ///////8AAAAAAAAAAA//////////wAAAAAAAAAA///////////AAAAAAAAAA///////////8AAAAAAA + AA////////////wAAAAAAAA/////////////AAAAAAAA/////////////+AAAAAAB//////////////8 + AAAAAD///////////////8AAAAP///////8= + + + \ No newline at end of file diff --git a/SCrawler/Channels/ChannelViewForm.vb b/SCrawler/Channels/ChannelViewForm.vb new file mode 100644 index 0000000..7673c11 --- /dev/null +++ b/SCrawler/Channels/ChannelViewForm.vb @@ -0,0 +1,704 @@ +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Tools +Imports System.ComponentModel +Imports System.Threading +Imports SCrawler.API.Base +Imports SCrawler.API.Reddit +Imports CmbDefaultButtons = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons +Imports RButton = PersonalUtilities.Tools.RangeSwitcherButton.Types +Friend Class ChannelViewForm : Implements IChannelLimits + Friend Event OnUsersAdded(ByVal StartIndex As Integer) +#Region "Declarations" + Private ReadOnly MyDefs As DefaultFormProps +#Region "Controls" + Private WithEvents CMB_CHANNELS As ComboBoxExtended + Private WithEvents CH_HIDE_EXISTS_USERS As CheckBox + Private WithEvents TXT_LIMIT As TextBoxExtended + Private ReadOnly LBL_LIMITS As ToolStripLabel + Private ReadOnly LBL_LIMIT_TEXT As ToolStripLabel + Private WithEvents OPT_LIMITS_DEFAULT As RadioButton + Private WithEvents OPT_LIMITS_COUNT As RadioButton + Private WithEvents OPT_LIMITS_POST As RadioButton + Private WithEvents OPT_LIMITS_DATE As RadioButton +#End Region + Private ReadOnly CProvider As ANumbers + Private ReadOnly CProgress As MyProgress + Private ReadOnly LimitProvider As ADateTime + Friend ReadOnly Property ImagesInRow As Integer + Get + Return Settings.ChannelsImagesColumns.Value + End Get + End Property + Friend ReadOnly Property ImagesRows As Integer + Get + Return Settings.ChannelsImagesRows.Value + End Get + End Property +#Region "Limits Support" + Private Property AutoGetLimits As Boolean Implements IChannelLimits.AutoGetLimits + Get + Return OPT_LIMITS_DEFAULT.Checked + End Get + Set(ByVal NewLimit As Boolean) + End Set + End Property + Private Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount + Get + If OPT_LIMITS_COUNT.Checked Then + Return AConvert(Of Integer)(TXT_LIMIT.Text, Nothing) + Else + Return Nothing + End If + End Get + Set(ByVal NewLimit As Integer?) + End Set + End Property + Private Property DownloadLimitPost As String Implements IChannelLimits.DownloadLimitPost + Get + If OPT_LIMITS_POST.Checked Then + Return TXT_LIMIT.Text + Else + Return String.Empty + End If + End Get + Set(ByVal NewLimit As String) + End Set + End Property + Private Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate + Get + If OPT_LIMITS_DATE.Checked Then + Return AConvert(Of Date)(TXT_LIMIT.Value, Nothing) + Else + Return Nothing + End If + End Get + Set(ByVal NewDate As Date?) + End Set + End Property + Private Sub SetLimit(Optional ByVal Post As String = "", Optional ByVal Count As Integer? = Nothing, + Optional ByVal [Date] As Date? = Nothing) Implements IChannelLimits.SetLimit + End Sub + Private Sub SetLimit(ByVal Source As IChannelLimits) Implements IChannelLimits.SetLimit + End Sub +#End Region + Friend ReadOnly PendingUsers As List(Of String) + Private ReadOnly LNC As New ListAddParams(LAP.NotContainsOnly) + Private WithEvents MyRange As RangeSwitcher(Of UserPost) + Private ReadOnly SelectorExpression As Predicate(Of UserPost) = Function(ByVal Post As UserPost) As Boolean + If Post.UserID.ToLower = "[deleted]" Or Settings.BlackList.Contains(Post.UserID) Then + Return False + Else + If CH_HIDE_EXISTS_USERS.Checked Then + Return Not Settings.UsersList.Exists(Function(u) u.Name = Post.UserID) + Else + Return True + End If + End If + End Function +#End Region +#Region "Initializer and form methods" + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps + CProgress = New MyProgress(ToolbarBOTTOM, PR_CN, LBL_STATUS, "Downloading data") With {.PerformMod = 10, .DropCurrentProgressOnTotalChange = False} + CProvider = New ANumbers(ANumbers.Modes.USA) With {.GroupSize = 3, .DecimalDigits = 0} + LimitProvider = New ADateTime("dd.MM.yyyy HH:mm") + PendingUsers = New List(Of String) + + CMB_CHANNELS = New ComboBoxExtended With { + .CaptionMode = ICaptionControl.Modes.CheckBox, + .CaptionText = "All Channels", + .Margin = New Padding(3), + .ChangeControlsEnableOnCheckedChange = False, + .CaptionBackColor = Color.Transparent, + .ListMaxDropDownItems = 15, + .CaptionPadding = New Padding(0, 3, 0, 0) + } + CMB_CHANNELS.Buttons.AddRange({CmbDefaultButtons.Refresh, CmbDefaultButtons.Add, CmbDefaultButtons.Delete, + New ActionButton(CmbDefaultButtons.Up) With {.ToolTipText = "Previous item (F1)"}, + New ActionButton(CmbDefaultButtons.Down) With {.ToolTipText = "Next item (F4)"}}) + TXT_LIMIT = New TextBoxExtended With { + .CaptionText = "Limit", + .Margin = New Padding(2), + .CaptionSizeType = SizeType.Absolute, + .CaptionWidth = 50, + .CaptionBackColor = Color.Transparent, + .TextBoxWidthMinimal = 200, + .Width = 200, + .CaptionPadding = New Padding(0, 3, 0, 0) + } + LBL_LIMITS = New ToolStripLabel With {.Text = "Limits:", .Margin = New Padding(2)} + LBL_LIMIT_TEXT = New ToolStripLabel With {.Text = String.Empty, .Margin = New Padding(2)} + OPT_LIMITS_DEFAULT = New RadioButton With {.Text = "Default", .BackColor = Color.Transparent, .Margin = New Padding(2)} + OPT_LIMITS_COUNT = New RadioButton With {.Text = "Count", .BackColor = Color.Transparent, .Margin = New Padding(2)} + OPT_LIMITS_POST = New RadioButton With {.Text = "Post", .BackColor = Color.Transparent, .Margin = New Padding(2)} + OPT_LIMITS_DATE = New RadioButton With {.Text = "Date", .BackColor = Color.Transparent, .Margin = New Padding(2)} + CH_HIDE_EXISTS_USERS = New CheckBox With {.Text = "Hide exists users", .BackColor = Color.Transparent, .Margin = New Padding(2), + .Checked = Settings.ChannelsHideExistsUser} + + TT_MAIN.SetToolTip(CH_HIDE_EXISTS_USERS, "Hide users which already exists in collection") + TT_MAIN.SetToolTip(OPT_LIMITS_COUNT, "Total posts count limit") + TT_MAIN.SetToolTip(OPT_LIMITS_POST, "Looking limit till post(-s) (comma separated)") + ToolbarTOP.Items.AddRange({CMB_CHANNELS.GetControlHost, + New ToolStripSeparator, + LBL_LIMITS, + New ToolStripControlHost(OPT_LIMITS_DEFAULT), + New ToolStripControlHost(OPT_LIMITS_COUNT), + New ToolStripControlHost(OPT_LIMITS_POST), + New ToolStripControlHost(OPT_LIMITS_DATE), + TXT_LIMIT.GetControlHost, + LBL_LIMIT_TEXT, + New ToolStripSeparator, + New ToolStripControlHost(CH_HIDE_EXISTS_USERS)}) + MyRange = New RangeSwitcher(Of UserPost) With {.Selector = Function(p) Not Settings.UserExists(Sites.Reddit, p.UserID)} + With MyRange + .Limit = ImagesInRow * ImagesRows + .InsertButtons(ToolbarTOP, {RButton.Previous, RButton.Next}, 5) + .SetButtonKey(RButton.Previous, Keys.F2) + .SetButtonKey(RButton.Next, Keys.F3) + .BindForm(Me) + .LabelNumbersProvider = CProvider + .UpdateControls() + .Selector = SelectorExpression + End With + AddHandler Settings.ChannelsImagesColumns.OnValueChanged, AddressOf ImagesCountChanged + AddHandler Settings.ChannelsImagesRows.OnValueChanged, AddressOf ImagesCountChanged + End Sub + Private Sub ChannelViewForm_Load(sender As Object, e As EventArgs) Handles Me.Load + MyDefs.MyViewInitialize(Me, Settings.Design) + RefillChannels(Settings.LatestSelectedChannel.Value) + ChangeComboIndex(0) + CMB_CHANNELS_ActionOnCheckedChange(CMB_CHANNELS.Checked) + With LIST_POSTS + Dim s As Size = GetImageSize() + .LargeImageList = New ImageList With {.ColorDepth = ColorDepth.Depth32Bit, .ImageSize = s} + .SmallImageList = New ImageList With {.ColorDepth = ColorDepth.Depth32Bit, .ImageSize = s} + End With + CMB_CHANNELS.Enabled(False) = Not CMB_CHANNELS.Checked + MyDefs.EndLoaderOperations() + End Sub + Private Sub ChannelViewForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + AppendPendingUsers() + e.Cancel = True + Hide() + End Sub + Private Sub ChannelViewForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + CMB_CHANNELS.Dispose() + CH_HIDE_EXISTS_USERS.Dispose() + TXT_LIMIT.Dispose() + LBL_LIMITS.Dispose() + OPT_LIMITS_DEFAULT.Dispose() + OPT_LIMITS_COUNT.Dispose() + OPT_LIMITS_POST.Dispose() + LBL_LIMIT_TEXT.Dispose() + PendingUsers.Clear() + MyDefs.Dispose() + End Sub + Private Sub ChannelViewForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown, CMB_CHANNELS.KeyDown + Dim b As Boolean = True + If Not Working Then + Select Case e.KeyCode + Case Keys.Insert : AddNewChannel() + Case Keys.F1 : ChangeComboIndex(-1) + Case Keys.F4 : ChangeComboIndex(1) + Case Keys.F5 : BTT_DOWNLOAD.PerformClick() + Case Keys.F8 : BTT_ADD_USERS.PerformClick() + Case Else : b = False + End Select + Else + b = False + If e.KeyCode = Keys.F8 Then BTT_ADD_USERS.PerformClick() : b = True + End If + If b Then LIST_POSTS.Select() : e.Handled = True + End Sub +#End Region + Private Sub RefillChannels(Optional ByVal SelectedChannel As String = Nothing) + CMB_CHANNELS.BeginUpdate() + Dim indx%? = Nothing + Dim t$ = If(SelectedChannel.IsEmptyString, CMB_CHANNELS.Text, SelectedChannel) + CMB_CHANNELS.Clear(ComboBoxExtended.ClearMode.Items + ComboBoxExtended.ClearMode.Text) + If Settings.Channels Is Nothing Then Settings.Channels = New ChannelsCollection : Settings.Channels.Load() + With Settings.Channels + If .Count > 0 Then + For i% = 0 To .Count - 1 + CMB_CHANNELS.Items.Add(.Item(i).ID) + If .Item(i).ID = t Then indx = i + Next + If indx >= 0 And indx <= CMB_CHANNELS.Count - 1 Then CMB_CHANNELS.SelectedIndex = indx + End If + End With + CMB_CHANNELS.EndUpdate() + End Sub +#Region "Images refill methods" + Private Sub AppendPendingUsers() + If LIST_POSTS.CheckedIndices.Count > 0 Then + PendingUsers.ListAddList((From p As ListViewItem In LIST_POSTS.Items Where p.Checked Select p.Text), LNC) + Dim a As Action = Sub() BTT_ADD_USERS.Text = $"Add ({PendingUsers.Count.ToString(CProvider)})" + If ToolbarTOP.InvokeRequired Then ToolbarTOP.Invoke(a) Else a.Invoke + End If + End Sub + Friend Function GetImageSize() As Size + Const mhw% = 256 + Dim s As Size = LIST_POSTS.Size + With LIST_POSTS + s.Width -= (.Margin.Left + .Margin.Right) + s.Height -= (.Margin.Top + .Margin.Bottom) + s.Width = s.Width / ImagesInRow - .Padding.Left * ImagesInRow - .Padding.Right * ImagesInRow + s.Height = s.Height / ImagesRows - .Padding.Top * ImagesRows - .Padding.Bottom * ImagesRows + If s.Width = 0 Then s.Width = 50 + If s.Height = 0 Then s.Height = 100 + If s.Width >= mhw Then + s.Width = mhw / 100 * 75 + s.Height = mhw + Else + s.Height = s.Width / 75 * 100 + If s.Height > mhw Then s.Height = mhw + End If + End With + Return s + End Function +#End Region +#Region "Toolbar controls" +#Region "Downloader" + Private TokenSource As CancellationTokenSource + Private Token As CancellationToken + Friend ReadOnly Property Working As Boolean + Get + Return Not TokenSource Is Nothing + End Get + End Property + Private _ShowCancelNotification As Boolean = True + Private _CollectionDownloading As Boolean = False + Private Async Sub BTT_DOWNLOAD_Click(sender As Object, e As EventArgs) Handles BTT_DOWNLOAD.Click + Try + AppendPendingUsers() + If Not TokenSource Is Nothing Then Exit Sub + Dim InvokeToken As Action = Sub() + If TokenSource Is Nothing Then + CProgress.TotalCount = 0 + CProgress.CurrentCounter = 0 + CProgress.Enabled = True + TokenSource = New CancellationTokenSource + Token = TokenSource.Token + BTT_DOWNLOAD.Enabled = False + OPT_LIMITS_DEFAULT.Enabled = False + OPT_LIMITS_COUNT.Enabled = False + OPT_LIMITS_POST.Enabled = False + OPT_LIMITS_DATE.Enabled = False + TXT_LIMIT.Enabled = False + CH_HIDE_EXISTS_USERS.Enabled = False + CMB_CHANNELS.Enabled(True) = False + MyRange.EnableButton(RButton.Previous, False) + MyRange.EnableButton(RButton.Next, False) + End If + End Sub + Dim c As Channel + If CMB_CHANNELS.Count > 0 Then + BTT_DOWNLOAD.Enabled = False + BTT_STOP.Enabled = True + If CMB_CHANNELS.Checked Then + InvokeToken.Invoke() + _CollectionDownloading = True + Settings.Channels.SetLimit(Me) + Await Task.Run(Sub() Settings.Channels.DownloadData(Token, CH_HIDE_EXISTS_USERS.Checked, CProgress)) + Token.ThrowIfCancellationRequested() + c = GetCurrentChannel() + Else + c = GetCurrentChannel() + If Not c Is Nothing Then + InvokeToken.Invoke() + c.SetLimit(Me) + Await Task.Run(Sub() c.DownloadData(Token, CH_HIDE_EXISTS_USERS.Checked, CProgress)) + Token.ThrowIfCancellationRequested() + End If + End If + If Not c Is Nothing Then + SetLimitsByChannel(c) + MyRange.ChangeSource(c) + End If + Else + MsgBoxE("No one channels detected", MsgBoxStyle.Exclamation) + End If + Catch aex As ArgumentException When aex.HelpLink = 1 + ErrorsDescriber.Execute(EDP.ShowAllMsg, aex) + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Dim ee As EDP = EDP.SendInLog + If _ShowCancelNotification Then ee += EDP.ShowMainMsg + ErrorsDescriber.Execute(ee, oex, New MMessage("Downloading operation canceled", "Status...",, MsgBoxStyle.Exclamation)) + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Channels downloading error") + Finally + If Not TokenSource Is Nothing AndAlso Not Settings.Channels.Downloading Then + TokenSource = Nothing + CProgress.Enabled = False + BTT_DOWNLOAD.Enabled = True + BTT_STOP.Enabled = False + _CollectionDownloading = False + OPT_LIMITS_DEFAULT.Enabled = True + OPT_LIMITS_COUNT.Enabled = True + OPT_LIMITS_POST.Enabled = True + OPT_LIMITS_DATE.Enabled = True + TXT_LIMIT.Enabled = True + CH_HIDE_EXISTS_USERS.Enabled = True + CMB_CHANNELS.Enabled(True) = True + CMB_CHANNELS_ActionOnCheckedChange(CMB_CHANNELS.Checked) + With MyRange + .EnableButton(RButton.Previous, .Count > 0 AndAlso .CurrentIndex > 0) + .EnableButton(RButton.Next, .Count > 0 AndAlso .CurrentIndex < .Max) + End With + End If + End Try + End Sub + Private Function GetCurrentChannel() As Channel + If CMB_CHANNELS.SelectedIndex >= 0 Then + Dim ChannelID$ = CMB_CHANNELS.Value + If Not ChannelID.IsEmptyString Then Return Settings.Channels.Find(ChannelID) + Else + MsgBoxE("No one channel selected", MsgBoxStyle.Exclamation) + End If + Return Nothing + End Function + Private Sub BTT_STOP_Click(sender As Object, e As EventArgs) Handles BTT_STOP.Click + [Stop]() + End Sub + Friend Sub [Stop](Optional ByVal ShowCancelNotification As Boolean = True) + _ShowCancelNotification = ShowCancelNotification + If Not TokenSource Is Nothing Then TokenSource.Cancel() : BTT_STOP.Enabled = False + End Sub +#End Region + Private Sub BTT_ADD_USERS_Click(sender As Object, e As EventArgs) Handles BTT_ADD_USERS.Click + AppendPendingUsers() + Dim i% + If LIST_POSTS.CheckedItems.Count > 0 Then + For i = 0 To LIST_POSTS.Items.Count - 1 + If LIST_POSTS.Items(i).Checked Then LIST_POSTS.Items(i).Checked = False + Next + End If + If PendingUsers.Count > 0 Then + Dim Added% = 0, Skipped% = 0 + Dim StartIndex% = Settings.Users.Count + Settings.Labels.Add(CannelsLabelName) + Settings.Labels.Add(LabelsKeeper.NoParsedUser) + Dim rUsers$() = UserBanned(PendingUsers.ToArray) + If rUsers.ListExists Then PendingUsers.RemoveAll(Function(u) rUsers.Contains(u)) + If PendingUsers.Count > 0 Then + With PendingUsers.Select(Function(u) New UserInfo(u, Sites.Reddit)) + For i = 0 To .Count - 1 + If Not Settings.UsersList.Contains(.ElementAt(i)) Then + Settings.UpdateUsersList(.ElementAt(i)) + Settings.Users.Add(New UserData(.ElementAt(i), False) With {.Temporary = True}) + With Settings.Users.Last + .Labels.Add(CannelsLabelName) + .UpdateUserInformation() + End With + Added += 1 + Else + Skipped += 1 + End If + Next + End With + End If + PendingUsers.Clear() + BTT_ADD_USERS.Text = "Add" + MsgBoxE($"Added users: {Added.ToString(CProvider)}{vbCr}Skipped users: {Skipped.ToString(CProvider)}{vbCr}Total: {PendingUsers.Count.ToString(CProvider)}") + RaiseEvent OnUsersAdded(StartIndex) + Else + MsgBoxE("No one users selected for add to collection") + End If + End Sub +#Region "Limits changer" + Private Sub OPT_LIMITS_DEFAULT_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_LIMITS_DEFAULT.CheckedChanged + If OPT_LIMITS_DEFAULT.Checked Then + TXT_LIMIT.CheckForCompatible = False + TXT_LIMIT.Enabled = False + ChangeLimitMode(TextBoxExtended.ControlModes.TextBox) + End If + End Sub + Private Sub OPT_LIMITS_COUNT_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_LIMITS_COUNT.CheckedChanged + If OPT_LIMITS_COUNT.Checked Then + TXT_LIMIT.Enabled = True + TXT_LIMIT.CheckingType = GetType(Integer) + TXT_LIMIT.CheckForCompatible = True + ChangeLimitMode(TextBoxExtended.ControlModes.TextBox) + If Not ACheck(Of Integer)(TXT_LIMIT.Text) Then TXT_LIMIT.Text = Channel.DefaultDownloadLimitCount + End If + End Sub + Private Sub OPT_LIMITS_POST_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_LIMITS_POST.CheckedChanged + If OPT_LIMITS_POST.Checked Then + TXT_LIMIT.Enabled = True + TXT_LIMIT.CheckForCompatible = False + ChangeLimitMode(TextBoxExtended.ControlModes.TextBox) + End If + End Sub + Private Sub OPT_LIMITS_DATE_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_LIMITS_DATE.CheckedChanged + If OPT_LIMITS_DATE.Checked Then + TXT_LIMIT.CheckForCompatible = False + ChangeLimitMode(TextBoxExtended.ControlModes.DateTimePicker) + End If + End Sub + Private Sub ChangeLimitMode(ByVal Mode As TextBoxExtended.ControlModes) + If Not TXT_LIMIT.ControlMode = Mode Then TXT_LIMIT.ControlMode = Mode + End Sub +#End Region +#Region "CMB_CHANNELS" + Private Sub SetLimitsByChannel(Optional ByVal SelectedChannel As Channel = Nothing) + LBL_STATUS.Text = String.Empty + Dim c As Channel = If(SelectedChannel, GetCurrentChannel()) + LBL_LIMIT_TEXT.Text = String.Empty + If Not c Is Nothing Then + Settings.LatestSelectedChannel.Value = c.ID + With c.PostsAll + If .Count > 0 Then + OPT_LIMITS_DEFAULT.Checked = True + Dim d As Date? = .FirstOrDefault(Function(p) p.Date.HasValue).Date + If d.HasValue Then + LBL_LIMIT_TEXT.Text = $"to date {AConvert(Of String)(d, ADateTime.Formats.BaseDateTime, String.Empty)}" + Else + LBL_LIMIT_TEXT.Text = $"to post [{c.First(Function(p) Not p.ID.IsEmptyString).ID}]" + End If + Else + OPT_LIMITS_COUNT.Checked = True + If TXT_LIMIT.Text.IsEmptyString Then TXT_LIMIT.Value = Channel.DefaultDownloadLimitCount + LBL_LIMIT_TEXT.Text = $"first {TXT_LIMIT.Text} posts" + End If + End With + End If + End Sub + Private Sub CMB_CHANNELS_ActionSelectedItemChanged(ByVal _Item As ListViewItem) Handles CMB_CHANNELS.ActionSelectedItemChanged + SetLimitsByChannel() + Dim c As Channel = GetCurrentChannel() + If Not c Is Nothing Then MyRange.ChangeSource(c, EDP.SendInLog) + End Sub + Private Sub CMB_CHANNELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles CMB_CHANNELS.ActionOnButtonClick + Select Case Sender.DefaultButton + Case CmbDefaultButtons.Refresh : RefillChannels() + Case CmbDefaultButtons.Add : AddNewChannel() + Case CmbDefaultButtons.Delete + Try + Dim c As Channel = GetCurrentChannel() + If Not c Is Nothing AndAlso MsgBoxE($"Do you really want to delete channel [{c}]?", MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo) = 0 Then + Settings.Channels.Remove(c) + RefillChannels() + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on trying to delete channel") + End Try + Case CmbDefaultButtons.Up : ChangeComboIndex(-1) + Case CmbDefaultButtons.Down : ChangeComboIndex(1) + End Select + End Sub + Private Sub CMB_CHANNELS_ActionOnCheckedChange(ByVal Mode As Boolean) Handles CMB_CHANNELS.ActionOnCheckedChange + Dim OneChannel As Boolean = Not CMB_CHANNELS.Checked + CMB_CHANNELS.Enabled(False) = OneChannel + If OneChannel Then + OPT_LIMITS_DEFAULT.Checked = True + LBL_LIMIT_TEXT.Text = String.Empty + ChangeComboIndex(0) + Else + CMB_CHANNELS.Button(ActionButton.BTT_UP_NAME).Enabled = False + CMB_CHANNELS.Button(ActionButton.BTT_DOWN_NAME).Enabled = False + End If + End Sub + Private Sub AddNewChannel() + Dim c$ = InputBoxE("Enter Reddit channel:", "New channel") + If Not c.IsEmptyString Then + Dim cc As New Channel With {.Name = c, .ID = c} + If Settings.Channels.Count = 0 OrElse Not Settings.Channels.Contains(cc) Then + Settings.Channels.Add(cc) + Settings.Channels.Last.Save() + RefillChannels() + MsgBoxE($"Channel [{c}] added") + Else + MsgBoxE($"Channel [{c}] already exists") + End If + Else + MsgBoxE("You doesn't enter channel name. Operation canceled.", MsgBoxStyle.Exclamation) + End If + End Sub + Private Sub ChangeComboIndex(ByVal Appender As Integer) + Try + Dim _ComboUpEnabled As Boolean = False + Dim _ComboDownEnabled As Boolean = False + If CMB_CHANNELS.Count > 0 Then + Dim i% = CMB_CHANNELS.SelectedIndex + If i < 0 And Appender = 0 Then + CMB_CHANNELS.SelectedIndex = 0 + Else + If i < 0 Then i = 0 + i += Appender + If i >= 0 And i <= CMB_CHANNELS.Count - 1 And Not CMB_CHANNELS.SelectedIndex = i Then CMB_CHANNELS.SelectedIndex = i + End If + i = CMB_CHANNELS.SelectedIndex + Dim c% = CMB_CHANNELS.Count - 1 + _ComboUpEnabled = i > 0 And c > 0 + _ComboDownEnabled = i < c And c > 0 + End If + CMB_CHANNELS.Button(ActionButton.BTT_UP_NAME).Enabled = _ComboUpEnabled + CMB_CHANNELS.Button(ActionButton.BTT_DOWN_NAME).Enabled = _ComboDownEnabled + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "ComboBox index changing") + End Try + End Sub +#End Region + Private Sub CH_HIDE_EXISTS_USERS_CheckedChanged(sender As Object, e As EventArgs) Handles CH_HIDE_EXISTS_USERS.CheckedChanged + If Not MyDefs.Initializing Then + Settings.ChannelsHideExistsUser.Value = CH_HIDE_EXISTS_USERS.Checked + MyRange.Update() + End If + End Sub +#End Region +#Region "CONTEXT" + Private Sub BTT_C_OPEN_USER_Click(sender As Object, e As EventArgs) Handles BTT_C_OPEN_USER.Click + Dim p As UserPost = GetPostBySelected() + Try + If Not p.UserID.IsEmptyString Then Process.Start($"https://www.reddit.com/user/{p.UserID}") + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, $"Error on opening user by [https://www.reddit.com/user/{p.UserID}]") + End Try + End Sub + Private Sub BTT_C_OPEN_POST_Click(sender As Object, e As EventArgs) Handles BTT_C_OPEN_POST.Click + Dim p As UserPost = GetPostBySelected() + Dim URL$ = String.Empty + Try + URL = $"https://www.reddit.com/r/{CMB_CHANNELS.Value}/comments/{p.ID.Split("_").Last}" + If Not p.ID.IsEmptyString Then Process.Start(URL) + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, $"Error on opening post by [{URL}]") + End Try + End Sub + Private Sub BTT_C_OPEN_PICTURE_Click(sender As Object, e As EventArgs) Handles BTT_C_OPEN_PICTURE.Click + OpenPostPicture() + End Sub + Private Sub BTT_C_OPEN_FOLDER_Click(sender As Object, e As EventArgs) Handles BTT_C_OPEN_FOLDER.Click + Dim f As SFile = GetPostBySelected().CachedFile + If Not f.IsEmptyString Then f.Open(SFO.Path) + End Sub + Private Sub BTT_C_REMOVE_FROM_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_C_REMOVE_FROM_SELECTED.Click + Try + Dim u$ = GetPostBySelected().UserID + If Not u.IsEmptyString Then + Dim uRemoved As Boolean = False + If PendingUsers.Contains(u) Then PendingUsers.Remove(u) : uRemoved = True + With LIST_POSTS + If .Items.Count > 0 Then + Dim i% + Dim a As Action = Sub() .Items(i).Checked = False + For i = 0 To .Items.Count - 1 + If .Items(i).Text = u And .Items(i).Checked Then + If LIST_POSTS.InvokeRequired Then LIST_POSTS.Invoke(a) Else a.Invoke + End If + Next + End If + End With + If uRemoved Then + MsgBoxE($"User [{u}] was successfully removed") + Else + MsgBoxE($"User [{u}] was not added to selected users") + End If + BTT_ADD_USERS.Text = $"Add ({PendingUsers.Count.ToString(CProvider)})" + Else + MsgBoxE("User does not selected", MsgBoxStyle.Exclamation) + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on removing user from selected") + End Try + End Sub + Private Sub BTT_C_ADD_TO_BLACKLIST_Click(sender As Object, e As EventArgs) Handles BTT_C_ADD_TO_BLACKLIST.Click + Try + Dim u$ = GetPostBySelected().UserID + If Not u.IsEmptyString Then + Dim result% = MsgBoxE(New MMessage($"Do you really want to add user [{u}] to the BlackList?", + "Adding user to the BlackList", + {"Add", "Add and update ranges", + "Add with the reason", "Add with the reason and update ranges", + "Remove from BlackList", "Cancel"}, + MsgBoxStyle.Exclamation) With {.ButtonsPerRow = 2}) + If result < 4 Then + Dim reason$ = String.Empty + If result = 2 Or result = 3 Then reason = InputBoxE("Enter the ban reason:", "Ban reason") + Settings.BlackList.ListAddValue(New UserBan(u, reason), LAP.NotContainsOnly) + Settings.UpdateBlackList() + If result = 1 Or result = 3 Then MyRange.Update() + MsgBoxE($"User {u} was added to the BlackList") + ElseIf result = 4 Then + If Settings.BlackList.Contains(u) Then + Settings.BlackList.Remove(u) + Settings.UpdateBlackList() + MsgBoxE($"User [{u}] was removed from the BlackList") + Else + MsgBoxE($"User [{u}] was not banned") + End If + End If + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Adding user to the BlackList") + End Try + End Sub +#End Region + Private Sub OpenPostPicture() + Dim f As SFile = GetPostBySelected().CachedFile + If f.Exists Then f.Open() Else MsgBoxE($"Picture file [{f}] does not found", MsgBoxStyle.Critical) + End Sub + Private Function GetPostBySelected() As UserPost + Dim p As UserPost = Nothing + Try + If LIST_POSTS.SelectedItems.Count > 0 Then + Dim t$ = LIST_POSTS.SelectedItems(0).Tag + With Settings.Channels.Find(CMB_CHANNELS.Value) + If .Count > 0 Then p = .Posts.Find(Function(pp) pp.ID = t) + End With + End If + Catch aex As ArgumentException When aex.HelpLink = 1 + ErrorsDescriber.Execute(EDP.LogMessageValue, aex) + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "Post searching error") + End Try + Return p + End Function + Private Sub LIST_POSTS_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles LIST_POSTS.MouseDoubleClick + OpenPostPicture() + End Sub +#Region "MyRange" + Private Sub ImagesCountChanged(ByVal Sender As Object, ByVal _Name As String, ByVal _Value As Object) + AppendPendingUsers() + MyRange.Update(ImagesInRow * ImagesRows) + MyRange.GoTo(0, EDP.SendInLog) + End Sub + Private Sub MyRange_IndexChanged(ByVal Index As Integer) Handles MyRange.IndexChanged + Try + If MyDefs.Initializing Then Exit Sub + AppendPendingUsers() + LIST_POSTS.LargeImageList.Images.Clear() + LIST_POSTS.Items.Clear() + Dim p As UserPost + With MyRange.Current(EDP.ReturnValue).ListIfNothing + If .Count > 0 Then + Dim s As Size = GetImageSize() + Dim NullImage As Image = New Bitmap(s.Width, s.Height) + Dim ie As New ErrorsDescriber(EDP.ReturnValue) + For i% = 0 To .Count - 1 + p = .Item(i) + With p + LIST_POSTS.LargeImageList.Images.Add(.GetImage(s, ie, NullImage)) + LIST_POSTS.Items.Add(New ListViewItem(.UserID, i) With {.Tag = p.ID}) + With LIST_POSTS.Items(LIST_POSTS.Items.Count - 1) + If PendingUsers.Contains(.Text) Then .Checked = True + End With + End With + Next + End If + End With + Catch aex As ArgumentException When aex.HelpLink = 1 + MsgBoxE(aex.Message, MsgBoxStyle.Critical) + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex) + End Try + End Sub + Private Sub MyRange_RangesChanged(ByVal Sender As RangeSwitcher(Of UserPost)) Handles MyRange.RangesChanged + If Sender.Count > 0 Then MyRange_IndexChanged(0) + End Sub +#End Region +End Class \ No newline at end of file diff --git a/SCrawler/Content/Icons/Rainbow.ico b/SCrawler/Content/Icons/Rainbow.ico new file mode 100644 index 0000000..47e29f8 Binary files /dev/null and b/SCrawler/Content/Icons/Rainbow.ico differ diff --git a/SCrawler/Content/Icons/RedditIcon.ico b/SCrawler/Content/Icons/RedditIcon.ico new file mode 100644 index 0000000..c9ee6a3 Binary files /dev/null and b/SCrawler/Content/Icons/RedditIcon.ico differ diff --git a/SCrawler/Content/Icons/TwitterIcon.ico b/SCrawler/Content/Icons/TwitterIcon.ico new file mode 100644 index 0000000..7716008 Binary files /dev/null and b/SCrawler/Content/Icons/TwitterIcon.ico differ diff --git a/SCrawler/Content/Icons/UsersIcon.ico b/SCrawler/Content/Icons/UsersIcon.ico new file mode 100644 index 0000000..e00c1eb Binary files /dev/null and b/SCrawler/Content/Icons/UsersIcon.ico differ diff --git a/SCrawler/Content/Pictures/Cloud_01_16.png b/SCrawler/Content/Pictures/Cloud_01_16.png new file mode 100644 index 0000000..1850920 Binary files /dev/null and b/SCrawler/Content/Pictures/Cloud_01_16.png differ diff --git a/SCrawler/Content/Pictures/DBPic_32.png b/SCrawler/Content/Pictures/DBPic_32.png new file mode 100644 index 0000000..c647482 Binary files /dev/null and b/SCrawler/Content/Pictures/DBPic_32.png differ diff --git a/SCrawler/Content/Pictures/Delete.png b/SCrawler/Content/Pictures/Delete.png new file mode 100644 index 0000000..e241f3c Binary files /dev/null and b/SCrawler/Content/Pictures/Delete.png differ diff --git a/SCrawler/Content/Pictures/Folder_32.png b/SCrawler/Content/Pictures/Folder_32.png new file mode 100644 index 0000000..6f54e08 Binary files /dev/null and b/SCrawler/Content/Pictures/Folder_32.png differ diff --git a/SCrawler/Content/Pictures/GlobeBlue_32.png b/SCrawler/Content/Pictures/GlobeBlue_32.png new file mode 100644 index 0000000..c0c6003 Binary files /dev/null and b/SCrawler/Content/Pictures/GlobeBlue_32.png differ diff --git a/SCrawler/Content/Pictures/InfoPic_32.png b/SCrawler/Content/Pictures/InfoPic_32.png new file mode 100644 index 0000000..872abf3 Binary files /dev/null and b/SCrawler/Content/Pictures/InfoPic_32.png differ diff --git a/SCrawler/Content/Pictures/NextPIC2.png b/SCrawler/Content/Pictures/NextPIC2.png new file mode 100644 index 0000000..703c7d0 Binary files /dev/null and b/SCrawler/Content/Pictures/NextPIC2.png differ diff --git a/SCrawler/Content/Pictures/Ok.png b/SCrawler/Content/Pictures/Ok.png new file mode 100644 index 0000000..016687d Binary files /dev/null and b/SCrawler/Content/Pictures/Ok.png differ diff --git a/SCrawler/Content/Pictures/PencilPic_01_16.png b/SCrawler/Content/Pictures/PencilPic_01_16.png new file mode 100644 index 0000000..041e23f Binary files /dev/null and b/SCrawler/Content/Pictures/PencilPic_01_16.png differ diff --git a/SCrawler/Content/Pictures/PicturePic_32.png b/SCrawler/Content/Pictures/PicturePic_32.png new file mode 100644 index 0000000..751a858 Binary files /dev/null and b/SCrawler/Content/Pictures/PicturePic_32.png differ diff --git a/SCrawler/Content/Pictures/Pin_32.png b/SCrawler/Content/Pictures/Pin_32.png new file mode 100644 index 0000000..1e36e47 Binary files /dev/null and b/SCrawler/Content/Pictures/Pin_32.png differ diff --git a/SCrawler/Content/Pictures/PlusPIC.png b/SCrawler/Content/Pictures/PlusPIC.png new file mode 100644 index 0000000..8f7ddda Binary files /dev/null and b/SCrawler/Content/Pictures/PlusPIC.png differ diff --git a/SCrawler/Content/Pictures/PrevPIC2.png b/SCrawler/Content/Pictures/PrevPIC2.png new file mode 100644 index 0000000..c2e2be7 Binary files /dev/null and b/SCrawler/Content/Pictures/PrevPIC2.png differ diff --git a/SCrawler/Content/Pictures/RedditPic512.png b/SCrawler/Content/Pictures/RedditPic512.png new file mode 100644 index 0000000..f7d1d79 Binary files /dev/null and b/SCrawler/Content/Pictures/RedditPic512.png differ diff --git a/SCrawler/Content/Pictures/Refresh.png b/SCrawler/Content/Pictures/Refresh.png new file mode 100644 index 0000000..e7457bf Binary files /dev/null and b/SCrawler/Content/Pictures/Refresh.png differ diff --git a/SCrawler/Content/Pictures/StarPic_24.png b/SCrawler/Content/Pictures/StarPic_24.png new file mode 100644 index 0000000..d7a2741 Binary files /dev/null and b/SCrawler/Content/Pictures/StarPic_24.png differ diff --git a/SCrawler/Content/Pictures/StartPic_01_Green_16.png b/SCrawler/Content/Pictures/StartPic_01_Green_16.png new file mode 100644 index 0000000..5e025e6 Binary files /dev/null and b/SCrawler/Content/Pictures/StartPic_01_Green_16.png differ diff --git a/SCrawler/DownloadedInfoForm.Designer.vb b/SCrawler/DownloadedInfoForm.Designer.vb new file mode 100644 index 0000000..1abaa41 --- /dev/null +++ b/SCrawler/DownloadedInfoForm.Designer.vb @@ -0,0 +1,115 @@ + +Partial Friend Class DownloadedInfoForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(DownloadedInfoForm)) + Me.ToolbarTOP = New System.Windows.Forms.ToolStrip() + Me.MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton() + Me.MENU_VIEW_SESSION = New System.Windows.Forms.ToolStripMenuItem() + Me.MENU_VIEW_ALL = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton() + Me.ToolbarBOTTOM = New System.Windows.Forms.StatusStrip() + Me.LIST_DOWN = New System.Windows.Forms.ListBox() + Me.ToolbarTOP.SuspendLayout() + Me.SuspendLayout() + ' + 'ToolbarTOP + ' + Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden + Me.ToolbarTOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MENU_VIEW, Me.BTT_REFRESH}) + Me.ToolbarTOP.Location = New System.Drawing.Point(0, 0) + Me.ToolbarTOP.Name = "ToolbarTOP" + Me.ToolbarTOP.Size = New System.Drawing.Size(554, 25) + Me.ToolbarTOP.TabIndex = 0 + ' + 'MENU_VIEW + ' + Me.MENU_VIEW.AutoToolTip = False + Me.MENU_VIEW.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text + Me.MENU_VIEW.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MENU_VIEW_SESSION, Me.MENU_VIEW_ALL}) + Me.MENU_VIEW.Image = CType(resources.GetObject("MENU_VIEW.Image"), System.Drawing.Image) + Me.MENU_VIEW.ImageTransparentColor = System.Drawing.Color.Magenta + Me.MENU_VIEW.Name = "MENU_VIEW" + Me.MENU_VIEW.Size = New System.Drawing.Size(45, 22) + Me.MENU_VIEW.Text = "View" + ' + 'MENU_VIEW_SESSION + ' + Me.MENU_VIEW_SESSION.AutoToolTip = True + Me.MENU_VIEW_SESSION.Name = "MENU_VIEW_SESSION" + Me.MENU_VIEW_SESSION.Size = New System.Drawing.Size(180, 22) + Me.MENU_VIEW_SESSION.Text = "Session" + Me.MENU_VIEW_SESSION.ToolTipText = "Show downloaded users by this session" + ' + 'MENU_VIEW_ALL + ' + Me.MENU_VIEW_ALL.AutoToolTip = True + Me.MENU_VIEW_ALL.Name = "MENU_VIEW_ALL" + Me.MENU_VIEW_ALL.Size = New System.Drawing.Size(180, 22) + Me.MENU_VIEW_ALL.Text = "All" + Me.MENU_VIEW_ALL.ToolTipText = "Show all users (sorted by latest download)" + ' + 'BTT_REFRESH + ' + Me.BTT_REFRESH.Image = Global.SCrawler.My.Resources.Resources.Refresh + Me.BTT_REFRESH.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_REFRESH.Name = "BTT_REFRESH" + Me.BTT_REFRESH.Size = New System.Drawing.Size(89, 22) + Me.BTT_REFRESH.Text = "Refresh (F5)" + Me.BTT_REFRESH.ToolTipText = "Force list refresh" + ' + 'ToolbarBOTTOM + ' + Me.ToolbarBOTTOM.Location = New System.Drawing.Point(0, 389) + Me.ToolbarBOTTOM.Name = "ToolbarBOTTOM" + Me.ToolbarBOTTOM.Size = New System.Drawing.Size(554, 22) + Me.ToolbarBOTTOM.TabIndex = 1 + ' + 'LIST_DOWN + ' + Me.LIST_DOWN.Dock = System.Windows.Forms.DockStyle.Fill + Me.LIST_DOWN.FormattingEnabled = True + Me.LIST_DOWN.Location = New System.Drawing.Point(0, 25) + Me.LIST_DOWN.Name = "LIST_DOWN" + Me.LIST_DOWN.Size = New System.Drawing.Size(554, 364) + Me.LIST_DOWN.TabIndex = 2 + ' + 'DownloadedInfoForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(554, 411) + Me.Controls.Add(Me.LIST_DOWN) + Me.Controls.Add(Me.ToolbarBOTTOM) + Me.Controls.Add(Me.ToolbarTOP) + Me.KeyPreview = True + Me.MinimumSize = New System.Drawing.Size(570, 450) + Me.Name = "DownloadedInfoForm" + Me.ShowIcon = False + Me.Text = "Downloaded items" + Me.ToolbarTOP.ResumeLayout(False) + Me.ToolbarTOP.PerformLayout() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Private WithEvents ToolbarTOP As ToolStrip + Private WithEvents MENU_VIEW As ToolStripDropDownButton + Private WithEvents MENU_VIEW_SESSION As ToolStripMenuItem + Private WithEvents MENU_VIEW_ALL As ToolStripMenuItem + Private WithEvents BTT_REFRESH As ToolStripButton + Private WithEvents ToolbarBOTTOM As StatusStrip + Private WithEvents LIST_DOWN As ListBox +End Class \ No newline at end of file diff --git a/SCrawler/DownloadedInfoForm.resx b/SCrawler/DownloadedInfoForm.resx new file mode 100644 index 0000000..fb52630 --- /dev/null +++ b/SCrawler/DownloadedInfoForm.resx @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + 133, 17 + + \ No newline at end of file diff --git a/SCrawler/DownloadedInfoForm.vb b/SCrawler/DownloadedInfoForm.vb new file mode 100644 index 0000000..8214bae --- /dev/null +++ b/SCrawler/DownloadedInfoForm.vb @@ -0,0 +1,124 @@ +Imports System.ComponentModel +Imports PersonalUtilities.Forms +Imports SCrawler.API.Base +Friend Class DownloadedInfoForm + Private MyView As FormsView + Private ReadOnly LParams As New ListAddParams(LAP.IgnoreICopier) With {.e = EDP.None} + Friend Enum ViewModes As Integer + Session = 0 + All = 1 + End Enum + Friend Property ViewMode As ViewModes + Get + Return IIf(MENU_VIEW_ALL.Checked, ViewModes.All, ViewModes.Session) + End Get + Set(ByVal SMode As ViewModes) + Settings.InfoViewMode.Value = CInt(SMode) + End Set + End Property + Private ReadOnly _TempUsersList As List(Of IUserData) + Friend Sub New() + InitializeComponent() + _TempUsersList = New List(Of IUserData) + If Settings.InfoViewMode.Value = CInt(ViewModes.All) Then + MENU_VIEW_SESSION.Checked = False + MENU_VIEW_ALL.Checked = True + Else + MENU_VIEW_SESSION.Checked = True + MENU_VIEW_ALL.Checked = False + End If + Settings.InfoViewMode.Value = ViewMode + RefillList() + End Sub + Private Sub DownloadedInfoForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + If MyView Is Nothing Then + MyView = New FormsView(Me) + MyView.ImportFromXML(Settings.Design) + MyView.SetMeSize() + End If + RefillList() + Catch ex As Exception + End Try + End Sub + Private Sub DownloadedInfoForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + e.Cancel = True + Hide() + End Sub + Private Sub DownloadedInfoForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + If Not MyView Is Nothing Then MyView.Dispose(Settings.Design) + _TempUsersList.Clear() + End Sub + Private Sub DownloadedInfoForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + If e.KeyCode = Keys.F5 Then RefillList() : e.Handled = True + End Sub + Private Class UsersDateOrder : Implements IComparer(Of IUserData) + Friend Function Compare(ByVal x As IUserData, ByVal y As IUserData) As Integer Implements IComparer(Of IUserData).Compare + Dim xv& = If(DirectCast(x, UserDataBase).LastUpdated.HasValue, DirectCast(x, UserDataBase).LastUpdated.Value.Ticks, 0) + Dim yv& = If(DirectCast(y, UserDataBase).LastUpdated.HasValue, DirectCast(y, UserDataBase).LastUpdated.Value.Ticks, 0) + Return xv.CompareTo(yv) * -1 + End Function + End Class + Private Sub RefillList() + Try + _TempUsersList.Clear() + Dim lClear As Action = Sub() LIST_DOWN.Items.Clear() + If LIST_DOWN.InvokeRequired Then LIST_DOWN.Invoke(lClear) Else lClear.Invoke + If ViewMode = ViewModes.Session Then + _TempUsersList.ListAddList(Downloader.Downloaded, LParams) + Else + _TempUsersList.ListAddList(Settings.Users.SelectMany(Of IUserData) _ + (Function(u) If(u.IsCollection, DirectCast(u, API.UserDataBind).Collections, {u})), LParams) + End If + If _TempUsersList.Count > 0 Then + _TempUsersList.Sort(New UsersDateOrder) + For Each user As IUserData In _TempUsersList + If LIST_DOWN.InvokeRequired Then + LIST_DOWN.Invoke(Sub() LIST_DOWN.Items.Add(user.DownloadedInformation)) + Else + LIST_DOWN.Items.Add(user.DownloadedInformation) + End If + Next + If _LatestSelected >= 0 AndAlso _LatestSelected <= LIST_DOWN.Items.Count - 1 Then + Dim aSel As Action = Sub() LIST_DOWN.SelectedIndex = _LatestSelected + If LIST_DOWN.InvokeRequired Then LIST_DOWN.Invoke(aSel) Else aSel.Invoke + Else + _LatestSelected = -1 + End If + Else + _LatestSelected = -1 + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "[DownloadedInfoForm.RefillList]") + End Try + End Sub + Private Sub MENU_VIEW_SESSION_Click(sender As Object, e As EventArgs) Handles MENU_VIEW_SESSION.Click + MENU_VIEW_SESSION.Checked = True + MENU_VIEW_ALL.Checked = False + ViewMode = ViewModes.Session + RefillList() + End Sub + Private Sub MENU_VIEW_ALL_Click(sender As Object, e As EventArgs) Handles MENU_VIEW_ALL.Click + MENU_VIEW_SESSION.Checked = False + MENU_VIEW_ALL.Checked = True + ViewMode = ViewModes.All + RefillList() + End Sub + Private Sub BTT_REFRESH_Click(sender As Object, e As EventArgs) Handles BTT_REFRESH.Click + RefillList() + End Sub + Private _LatestSelected As Integer = -1 + Private Sub LIST_DOWN_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_DOWN.SelectedIndexChanged + _LatestSelected = LIST_DOWN.SelectedIndex + End Sub + Private Sub LIST_DOWN_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles LIST_DOWN.MouseDoubleClick + Try + If _LatestSelected >= 0 AndAlso _LatestSelected <= _TempUsersList.Count - 1 AndAlso + Not DirectCast(_TempUsersList(_LatestSelected), UserDataBase).Disposed Then _TempUsersList(_LatestSelected).OpenFolder() + Catch ex As Exception + End Try + End Sub + Friend Sub Downloader_OnDownloadCountChange() + If ViewMode = ViewModes.Session Then RefillList() + End Sub +End Class \ No newline at end of file diff --git a/SCrawler/Editors/CollectionEditorForm.Designer.vb b/SCrawler/Editors/CollectionEditorForm.Designer.vb new file mode 100644 index 0000000..f7a9069 --- /dev/null +++ b/SCrawler/Editors/CollectionEditorForm.Designer.vb @@ -0,0 +1,87 @@ +Namespace Editors + + Partial Friend Class CollectionEditorForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(CollectionEditorForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + Me.CMB_COLLECTIONS = New PersonalUtilities.Forms.Controls.ComboBoxExtended() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + CType(Me.CMB_COLLECTIONS, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(Me.CMB_COLLECTIONS) + Me.CONTAINER_MAIN.ContentPanel.Padding = New System.Windows.Forms.Padding(2, 0, 2, 0) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(454, 251) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(454, 251) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'CMB_COLLECTIONS + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_COMBOBOX_ARROW" + ActionButton1.Visible = False + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_ADD" + ActionButton2.ToolTipText = "Add new collection" + Me.CMB_COLLECTIONS.Buttons.Add(ActionButton1) + Me.CMB_COLLECTIONS.Buttons.Add(ActionButton2) + Me.CMB_COLLECTIONS.Dock = System.Windows.Forms.DockStyle.Fill + Me.CMB_COLLECTIONS.ListDropDownStyle = PersonalUtilities.Forms.Controls.ComboBoxExtended.ListMode.Simple + Me.CMB_COLLECTIONS.Location = New System.Drawing.Point(2, 0) + Me.CMB_COLLECTIONS.Name = "CMB_COLLECTIONS" + Me.CMB_COLLECTIONS.Size = New System.Drawing.Size(452, 252) + Me.CMB_COLLECTIONS.TabIndex = 0 + ' + 'CollectionEditorForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(454, 251) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.KeyPreview = True + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(470, 290) + Me.Name = "CollectionEditorForm" + Me.ShowIcon = False + Me.ShowInTaskbar = False + Me.Text = "Collection" + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + CType(Me.CMB_COLLECTIONS, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents CMB_COLLECTIONS As PersonalUtilities.Forms.Controls.ComboBoxExtended + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/CollectionEditorForm.resx b/SCrawler/Editors/CollectionEditorForm.resx new file mode 100644 index 0000000..06161e7 --- /dev/null +++ b/SCrawler/Editors/CollectionEditorForm.resx @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE + QVRIS62WWWxMURjHL220JW1HausmlFrDFKUhnUGH6bRFzJ2idImlC0Vp2mlji1A8iNhCPIjIRES8EU+W + h2oEtbSDTk3HNNM7S01VKsXjkb/vXBo3k1Ee7sMvmZzzzf//ne/+z50RAAxL1MUIG4G/YAv3HSVhF5Vw + IYNdz3LadVj9RgdTB+HQYYPHIJuE1ocSdlEJFzG+1bPRLQLinglIeCkg+XUkKvz56hnkOfQs/rmA8S9H + YEp7FDI64tAQtKhnsMapZ7zzNHsUFnbGY4VzIk70l6hnIH4wsDR7NBZ3apDrSqL5T8eFgUr1DLZ78lim + Q4N8VzK29MxEpZSBa4M16hnU+c3M9CEFpdJsVHsXos63DDcHrf9nQEXD5VymwW/5USLNwl5vJhp7dTgW + NML2pR7jbsUMS+KdMTa5Q8NQxinfBU4dRFcOyjy52OtbhwOBDTgZLKPPmTgY0ON4MBdNfSbYBupxY8Aq + G10dqMG5/nIc7ytGQ6CQRliAamkTN/g1Ai4e95Qy3iogpX0UtBRDnhRzdxq2SXOxz5eFQ70rScCEU335 + ssGxj0YS06HSm4GN3ekwdE2C1hGH1LZR0JDOJof5jwHvnIvzTa0jlooTYfktvt+fhcOBHDQFTWRgxJGP + ObAGsulZLMLWnjlY756K5c4JmNcRi6T2SGheCIihS2l5ozAo6NRhMolnUAcGV6IcwwqvFrX+JTjYuwKH + SfRAYDms/mzs9y1GFe2VSnOw1j0FejqpLN4WCX4ZufiIBwLMLxQGm12rsLQzgWKYgmLPLNTQw6ynpDSS + IBet8y+TqaVRVdFIeJrWuCcj+/0EzH43BomvIhBLI45uFiDcJ+6QwROFwa6+Amb9bGFNg6Xs9Ncd7Oy3 + Knb2eyU7/20nu9y/m136tIvEl6BC0qKoZwby3alo9JVhj7T5R7m/kJVIIityi8zyXmTiW+I10SqyIQNb + uIgNwYuuf25kFd75KPKkI49OmUWnrfYWyXv/wBb2cijhhVf6a9lGei65XclYRDd6mj0GWz2iLBJaH0rY + RSVc5Eywmhm7kuQXHX+bJlBStrh+zTi0PpSwi0q4yNFAOVvgiEcKJWUsxZn/NhT+znlofShhF5VwkRpv + MUtti4KGYjj6sYCIh5QSu4oG27stjItHU+cjeQzvkcFzFQ2KnSKLoc4FukDCXeI2GbSoaFD4ziyPxNxK + 0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/SCrawler/Editors/CollectionEditorForm.vb b/SCrawler/Editors/CollectionEditorForm.vb new file mode 100644 index 0000000..c95b2d8 --- /dev/null +++ b/SCrawler/Editors/CollectionEditorForm.vb @@ -0,0 +1,81 @@ +Imports System.ComponentModel +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Namespace Editors + Friend Class CollectionEditorForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps + Private ReadOnly Collections As List(Of String) + Friend Property [Collection] As String = String.Empty + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps + Collections = New List(Of String) + End Sub + Friend Sub New(ByVal CollectionName As String) + Me.New + Collection = CollectionName + End Sub + Private Sub CollectionEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDefs + .MyViewInitialize(Me, Settings.Design) + .MyOkCancel = New OkCancelToolbar(Me, Me, CONTAINER_MAIN.BottomToolStripPanel) + .MyOkCancel.AddThisToolbar() + Collections.ListAddList((From c In Settings.Users Where c.IsCollection Select c.CollectionName), LAP.NotContainsOnly, EDP.ThrowException) + If Collections.ListExists Then CMB_COLLECTIONS.Items.AddRange(From c In Collections Select New Controls.Base.ListItem(c)) + If Not Collection.IsEmptyString And Collections.Contains(Collection) Then CMB_COLLECTIONS.SelectedIndex = Collections.IndexOf(Collection) + End With + Catch ex As Exception + MyDefs.InvokeLoaderError(ex) + End Try + End Sub + Private Sub CollectionEditorForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + If Not BeforeCloseChecker(MyDefs.ChangesDetected) Then + e.Cancel = True + Else + Collections.Clear() + MyDefs.Dispose() + End If + End Sub + Private Sub CollectionEditorForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + If e.KeyCode = Keys.Insert Then + AddNewCollection() + e.Handled = True + Else + e.Handled = False + End If + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + If CMB_COLLECTIONS.SelectedIndex >= 0 Then + Collection = CMB_COLLECTIONS.Value.ToString + MyDefs.ChangesDetected = False + DialogResult = DialogResult.OK + Close() + Else + MsgBoxE("Collection does not selected", MsgBoxStyle.Exclamation) + End If + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.ChangesDetected = False + DialogResult = DialogResult.Cancel + Close() + End Sub + Private Sub CMB_COLLECTIONS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles CMB_COLLECTIONS.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Add Then AddNewCollection() + End Sub + Private Sub AddNewCollection() + Dim c$ = InputBoxE("Enter new collection name:", "Collection name") + If Not c.IsEmptyString Then + If Not Collections.Contains(c) Then + Collections.Add(c) + CMB_COLLECTIONS.Items.Add(c) + CMB_COLLECTIONS.SelectedIndex = CMB_COLLECTIONS.Count - 1 + Else + Dim i% = Collections.IndexOf(c) + If i >= 0 Then CMB_COLLECTIONS.SelectedIndex = i + End If + End If + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/GlobalSettingsForm.Designer.vb b/SCrawler/Editors/GlobalSettingsForm.Designer.vb new file mode 100644 index 0000000..c8e83da --- /dev/null +++ b/SCrawler/Editors/GlobalSettingsForm.Designer.vb @@ -0,0 +1,290 @@ +Namespace Editors + + Partial Friend Class GlobalSettingsForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(GlobalSettingsForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim TP_IMAGES As System.Windows.Forms.TableLayoutPanel + Dim TP_CHANNELS_IMGS As System.Windows.Forms.TableLayoutPanel + Dim TT_MAIN As System.Windows.Forms.ToolTip + Me.TXT_GLOBAL_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CH_SEPARATE_VIDEO_FOLDER = New System.Windows.Forms.CheckBox() + Me.TXT_COLLECTIONS_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_IMAGE_LARGE = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_IMAGE_SMALL = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CH_DEF_TEMP = New System.Windows.Forms.CheckBox() + Me.TXT_CHANNELS_ROWS = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_CHANNELS_COLUMNS = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + TP_MAIN = New System.Windows.Forms.TableLayoutPanel() + TP_IMAGES = New System.Windows.Forms.TableLayoutPanel() + TP_CHANNELS_IMGS = New System.Windows.Forms.TableLayoutPanel() + TT_MAIN = New System.Windows.Forms.ToolTip(Me.components) + TP_MAIN.SuspendLayout() + CType(Me.TXT_GLOBAL_PATH, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_COLLECTIONS_PATH, System.ComponentModel.ISupportInitialize).BeginInit() + TP_IMAGES.SuspendLayout() + CType(Me.TXT_IMAGE_LARGE, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_IMAGE_SMALL, System.ComponentModel.ISupportInitialize).BeginInit() + TP_CHANNELS_IMGS.SuspendLayout() + CType(Me.TXT_CHANNELS_ROWS, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_CHANNELS_COLUMNS, System.ComponentModel.ISupportInitialize).BeginInit() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + Me.SuspendLayout() + ' + 'TP_MAIN + ' + TP_MAIN.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_MAIN.ColumnCount = 1 + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MAIN.Controls.Add(Me.TXT_GLOBAL_PATH, 0, 0) + TP_MAIN.Controls.Add(Me.CH_SEPARATE_VIDEO_FOLDER, 0, 2) + TP_MAIN.Controls.Add(Me.TXT_COLLECTIONS_PATH, 0, 4) + TP_MAIN.Controls.Add(TP_IMAGES, 0, 1) + TP_MAIN.Controls.Add(Me.CH_DEF_TEMP, 0, 3) + TP_MAIN.Controls.Add(TP_CHANNELS_IMGS, 0, 5) + TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + TP_MAIN.Location = New System.Drawing.Point(0, 0) + TP_MAIN.Name = "TP_MAIN" + TP_MAIN.RowCount = 6 + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.Size = New System.Drawing.Size(584, 191) + TP_MAIN.TabIndex = 0 + ' + 'TXT_GLOBAL_PATH + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_OPEN" + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_CLEAR" + Me.TXT_GLOBAL_PATH.Buttons.Add(ActionButton1) + Me.TXT_GLOBAL_PATH.Buttons.Add(ActionButton2) + Me.TXT_GLOBAL_PATH.CaptionText = "Data Path" + Me.TXT_GLOBAL_PATH.CaptionToolTipEnabled = True + Me.TXT_GLOBAL_PATH.CaptionToolTipText = "Root path for storing users' data" + Me.TXT_GLOBAL_PATH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_GLOBAL_PATH.Location = New System.Drawing.Point(4, 4) + Me.TXT_GLOBAL_PATH.Name = "TXT_GLOBAL_PATH" + Me.TXT_GLOBAL_PATH.Size = New System.Drawing.Size(576, 22) + Me.TXT_GLOBAL_PATH.TabIndex = 0 + ' + 'CH_SEPARATE_VIDEO_FOLDER + ' + Me.CH_SEPARATE_VIDEO_FOLDER.AutoSize = True + Me.CH_SEPARATE_VIDEO_FOLDER.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_SEPARATE_VIDEO_FOLDER.Location = New System.Drawing.Point(4, 66) + Me.CH_SEPARATE_VIDEO_FOLDER.Name = "CH_SEPARATE_VIDEO_FOLDER" + Me.CH_SEPARATE_VIDEO_FOLDER.Padding = New System.Windows.Forms.Padding(100, 0, 0, 0) + Me.CH_SEPARATE_VIDEO_FOLDER.Size = New System.Drawing.Size(576, 24) + Me.CH_SEPARATE_VIDEO_FOLDER.TabIndex = 2 + Me.CH_SEPARATE_VIDEO_FOLDER.Text = "Separate video folders" + TT_MAIN.SetToolTip(Me.CH_SEPARATE_VIDEO_FOLDER, resources.GetString("CH_SEPARATE_VIDEO_FOLDER.ToolTip")) + Me.CH_SEPARATE_VIDEO_FOLDER.UseVisualStyleBackColor = True + ' + 'TXT_COLLECTIONS_PATH + ' + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 0 + ActionButton3.Name = "BTT_CLEAR" + Me.TXT_COLLECTIONS_PATH.Buttons.Add(ActionButton3) + Me.TXT_COLLECTIONS_PATH.CaptionText = "Collections folder" + Me.TXT_COLLECTIONS_PATH.CaptionToolTipEnabled = True + Me.TXT_COLLECTIONS_PATH.CaptionToolTipText = "Set collections folder name (name only)" + Me.TXT_COLLECTIONS_PATH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_COLLECTIONS_PATH.Location = New System.Drawing.Point(4, 128) + Me.TXT_COLLECTIONS_PATH.Name = "TXT_COLLECTIONS_PATH" + Me.TXT_COLLECTIONS_PATH.Size = New System.Drawing.Size(576, 22) + Me.TXT_COLLECTIONS_PATH.TabIndex = 4 + ' + 'TP_IMAGES + ' + TP_IMAGES.ColumnCount = 2 + TP_IMAGES.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_IMAGES.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_IMAGES.Controls.Add(Me.TXT_IMAGE_LARGE, 0, 0) + TP_IMAGES.Controls.Add(Me.TXT_IMAGE_SMALL, 1, 0) + TP_IMAGES.Dock = System.Windows.Forms.DockStyle.Fill + TP_IMAGES.Location = New System.Drawing.Point(1, 32) + TP_IMAGES.Margin = New System.Windows.Forms.Padding(0) + TP_IMAGES.Name = "TP_IMAGES" + TP_IMAGES.RowCount = 1 + TP_IMAGES.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_IMAGES.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30.0!)) + TP_IMAGES.Size = New System.Drawing.Size(582, 30) + TP_IMAGES.TabIndex = 1 + ' + 'TXT_IMAGE_LARGE + ' + Me.TXT_IMAGE_LARGE.CaptionText = "Large image size" + Me.TXT_IMAGE_LARGE.CaptionToolTipEnabled = True + Me.TXT_IMAGE_LARGE.CaptionToolTipText = "Maximum large image size by height" + Me.TXT_IMAGE_LARGE.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown + Me.TXT_IMAGE_LARGE.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_IMAGE_LARGE.Location = New System.Drawing.Point(3, 3) + Me.TXT_IMAGE_LARGE.Name = "TXT_IMAGE_LARGE" + Me.TXT_IMAGE_LARGE.NumberMaximum = New Decimal(New Integer() {1000, 0, 0, 0}) + Me.TXT_IMAGE_LARGE.NumberMinimum = New Decimal(New Integer() {50, 0, 0, 0}) + Me.TXT_IMAGE_LARGE.Size = New System.Drawing.Size(285, 22) + Me.TXT_IMAGE_LARGE.TabIndex = 0 + Me.TXT_IMAGE_LARGE.Text = "50" + Me.TXT_IMAGE_LARGE.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'TXT_IMAGE_SMALL + ' + Me.TXT_IMAGE_SMALL.CaptionText = "Small image size" + Me.TXT_IMAGE_SMALL.CaptionToolTipEnabled = True + Me.TXT_IMAGE_SMALL.CaptionToolTipText = "Maximum small image size by height" + Me.TXT_IMAGE_SMALL.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown + Me.TXT_IMAGE_SMALL.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_IMAGE_SMALL.Location = New System.Drawing.Point(294, 3) + Me.TXT_IMAGE_SMALL.Name = "TXT_IMAGE_SMALL" + Me.TXT_IMAGE_SMALL.NumberMaximum = New Decimal(New Integer() {500, 0, 0, 0}) + Me.TXT_IMAGE_SMALL.NumberMinimum = New Decimal(New Integer() {10, 0, 0, 0}) + Me.TXT_IMAGE_SMALL.Size = New System.Drawing.Size(285, 22) + Me.TXT_IMAGE_SMALL.TabIndex = 1 + Me.TXT_IMAGE_SMALL.Text = "10" + Me.TXT_IMAGE_SMALL.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'CH_DEF_TEMP + ' + Me.CH_DEF_TEMP.AutoSize = True + Me.CH_DEF_TEMP.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_DEF_TEMP.Location = New System.Drawing.Point(4, 97) + Me.CH_DEF_TEMP.Name = "CH_DEF_TEMP" + Me.CH_DEF_TEMP.Padding = New System.Windows.Forms.Padding(100, 0, 0, 0) + Me.CH_DEF_TEMP.Size = New System.Drawing.Size(576, 24) + Me.CH_DEF_TEMP.TabIndex = 3 + Me.CH_DEF_TEMP.Text = "Temporary default" + TT_MAIN.SetToolTip(Me.CH_DEF_TEMP, "Default value on user creating") + Me.CH_DEF_TEMP.UseVisualStyleBackColor = True + ' + 'TP_CHANNELS_IMGS + ' + TP_CHANNELS_IMGS.ColumnCount = 2 + TP_CHANNELS_IMGS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_CHANNELS_IMGS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_CHANNELS_IMGS.Controls.Add(Me.TXT_CHANNELS_ROWS, 0, 0) + TP_CHANNELS_IMGS.Controls.Add(Me.TXT_CHANNELS_COLUMNS, 1, 0) + TP_CHANNELS_IMGS.Dock = System.Windows.Forms.DockStyle.Fill + TP_CHANNELS_IMGS.Location = New System.Drawing.Point(1, 156) + TP_CHANNELS_IMGS.Margin = New System.Windows.Forms.Padding(0) + TP_CHANNELS_IMGS.Name = "TP_CHANNELS_IMGS" + TP_CHANNELS_IMGS.RowCount = 1 + TP_CHANNELS_IMGS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_CHANNELS_IMGS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 34.0!)) + TP_CHANNELS_IMGS.Size = New System.Drawing.Size(582, 34) + TP_CHANNELS_IMGS.TabIndex = 5 + ' + 'TXT_CHANNELS_ROWS + ' + Me.TXT_CHANNELS_ROWS.CaptionText = "Channels rows" + Me.TXT_CHANNELS_ROWS.CaptionToolTipEnabled = True + Me.TXT_CHANNELS_ROWS.CaptionToolTipText = "How many images' rows should be shown in the channels form" + Me.TXT_CHANNELS_ROWS.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown + Me.TXT_CHANNELS_ROWS.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_CHANNELS_ROWS.Location = New System.Drawing.Point(3, 3) + Me.TXT_CHANNELS_ROWS.Name = "TXT_CHANNELS_ROWS" + Me.TXT_CHANNELS_ROWS.Size = New System.Drawing.Size(285, 22) + Me.TXT_CHANNELS_ROWS.TabIndex = 0 + Me.TXT_CHANNELS_ROWS.Text = "0" + Me.TXT_CHANNELS_ROWS.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'TXT_CHANNELS_COLUMNS + ' + Me.TXT_CHANNELS_COLUMNS.CaptionText = "Channels columns" + Me.TXT_CHANNELS_COLUMNS.CaptionToolTipEnabled = True + Me.TXT_CHANNELS_COLUMNS.CaptionToolTipText = "How many images' columns should be shown in the channels form" + Me.TXT_CHANNELS_COLUMNS.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown + Me.TXT_CHANNELS_COLUMNS.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_CHANNELS_COLUMNS.Location = New System.Drawing.Point(294, 3) + Me.TXT_CHANNELS_COLUMNS.Name = "TXT_CHANNELS_COLUMNS" + Me.TXT_CHANNELS_COLUMNS.Size = New System.Drawing.Size(285, 22) + Me.TXT_CHANNELS_COLUMNS.TabIndex = 1 + Me.TXT_CHANNELS_COLUMNS.Text = "0" + Me.TXT_CHANNELS_COLUMNS.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(584, 191) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(584, 191) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'GlobalSettingsForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(584, 191) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle + Me.KeyPreview = True + Me.MaximizeBox = False + Me.MaximumSize = New System.Drawing.Size(600, 230) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(600, 230) + Me.Name = "GlobalSettingsForm" + Me.ShowIcon = False + Me.ShowInTaskbar = False + Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide + Me.Text = "Settings" + TP_MAIN.ResumeLayout(False) + TP_MAIN.PerformLayout() + CType(Me.TXT_GLOBAL_PATH, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_COLLECTIONS_PATH, System.ComponentModel.ISupportInitialize).EndInit() + TP_IMAGES.ResumeLayout(False) + CType(Me.TXT_IMAGE_LARGE, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_IMAGE_SMALL, System.ComponentModel.ISupportInitialize).EndInit() + TP_CHANNELS_IMGS.ResumeLayout(False) + CType(Me.TXT_CHANNELS_ROWS, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_CHANNELS_COLUMNS, System.ComponentModel.ISupportInitialize).EndInit() + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents TXT_GLOBAL_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents CH_SEPARATE_VIDEO_FOLDER As CheckBox + Private WithEvents TXT_COLLECTIONS_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_IMAGE_LARGE As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_IMAGE_SMALL As PersonalUtilities.Forms.Controls.TextBoxExtended + Friend WithEvents CH_DEF_TEMP As CheckBox + Private WithEvents TXT_CHANNELS_ROWS As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_CHANNELS_COLUMNS As PersonalUtilities.Forms.Controls.TextBoxExtended + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/GlobalSettingsForm.resx b/SCrawler/Editors/GlobalSettingsForm.resx new file mode 100644 index 0000000..3a4fff7 --- /dev/null +++ b/SCrawler/Editors/GlobalSettingsForm.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + False + + + 17, 17 + + + This is global setting for new added only users. +This parameter indicates how video will be stored in users' download path. +If checked then videos will be stored in separated folder; otherwise, videos will be stored with pictures together. + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + False + + + False + + \ No newline at end of file diff --git a/SCrawler/Editors/GlobalSettingsForm.vb b/SCrawler/Editors/GlobalSettingsForm.vb new file mode 100644 index 0000000..1159df6 --- /dev/null +++ b/SCrawler/Editors/GlobalSettingsForm.vb @@ -0,0 +1,65 @@ +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Namespace Editors + Friend Class GlobalSettingsForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps(Of FieldsChecker) + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps(Of FieldsChecker) + End Sub + Private Sub GlobalSettingsForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDefs + .MyViewInitialize(Me, Settings.Design, True) + .AddOkCancelToolbar() + .DelegateClosingChecker() + With Settings + TXT_GLOBAL_PATH.Text = .GlobalPath.Value + TXT_IMAGE_LARGE.Value = .MaxLargeImageHeigh.Value + TXT_IMAGE_SMALL.Value = .MaxSmallImageHeigh.Value + TXT_COLLECTIONS_PATH.Text = .CollectionsPath + CH_SEPARATE_VIDEO_FOLDER.Checked = .SeparateVideoFolder.Value + CH_DEF_TEMP.Checked = .DefaultTemporary.Value + TXT_CHANNELS_COLUMNS.Value = .ChannelsImagesColumns.Value + TXT_CHANNELS_ROWS.Value = .ChannelsImagesRows.Value + End With + .MyFieldsChecker = New FieldsChecker + With .MyFieldsChecker + .AddControl(Of String)(TXT_GLOBAL_PATH, TXT_GLOBAL_PATH.CaptionText) + .AddControl(Of String)(TXT_COLLECTIONS_PATH, TXT_COLLECTIONS_PATH.CaptionText) + .EndLoaderOperations() + End With + .AppendDetectors() + .EndLoaderOperations() + End With + Catch ex As Exception + MyDefs.InvokeLoaderError(ex) + End Try + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + If MyDefs.MyFieldsChecker.AllParamsOK Then + With Settings + .GlobalPath.Value = TXT_GLOBAL_PATH.Text + .MaxLargeImageHeigh.Value = CInt(TXT_IMAGE_LARGE.Value) + .MaxSmallImageHeigh.Value = CInt(TXT_IMAGE_SMALL.Value) + .SeparateVideoFolder.Value = CH_SEPARATE_VIDEO_FOLDER.Checked + .CollectionsPath.Value = TXT_COLLECTIONS_PATH.Text + .DefaultTemporary.Value = CH_DEF_TEMP.Checked + .ChannelsImagesRows.Value = CInt(TXT_CHANNELS_ROWS.Value) + .ChannelsImagesColumns.Value = CInt(TXT_CHANNELS_COLUMNS.Value) + End With + MyDefs.CloseForm() + End If + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.CloseForm(DialogResult.Cancel) + End Sub + Private Sub TXT_GLOBAL_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_GLOBAL_PATH.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then + Dim f As SFile = SFile.SelectPath(Settings.GlobalPath.Value) + If Not f.IsEmptyString Then TXT_GLOBAL_PATH.Text = f + End If + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/LabelsForm.Designer.vb b/SCrawler/Editors/LabelsForm.Designer.vb new file mode 100644 index 0000000..6e296b2 --- /dev/null +++ b/SCrawler/Editors/LabelsForm.Designer.vb @@ -0,0 +1,92 @@ + +Partial Friend Class LabelsForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(LabelsForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + Me.CMB_LABELS = New PersonalUtilities.Forms.Controls.ComboBoxExtended() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + CType(Me.CMB_LABELS, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(Me.CMB_LABELS) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(374, 421) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(374, 421) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'CMB_LABELS + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_COMBOBOX_ARROW" + ActionButton1.Visible = False + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_ADD" + ActionButton2.ToolTipText = "Add new label (Insert)" + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 2 + ActionButton3.Name = "BTT_CLEAR" + ActionButton3.ToolTipText = "Clear checked labels" + Me.CMB_LABELS.Buttons.Add(ActionButton1) + Me.CMB_LABELS.Buttons.Add(ActionButton2) + Me.CMB_LABELS.Buttons.Add(ActionButton3) + Me.CMB_LABELS.Dock = System.Windows.Forms.DockStyle.Fill + Me.CMB_LABELS.ListCheckBoxes = True + Me.CMB_LABELS.ListDropDownStyle = PersonalUtilities.Forms.Controls.ComboBoxExtended.ListMode.Simple + Me.CMB_LABELS.ListGridVisible = True + Me.CMB_LABELS.ListMultiSelect = True + Me.CMB_LABELS.Location = New System.Drawing.Point(0, 0) + Me.CMB_LABELS.Name = "CMB_LABELS" + Me.CMB_LABELS.Size = New System.Drawing.Size(374, 421) + Me.CMB_LABELS.TabIndex = 0 + ' + 'LabelsForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(374, 421) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(390, 460) + Me.Name = "LabelsForm" + Me.ShowIcon = False + Me.ShowInTaskbar = False + Me.Text = "Labels" + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + CType(Me.CMB_LABELS, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents CMB_LABELS As PersonalUtilities.Forms.Controls.ComboBoxExtended +End Class \ No newline at end of file diff --git a/SCrawler/Editors/LabelsForm.resx b/SCrawler/Editors/LabelsForm.resx new file mode 100644 index 0000000..22fe23b --- /dev/null +++ b/SCrawler/Editors/LabelsForm.resx @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE + QVRIS62WWWxMURjHL220JW1HausmlFrDFKUhnUGH6bRFzJ2idImlC0Vp2mlji1A8iNhCPIjIRES8EU+W + h2oEtbSDTk3HNNM7S01VKsXjkb/vXBo3k1Ee7sMvmZzzzf//ne/+z50RAAxL1MUIG4G/YAv3HSVhF5Vw + IYNdz3LadVj9RgdTB+HQYYPHIJuE1ocSdlEJFzG+1bPRLQLinglIeCkg+XUkKvz56hnkOfQs/rmA8S9H + YEp7FDI64tAQtKhnsMapZ7zzNHsUFnbGY4VzIk70l6hnIH4wsDR7NBZ3apDrSqL5T8eFgUr1DLZ78lim + Q4N8VzK29MxEpZSBa4M16hnU+c3M9CEFpdJsVHsXos63DDcHrf9nQEXD5VymwW/5USLNwl5vJhp7dTgW + NML2pR7jbsUMS+KdMTa5Q8NQxinfBU4dRFcOyjy52OtbhwOBDTgZLKPPmTgY0ON4MBdNfSbYBupxY8Aq + G10dqMG5/nIc7ytGQ6CQRliAamkTN/g1Ai4e95Qy3iogpX0UtBRDnhRzdxq2SXOxz5eFQ70rScCEU335 + ssGxj0YS06HSm4GN3ekwdE2C1hGH1LZR0JDOJof5jwHvnIvzTa0jlooTYfktvt+fhcOBHDQFTWRgxJGP + ObAGsulZLMLWnjlY756K5c4JmNcRi6T2SGheCIihS2l5ozAo6NRhMolnUAcGV6IcwwqvFrX+JTjYuwKH + SfRAYDms/mzs9y1GFe2VSnOw1j0FejqpLN4WCX4ZufiIBwLMLxQGm12rsLQzgWKYgmLPLNTQw6ynpDSS + IBet8y+TqaVRVdFIeJrWuCcj+/0EzH43BomvIhBLI45uFiDcJ+6QwROFwa6+Amb9bGFNg6Xs9Ncd7Oy3 + Knb2eyU7/20nu9y/m136tIvEl6BC0qKoZwby3alo9JVhj7T5R7m/kJVIIityi8zyXmTiW+I10SqyIQNb + uIgNwYuuf25kFd75KPKkI49OmUWnrfYWyXv/wBb2cijhhVf6a9lGei65XclYRDd6mj0GWz2iLBJaH0rY + RSVc5Eywmhm7kuQXHX+bJlBStrh+zTi0PpSwi0q4yNFAOVvgiEcKJWUsxZn/NhT+znlofShhF5VwkRpv + MUtti4KGYjj6sYCIh5QSu4oG27stjItHU+cjeQzvkcFzFQ2KnSKLoc4FukDCXeI2GbSoaFD4ziyPxNxK + 0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/SCrawler/Editors/LabelsForm.vb b/SCrawler/Editors/LabelsForm.vb new file mode 100644 index 0000000..cacbe80 --- /dev/null +++ b/SCrawler/Editors/LabelsForm.vb @@ -0,0 +1,97 @@ +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Functions.Messaging +Friend Class LabelsForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps + Friend ReadOnly Property LabelsList As List(Of String) + Private _AnyLabelAdd As Boolean = False + Friend Property MultiUser As Boolean = False + Public Property MultiUserClearExists As Boolean = False + Friend Sub New(ByVal LabelsArr As IEnumerable(Of String)) + InitializeComponent() + LabelsList = New List(Of String) + LabelsList.ListAddList(LabelsArr) + MyDefs = New DefaultFormProps + End Sub + Private Sub LabelsForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDefs + .MyViewInitialize(Me, Settings.Design) + .MyOkCancel = New OkCancelToolbar(Me, Me, CONTAINER_MAIN.BottomToolStripPanel) + .MyOkCancel.AddThisToolbar() + .DelegateClosingChecker() + + If Settings.Labels.Count > 0 Then + Dim items As New List(Of Integer) + CMB_LABELS.BeginUpdate() + For i% = 0 To Settings.Labels.Count - 1 + If LabelsList.Contains(Settings.Labels(i)) Then items.Add(i) + CMB_LABELS.Items.Add(New ListItem(Settings.Labels(i))) + Next + CMB_LABELS.EndUpdate() + CMB_LABELS.ListCheckedIndexes = items + End If + + .AppendDetectors() + .EndLoaderOperations() + End With + Catch ex As Exception + MyDefs.InvokeLoaderError(ex) + End Try + End Sub + Private Sub LabelsForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + If e.KeyCode = Keys.Insert Then AddNewLabel() : e.Handled = True + End Sub + Private Sub LabelsForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + LabelsList.Clear() + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + Try + If MultiUser Then + Dim m As New MMessage("You are changing labels for more one user" & vbNewLine & "What do you want to do?", + "MultiUser labels changing", + {New MsgBoxButton("Replace exists") With {.ToolTip = "For each user: all exists labels will be deleted and replaced to these labels"}, + New MsgBoxButton("Add to exists") With {.ToolTip = "For each user: these labels will be appended to exists labels"}, + New MsgBoxButton("Cancel")}, + MsgBoxStyle.Exclamation) + Select Case MsgBoxE(m).Index + Case 0 : MultiUserClearExists = True + Case 1 : MultiUserClearExists = False + Case 2 : Exit Sub + End Select + End If + LabelsList.Clear() + Dim s As List(Of Integer) = CMB_LABELS.ListCheckedIndexes.ListIfNothing + If s.Count > 0 Then + For Each i% In s : LabelsList.Add(Settings.Labels(i)) : Next + End If + If _AnyLabelAdd Then Settings.Labels.Update() + MyDefs.CloseForm() + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Choosing labels") + End Try + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.CloseForm(DialogResult.Cancel) + End Sub + Private Sub CMB_LABELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles CMB_LABELS.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Add Then AddNewLabel() + End Sub + Private Sub CMB_LABELS_ActionOnButtonClearClick() Handles CMB_LABELS.ActionOnButtonClearClick + CMB_LABELS.Clear(ComboBoxExtended.ClearMode.CheckedInexes) + End Sub + Private Sub AddNewLabel() + Dim nl$ = InputBoxE("Enter new label name:", "New label") + If Not nl.IsEmptyString Then + If Settings.Labels.Contains(nl) Then + MsgBoxE($"Label [{nl}] already exists") + Else + Settings.Labels.Add(nl) + _AnyLabelAdd = True + CMB_LABELS.Items.Add(New ListItem(nl)) + End If + End If + End Sub +End Class \ No newline at end of file diff --git a/SCrawler/Editors/RedditEditorForm.Designer.vb b/SCrawler/Editors/RedditEditorForm.Designer.vb new file mode 100644 index 0000000..8a0db8a --- /dev/null +++ b/SCrawler/Editors/RedditEditorForm.Designer.vb @@ -0,0 +1,134 @@ +Namespace Editors + + Partial Friend Class RedditEditorForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(RedditEditorForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Me.TXT_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_COOKIES = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + TP_MAIN = New System.Windows.Forms.TableLayoutPanel() + TP_MAIN.SuspendLayout() + CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).BeginInit() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + Me.SuspendLayout() + ' + 'TP_MAIN + ' + TP_MAIN.ColumnCount = 1 + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) + TP_MAIN.Controls.Add(Me.TXT_PATH, 0, 0) + TP_MAIN.Controls.Add(Me.TXT_COOKIES, 0, 1) + TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + TP_MAIN.Location = New System.Drawing.Point(0, 0) + TP_MAIN.Name = "TP_MAIN" + TP_MAIN.RowCount = 2 + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_MAIN.Size = New System.Drawing.Size(524, 80) + TP_MAIN.TabIndex = 0 + ' + 'TXT_PATH + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_OPEN" + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_CLEAR" + Me.TXT_PATH.Buttons.Add(ActionButton1) + Me.TXT_PATH.Buttons.Add(ActionButton2) + Me.TXT_PATH.CaptionText = "Path" + Me.TXT_PATH.CaptionToolTipEnabled = True + Me.TXT_PATH.CaptionToolTipText = "Specific path to store Reddit files" + Me.TXT_PATH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_PATH.Location = New System.Drawing.Point(3, 3) + Me.TXT_PATH.Name = "TXT_PATH" + Me.TXT_PATH.Size = New System.Drawing.Size(518, 22) + Me.TXT_PATH.TabIndex = 0 + ' + 'TXT_COOKIES + ' + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 0 + ActionButton3.Name = "BTT_EDIT" + ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image) + ActionButton4.Index = 1 + ActionButton4.Name = "BTT_CLEAR" + Me.TXT_COOKIES.Buttons.Add(ActionButton3) + Me.TXT_COOKIES.Buttons.Add(ActionButton4) + Me.TXT_COOKIES.CaptionText = "Cookies" + Me.TXT_COOKIES.ClearTextByButtonClear = False + Me.TXT_COOKIES.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_COOKIES.Location = New System.Drawing.Point(3, 43) + Me.TXT_COOKIES.Name = "TXT_COOKIES" + Me.TXT_COOKIES.Size = New System.Drawing.Size(518, 22) + Me.TXT_COOKIES.TabIndex = 1 + Me.TXT_COOKIES.TextBoxReadOnly = True + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(524, 80) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(524, 80) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'RedditEditorForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(524, 80) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.KeyPreview = True + Me.MaximizeBox = False + Me.MaximumSize = New System.Drawing.Size(540, 119) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(540, 119) + Me.Name = "RedditEditorForm" + Me.ShowInTaskbar = False + Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide + Me.Text = "Reddit" + TP_MAIN.ResumeLayout(False) + CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).EndInit() + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + Me.ResumeLayout(False) + + End Sub + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents TXT_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_COOKIES As PersonalUtilities.Forms.Controls.TextBoxExtended + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/RedditEditorForm.resx b/SCrawler/Editors/RedditEditorForm.resx new file mode 100644 index 0000000..5c7bfe6 --- /dev/null +++ b/SCrawler/Editors/RedditEditorForm.resx @@ -0,0 +1,1341 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + 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 + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/wMARv8PAEX/IgBF/0AARf9fAEX/fQBF/5wARf+6AEX/zQBF + /90ARf/rAEX/8wBF//gARf/8AEX//ABF//gARf/zAEX/6wBF/90ARf/NAEX/ugBF/5wARf99AEX/XwBF + /0AARf8iAEb/DwBG/wMARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAR/8DAEb/FABG/zQARf9dAEX/iwBF + /7MARf/RAEX/5wBF//QARf/6AEX//gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF//oARf/0AEX/5wBF/9EARf+zAEX/iwBF/10ARv80AEb/FABH + /wMAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASf8AAD//AABG + /wYARv8iAEX/UwBF/4sARf/AAEX/5QBF//cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9wBF/+UARf/AAEX/iwBF/1MARv8iAEb/BgA//wAASf8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/AwBF/x4ARv9WAEX/mQBF/9MARf/0AEX//gBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/+AEX/9ABF/9MARf+ZAEb/VgBF/x4ARv8DAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAJv8AAEb/DABF/zsARf+FAEX/zABF + //QARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/0AEX/zABF + /4UARf87AEb/DAAm/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAASv8AAEb/EwBF/1AARf+nAEX/5gBF//0ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//QBF/+YARf+nAEX/UABG/xMASv8AAEf/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAT/8AAEb/FABF/1oARf+3AEX/8ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/wAEX/twBF/1oARv8UAE//AABH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI/wAAQ/8AAEX/DgBF + /1QARf+2AEX/8gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8gBF + /7YARf9UAEX/DgBD/wAASP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/BgBG/z4ARf+mAEX/8ABF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+mAEb/PgBG/wYARv8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAFP/AABG/yAARf+FAEX/4wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/jAEX/hQBG/yAAU/8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEb/AABG/wkARf9SAEX/wwBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/7AEX/wwBF + /1IARv8JAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARv8eAEX/igBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/4oARv8eADz/AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARv8DAEX/QABF/7sARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/+wBF/7sARf9AAEf/AwBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEb/CgBF/2MARf/cAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9wARf9jAEb/CgBG + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF + /xUARf+HAEX/7wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+8ARf+HAEX/FQBF/wAARf8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEf/AABD/wAARf8hAEX/oQBF//gARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //gARf+hAEX/IQBD/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAQv8AAEb/LQBF + /7UARf/8AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//wARf+1AEX/LQBB/wAAR/8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAD3/AABG/zMARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/AAEb/MwA9/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARf83AEX/xgBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/GAEX/NwA8 + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABG/wAAQ/8AAEb/MwBF/8YARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/GAEb/MwBD/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAET/AABF/ywARf/AAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/AAEX/LABE/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABF/wAARf8hAEX/tQBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+1AEX/IQBF/wAARf8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/FQBF/6EARf/9AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//0ARf+hAEX/FQBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABG/woARf+HAEX/+QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//kARf+HAEb/CgBF + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAASP8CAEX/YwBF/+4ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+4ARf9jAEj/AgBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARv8AAEP/AABF/0AARf/cAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AET//wBE//8AQ///AEP//wBC//8AQv//AEP//wBD//8AQ///AEP//wBC//8AQv//AEP//wBD + //8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /9wARf9AAEP/AABG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARf8eAEX/uwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//wBD//8AQ///AUT//wZJ//8QUP//HFn//yxk//87b///SHj//1F/ + //9Xhf//W4f//1uH//9Xhf//UX///0h4//87b///K2T//xxZ//8QUP//Bkn//wFE//8AQ///AEP//wBE + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/7sARf8eAEX/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARv8AAEf/CABF/4oARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///AEP//wNG//8RUf//L2f//1WC + //97n///n7j//7vN///Q3f//4en//+rw///x9f//9ff///b5///3+f//9/n///b5///19///8fX//+rw + ///g6f//0N3//7rM//+euP//e57//1SB//8uZv//EVH//wNG//8AQ///AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/+wBF/4oAR/8IAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABC/wAARf9TAEX/6wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8AQ///Bkn//yNe//9Wg///i6r//7vO///h6f//9fj///7+//////////////////////////////// + ///////////////////////////////////////////////////////////////////9/v//9fj//+Hp + //+6zf//iqn//1WC//8iXf//Bkn//wBD//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/1MAQv8AAEb/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARf8AAEX/IABF/8MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBD//8CRf//HVn//1eE//+atf//1N////X3//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9Pf//9Pf//+ZtP//VoP//xxZ + //8CRf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/wwBF/yAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABH/wUARf+FAEX//ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8GSP//MGf//3uf + ///J1///9Pf///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////09///x9b//3qd//8uZv//Bkj//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/8AEX/hQBG + /wUARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI + /wAARP8AAEb/PgBF/+IARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//8FR///MWj//42s///d5v///P3///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////+/z//9zl//+Lqv//L2f//wRH//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/iAEX/PgBE/wAASP8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/w4ARf+lAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8BRP//JmD//4Sl///b5f///f7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////39///a5P//gqT//yRf + //8BRP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf+lAEb/DgBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAAQv8AAEX/VABF/+8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///DU3//1+K///M2v///P3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/P//ytn//1yI//8MTf//AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/+8ARf9UAEL/AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/xQARf+1AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//yZf//+ZtP//8fX///////////////////// + //////////////////////////////////////////////////////////////////////////////39 + ///09///6O7//9vl///O2///xNT//77Q//++0P//w9P//87b///b5f//6O7///T3///9/f////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8PT//5ez//8kXv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/7UARv8UAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARP8AAEX/WgBF//MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wJF + //9Cdf//xNP///39//////////////////////////////////////////////////////////////// + ///////////////////9/v//7fL//8nX//+dt///dZr//1KA//84bP//JV///xtY//8VVP//ElL//xFS + //8VVP//Glj//yVf//83bP//UoD//3SZ//+dt///yNf//+zx///9/v////////////////////////// + /////////////////////////////////////////////////////////f3//8HS//9Ac///AkX//wBE + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8wBF/1oARP8AAEb/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABF/xMARf+3AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8FR///WYb//9zl//////////////////////////////// + ///////////////////////////////////////////////////4+v//y9n//4Sl//9Ddf//GVf//wZJ + //8ARP//AEP//wBD//8AQ///AEP//wBD//8ARP//AET//wBD//8AQ///AEP//wBD//8AQv//AET//wZJ + //8ZVv//QnT//4Ok///K2P//9/n///////////////////////////////////////////////////// + /////////////////////////////9rk//9Wg///BEf//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/twBF/xMARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAARP8AAEX/UABF//AARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Bkj//2SN + ///m7f////////////////////////////////////////////////////////////////////////// + ///8/f//zNn//2qS//8fW///A0b//wBD//8ARP//AET//wBD//8AQv//AEP//wFF//8ER///CEr//wlL + //8JS///CEn//wRH//8BRf//AEP//wBC//8AQ///AET//wBE//8AQ///A0b//x5a//9okf//ytj///v8 + /////////////////////////////////////////////////////////////////////////////+Tr + //9hi///BUf//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/wAEX/UABE + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/wwARf+nAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wNG//9gi///6O7///////////////////////////////////// + ////////////////////////////////////////8vX//5Sw//8lX///AUT//wBD//8ARP//AEP//wJF + //8PT///KGL//0l5//9nkP//gqT//5ay//+kvP//q8H//6vB//+kvP//lrL//4Ok//9nkf//Snr//yli + //8PT///AkX//wBD//8ARP//AEP//wFE//8kXv//ka7///H1//////////////////////////////// + /////////////////////////////////////////////+bt//9diP//A0b//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+nAEb/DABF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAABI + /wAARf8AAEX/OwBF/+YARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Tn3//+Hp + //////////////////////////////////////////////////////////////////////////////H1 + //93m///DE3//wBD//8ARP//AEP//w1O//88cP//faD//7bJ///c5f//8fX///r7//////////////// + //////////////////////////////r8///x9f//3Ob//7bK//9+of//PXH//w5O//8AQ///AET//wBD + //8LTP//dJn///D0//////////////////////////////////////////////////////////////// + /////////////+Do//9Le///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /+YARf87AEX/AABG/wAAAAAAAAAAAAAAAAAAAAAAAEb/AABH/wMARf+FAEX//gBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEP//zBn///P3P////////////////////////////////////////// + ////////////////////////////////////////uMv//xFQ//8AQ///AET//wpL//9MfP//qsH//+fu + ///9/f////////////////////////////////////////////////////////////////////////// + //////////////3+///o7v//rML//059//8KS///AET//wBD//8QTv//tMj///////////////////// + /////////////////////////////////////////////////////////////8za//8tZf//AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//gBF/4UASP8DAEb/AAAAAAAAAAAAAAAAAAAA + AAAARf8AAEX/HgBF/8wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8SUf//pr7///// + //////////////////////////////////////////////////////////////////////////////// + //++z///F1T//wBB//8ZVv//i6r//+vw//////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////7PH//46s + //8aV///AEL//xVT//+7zf////////////////////////////////////////////////////////// + /////////////////////////////6O8//8QUP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/zABG/x4ARv8AAAAAAAAAAAAAAAAAAEb/AABF/wAARf9WAEX/9ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AUX//2eQ///19/////////////////////////////////////////// + //////////////////////////////////////////////X4//+euP//aZH//7DF///5+/////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+vv//7LH//9pkf//m7b///X3//////////////// + ////////////////////////////////////////////////////////////////////////8/b//2ON + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/0AEX/VgBF/wAARv8AAAAAAAAA + AAAARv8AAEb/BgBF/5kARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8kXv//zdr///// + //////////////////////////////////////////////////////////////////////////////// + //////////////7+///7/P///v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v8///+/v////////////////////////////////////////////////////////// + ////////////////////////////////////////ytj//yFd//8ARP//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf+ZAEb/BgBG/wAAAAAAAAAAAABF/wAARv8iAEX/0wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AUX//3ab///7/P////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///6/P//cpj//wFF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9MARv8iAEX/AAAA + AAAAR/8AAEX/AABF/1MARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8bWP//yNf///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////E1P//GVf//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9ABF/1MARf8AAEf/AABG/wAASP8DAEX/iwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEP//1SB///z9v////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////L1//9Qfv//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/iwBI + /wMARv8AAEb/AABG/xQARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ER///k6////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////46s//8DR///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEb/FABG/wAARf8AAEb/NABF/+UARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//xVU///D0/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////v9D//xNS//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /+UARv80AEX/AABF/wAARf9cAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///LmX//+Hp + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////f5///KmP//wBD + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+ABF/1wARf8AAEj/AwBF/4sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBC//9Gd///8PT///////////////////////////////////// + //////////////////////////////////////////////////////////////X3///Q3f//r8T//6a+ + //+4y///3uf///v8//////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+/z//97n//+3y///pr3//67E + ///Q3f//9ff///////////////////////////////////////////////////////////////////// + /////////////////////////////+/z//9DdP//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/iwBI/wMARv8PAEX/swBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//1WD + ///2+P////////////////////////////////////////////////////////////////////////// + //////////////3+///H1v//YIv//x9b//8LTP//CEr//w5P//8uZv//gaP//+Lq//////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+Lq//+Bo///Lmb//w5P//8ISv//C0z//x9b//9giv//x9b///39//////////////// + ////////////////////////////////////////////////////////////////////////9ff//1GA + //8AQv//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+zAEb/DwBF/yIARf/RAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///XIj///j6//////////////////////////////// + ///////////////////////////////////////////////////9/v//rcP//ydh//8AQ///AEP//wBE + //8ARP//AET//wBD//8ER///S3z//9bh//////////////////////////////////////////////// + ///////////////////////////////////////////////////W4f//S3v//wRH//8AQ///AET//wBE + //8ARP//AEP//wBD//8mYP//rcL///3+//////////////////////////////////////////////// + ///////////////////////////////////3+f//WIX//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/9EARf8iAEX/QABF/+cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9Yhf//9/n///////////////////////////////////////////////////////////////////// + /////////////8fW//8nYf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8ARP//VoP//+vx + //////////////////////////////////////////////////////////////////////////////// + ////////6/H//1aD//8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8nYP//x9b///// + //////////////////////////////////////////////////////////////////////////////b4 + //9Ugv//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5wBF/0AARf9fAEX/8wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEH//0p5///y9v////////////////////////// + ///////////////////////////////////////////////////1+P//YIv//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8LTP//oLn///////////////////////////////////// + //////////////////////////////////////////////////+guf//C0z//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBD//9gi///9fj///////////////////////////////////// + ////////////////////////////////////////8fX//0d2//8AQf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/zAEX/XwBF/30ARf/6AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //8PT///dZr///X4//////////////////////////////////////////////////////////////// + /////////////9Dd//8fW///AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9Ugf//9Pf///////////////////////////////////////////////////////////////////// + ////////9Pf//1SB//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//x9b + ///Q3f////////////////////////////////////////////////////////////////////////// + ///09///dZr//xFQ//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//oARf99AEX/nABF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//K2T//6W9///y9v////////////////////////// + ////////////////////////////////////////////////////////r8T//wtM//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//y9m///j6/////////////////////////// + ///////////////////////////////////////////////////j6///L2b//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//C0z//6/E//////////////////////////////// + ///////////////////////////////////////////////////z9v//qL///y1l//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF/5wARf+6AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//zBn + ///C0v////////////////////////////////////////////////////////////////////////// + //////////////////+mvv//CEr//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///JmD//97n//////////////////////////////////////////////////////////////// + /////////////97n//8mYP//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8ISv//pr7///////////////////////////////////////////////////////////////////// + ////////////////////////xNT//zNp//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/ugBF + /84ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8aV///s8f///////////////////////////////////// + /////////////////////////////////////////////////////////////7jL//8PT///AET//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//84bf//6O7///////////////////// + ////////////////////////////////////////////////////////6O7//zht//8AQ///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//w9P//+4y/////////////////////////// + ////////////////////////////////////////////////////////////////////////tsr//xxY + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/OAEX/3QBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//Akb//3Wa + ///6+/////////////////////////////////////////////////////////////////////////// + ////////////////////////3uf//y9m//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEP//2mR///5+/////////////////////////////////////////////////////////// + ///////////////////5+///aZH//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///L2b//97n//////////////////////////////////////////////////////////////// + ///////////////////////////////////6/P//eZ3//wJG//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /90ARf/rAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8fW///zdr///////////////////////////////////// + ///////////////////////////////////////////////////////////////////8/f//gqP//wRH + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8aVv//vc////////////////////// + //////////////////////////////////////////////////////////////////+9z///Glb//wBD + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wRH//+Co////P3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///Q3P//Il3//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF//MARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//1KA + ///09/////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////i6v//THz//wBE//8ARP//AEX//wBF//8ARf//AEX//wBF + //8AQ///Ckv//4Kk///5+v////////////////////////////////////////////////////////// + //////////////////////////////n6//+CpP//Ckv//wBD//8ARf//AEX//wBF//8ARf//AEX//wBE + //8ARP//THz//+Lq//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////X4//9Wg///AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/zAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//faD///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///X4f//VoP//wpM//8AQv//AEP//wBD//8AQ///AEP//xlW//+CpP//7/T///////////////////// + /////////////////////////////////////////////////////////////////////////////+/0 + //+CpP//GVb//wBD//8AQ///AEP//wBD//8AQ///Ckz//1aD///X4f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////4Kj//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//gARf/8AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wRH + //+UsP////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////s8f//oLn//1SB//8vZv//JmD//zht + //9okf//vc////j6//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////j6//+9z///aJH//zht//8mYP//L2b//1SB + //+guf//6/H///////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////mLP//wVH//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//ABF//wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//BEf//5ay//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9Pf//+Pr///e5///6O7///n7//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////5+///6O7//97n///j6///9Pf///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+atf//BUj//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/8AEX/+ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARP//f6L///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////4Ol//8BRf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//gARf/zAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//9Ugv//9Pf///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////2+P//WIT//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8wBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEP//yBc///O2/////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9Hd//8jXv//AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/rAEX/3QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//Akb//3ic///6+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////7/P//e5///wNG//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/90ARf/OAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARP//G1j//7XJ//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////7jL//8dWf//AET//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/zgBF/7oARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Mmn//8TU + /////////////////////////////////////////////////////////////+vw///a5P///P3///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/z//9jj///q7/////////////////////////////////////////// + ///////////////////H1v//NWv//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+6AEX/nABF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//LmX//6i////z9/////////////////////////// + //////////////z9///Q3P//Wob//y1l//+Usf//7fL///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+zx//+Sr///K2T//1eE + ///O2////P3////////////////////////////////////////09///q8H//zBn//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF/5wARf99AEX/+gBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///ElH//12I//+wxf//4On///P2///3+f//9fj//+rw///H1v//gKL//yli//8BRf//AEP//wtM + //9Ugv//vc7///f5//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////b4//+7zf//UoH//wpL//8AQ///AUX//yhh//9+of//x9b//+rw///1+P//9/n///P2 + ///h6f//ssb//1+K//8TUv//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/6AEX/fQBF + /18ARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AET//w5P//8uZv//THz//1mG + //9Tgf//O2///xlX//8DRv//AEP//wBF//8ARf//AET//wBE//8YVv//aZH//8jX///3+f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////f5///H1v//Z5D//xdV//8ARP//AET//wBF + //8ARf//AEP//wNG//8YVv//O2///1OB//9Zhv//TXz//y9m//8PT///AET//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//MARf9fAEX/QABF/+cARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//wBD//8AQv//AEP//wBC//8AQ///AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBE//8BRP//Hlr//2WO//+6zP//8PT///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+/0 + //+5zP//ZI3//x1Z//8BRP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AEL//wBD + //8AQv//AEP//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5wBF + /0AARf8iAEX/0QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AET//xRT + //9Nff//lbH//9Pf///2+P////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9vj//9Le//+TsP//THz//xRT//8ARP//AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/RAEX/IgBG/w8ARf+zAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wBD//8FSP//I17//1qG//+Usf//x9b//+rw + ///6/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////r7///r8P//x9b//5Sw//9Zhf//I13//wVI + //8AQ///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /7MARv8PAEb/AwBF/4sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8AQ///AEP//wVH//8YVv//PnH//2iR//+Sr///uMv//9fi///p7///9Pf///r7 + ///+/v/////////////////////////////////////////////+/v//+vv///P2///n7v//1uH//7nM + //+Sr///Z5D//z5x//8YVv//BUf//wBD//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/iwBI/wMARf8AAEX/XABF//gARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8AQ///AEP//wRH//8PUP//Il3//zlu//9Qf///ZY///3id//+IqP//kq///8fW///+/v///////+7y + //+guf//iKj//3qd//9mj///Tn3//zZr//8hXP//EFD//wRH//8AQ///AEP//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //gARf9cAEX/AABF/wAARv80AEX/5QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AEP//wBC + //8AQ///AET//wFF//8BRf//YIr///j6////////4+v//zNp//8AQ///AET//wBD//8AQv//AEP//wBD + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5QBG/zQARf8AAEb/AABG/xQARf/AAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBC//84bf//6O7///// + ///1+P//VYL//wBC//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/AAEb/FABG/wAARv8AAEj/AwBF/4sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//xpY///M2f////////////9/of//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/4sASP8DAEb/AABH/wAARf8AAEX/UwBF + //QARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//CUv//6e+ + /////////////6rA//8KS///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/0AEX/UwBF/wAAR/8AAAAAAABF/wAARv8iAEX/0wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//fJ////7+////////ztv//xxZ//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9MARv8iAEX/AAAAAAAAAAAAAEb/AABH + /wYARf+ZAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9SgP//9Pf////////p7///Om///wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/mQBH/wYARv8AAAAAAAAAAAAAR/8AAEX/AABG/1YARf/0AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//y5m///h6f////////j6//9hi///AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//QARv9WAEX/AABH/wAAAAAAAAAAAAAA + AAAARf8AAEX/HgBF/8wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARP//FFP//8LS/////////////4yr//8CRv//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/zABG/x4ARv8AAAAAAAAAAAAAAAAAAAAAAABG/wAAR/8DAEX/hQBF//4ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8GSP//m7b/////////////tcn//w5P + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//4ARf+FAEj/AwBG/wAAAAAAAAAAAAAA + AAAAAAAAAEj/AABF/wAARf87AEX/5gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//9vlv///P3////////X4v//JF7//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///Akb//wZI + //8ER///AEP//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/5gBF/zsARf8AAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/wwARf+nAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEL//0d4///w9P///////+/z + //9Fdv//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARP//F1X//1KA//+IqP//nrj//5Sw//9qkv//KmP//wNG//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+nAEb/DABF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAET/AABF/1EARf/wAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8AQ///JV///9nj////////+/z//22U//8AQ///AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//A0b//0V3//+6zP//8/b///// + //////////////r8///V4P//b5X//w5O//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/8ABF/1EARP8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEb/EwBF + /7cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8PT///t8r///// + ////////mbT//wVI//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//9Nff//3eb////////////////////////////////////////09///haX//wtM + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+3AEb/EwBF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAQv8AAEX/WgBF//MARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wNG//+Prf/////////////A0f//E1L//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///JWD//8rZ//////////////// + ///////////////////////////////////v8///Wob//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/8wBF/1oAQv8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARv8UAEX/tQBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//2ON + ///5+////////+Do//8sZf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//92m////P3///////////////////////////////////////////////////// + //+7zf//FFP//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+1AEb/FABG/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AABC/wAARf9UAEX/7wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///PHD//+vw////////9Pf//1B///8AQ///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQv//Dk3//7XJ//////////////// + /////////////////////////////////////////////+rw//88cP//AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/7wBF/1QAQv8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABG/w4ARf+lAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8dWv//0N3////////+/v//ep3//wBE//8ARf//AEX//wBF//8ARf//AEX//wBE//8ARP//AEP//wBD + //8DRv//Dk///yNe//9Xg///3+f///////////////////////////////////////////////////// + ////////9vj//1aD//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+lAEb/DgBF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASP8AAET/AABF/z4ARf/iAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wpM//+swv////////////+lvf//CEr//wBE + //8ARP//AEP//wBC//8BRf//Ckz//xxZ//87b///Yoz//42s//+2yv//2OP///D0///+/v////////// + ///////////////////////////////////////////////////2+P//VoP//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/4gBF/z4ARP8AAEj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/BQBF/4UARf/8AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AUX//4Kj/////////////8rY//8ZVv//BUj//xZV//8xaP//VoP//4Ci//+rwf//z9z//+rv + ///5+v////////////////////////////////////////////////////////////////////////// + /////////////+rw//88cP//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//wARf+FAEb/BQBG/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEb/IABF + /8MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQv//V4T///b4////////7fL//5Cu + //+dt///xdX//+Tr///1+P///v7///////////////////////////////////v8///u8///5+3///z9 + ////////////////////////////////////////////////////////u83//xRT//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/wwBG/yAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAP/8AAEX/UwBF/+sARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//8yaf//5Ov//////////////v7///////////////////////////////////3+ + ///09///4On//8HR//+atf//bpX//0R2//9Bc///y9n///////////////////////////////////// + /////////////+/z//9ahv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/+sARf9TAD//AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAAR/8IAEX/igBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//xZV///F1f////////// + ///////////////////3+f//5+7//8vZ//+mvv//e57//1F///8tZf//FFP//wVI//8AQ///AEL//wBD + //9Nff//3eb////////////////////////////////////////09///haX//wtM//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/7AEX/igBH/wgARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARf8eAEX/uwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//BEf//3ic///t8v//7fL//9Xg//+xxv//iKj//12I//83bP//Glf//wlK + //8BRP//AEP//wBD//8ARP//AEX//wBF//8ARf//AEX//wNG//9Gd///us3///P3//////////////// + ///6/P//1eD//2+V//8OTv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/7sARf8eAEX/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEb/AABD/wAARf9AAEX/3ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Dk7//0J0 + //9Bc///IVz//wxN//8CRv//AEP//wBD//8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBE//8YVf//VIL//4io//+dt///lLD//2qS//8qY///A0b//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/cAEX/QABD/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABI/wIARf9jAEX/7gBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AEP//wBD//8AQ///AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AkX//wZI + //8ER///AEP//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/7gBF/2MASP8CAEb/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/woARf+HAEX/+QBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //kARf+HAEb/CgBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABF + /xUARf+hAEX//QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/9AEX/oQBF/xUARf8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF/yEARf+1AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /7UARf8hAEX/AABF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAET/AABG/ywARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEX/LABE/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEP/AABG/zMARf/GAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/xgBG + /zMAQ/8AAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AADz/AABF/zcARf/GAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/8YARf83ADz/AABH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAD3/AABG + /zMARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEb/MwA9 + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAEH/AABF/y0ARf+1AEX//ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/8AEX/tQBF/y0AQf8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAEP/AABF/yEARf+hAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+ABF/6EARf8hAEP/AABH + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF/xUARf+HAEX/7wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/+8ARf+HAEX/FQBF/wAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/woARf9jAEX/3ABF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/cAEX/YwBG/woARv8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABH + /wMARf9AAEX/uwBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/7AEX/uwBF/0AAR/8DAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARv8eAEX/igBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/4oARv8eAD//AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABG/wAARv8JAEX/UgBF/8MARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+wBF + /8MARf9SAEb/CQBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAASP8AAEX/IABF + /4UARf/jAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+MARf+FAEX/IABI/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEb/BgBG/z4ARf+mAEX/8ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+mAEb/PgBG + /wYARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAASP8AAEP/AABF/w4ARf9UAEX/tQBF//IARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//IARf+1AEX/VABF/w4AQ/8AAEj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AABP/wAARv8UAEX/WgBF + /7cARf/wAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+3AEX/WgBG/xQAT/8AAEf/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARP8AAEX/EwBF/1AARf+nAEX/5gBF//0ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//QBF + /+YARf+nAEX/UABF/xMARP8AAEX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AACf/AABG/wwARf87AEX/hQBF/8wARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9ABF/8wARf+FAEX/OwBG/wwAJ/8AAEf/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAAR/8DAEb/HgBF + /1YARf+YAEX/0wBF//QARf/+AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//4ARf/0AEX/0wBF/5gARf9WAEb/HgBH + /wMARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASf8AAD//AABG/wYARv8iAEX/UwBF/4sARf/AAEX/5QBF + //cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/9wBF + /+UARf/AAEX/iwBF/1MARv8iAEb/BgA//wAASf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAEf/AwBG/xQARv80AEX/XQBF/4sARf+zAEX/0QBF/+cARf/0AEX/+gBF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //4ARf/6AEX/9ABF/+cARf/RAEX/swBF/4sARf9dAEb/NABG/xQAR/8DAEf/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAEf/AwBG/w8ARf8iAEX/QABF/18ARf99AEX/nABF/7oARf/NAEX/3QBF/+sARf/zAEX/+ABF + //wARf/8AEX/+ABF//MARf/rAEX/3QBF/80ARf+6AEX/nABF/30ARf9fAEX/QABF/yIARv8PAEf/AwBH + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////wAAAA////////////////AAAAAA//////////////+AAAAAA + B/////////////8AAAAAAAD////////////8AAAAAAAAP///////////8AAAAAAAAA///////////8AA + AAAAAAAD//////////8AAAAAAAAAAP/////////8AAAAAAAAAAA/////////+AAAAAAAAAAAH/////// + /+AAAAAAAAAAAAf////////AAAAAAAAAAAAD////////AAAAAAAAAAAAAP///////gAAAAAAAAAAAAB/ + //////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAP/////+AAAAAAAAAA + AAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAP////4AAAAA + AAAAAAAAAAB////8AAAAAAAAAAAAAAAAP///+AAAAAAAAAAAAAAAAB////AAAAAAAAAAAAAAAAAP///w + AAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAAAAAD///AAAAAAAAAAAAAAAAA + A///gAAAAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAA + AAAAAAB//gAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA/+AAAAAAA + AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAA + AAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAA + AA/wAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAA + AAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//wAAAAAA + AAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//gAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAD///A + AAAAAAAAAAAAAAAAA///4AAAAAAAAAAAAAAAAAf///AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAA + D///+AAAAAAAAAAAAAAAAB////wAAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAf////wAAAAAAAAAA + AAAAAP////+AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAB//////wAAAA + AAAAAAAAAA//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAP//////+AAAAAAAAAAAAAH////// + /wAAAAAAAAAAAAD////////AAAAAAAAAAAAD////////4AAAAAAAAAAAB/////////gAAAAAAAAAAB// + ///////8AAAAAAAAAAA//////////wAAAAAAAAAA///////////AAAAAAAAAA///////////8AAAAAAA + AA////////////wAAAAAAAA/////////////AAAAAAAA/////////////+AAAAAAB//////////////8 + AAAAAD///////////////8AAAAP///////8= + + + \ No newline at end of file diff --git a/SCrawler/Editors/RedditEditorForm.vb b/SCrawler/Editors/RedditEditorForm.vb new file mode 100644 index 0000000..8a4703a --- /dev/null +++ b/SCrawler/Editors/RedditEditorForm.vb @@ -0,0 +1,68 @@ +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Tools.WEB +Namespace Editors + Friend Class RedditEditorForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps + End Sub + Private Sub RedditEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDefs + .MyViewInitialize(Me, Settings.Design, True) + .AddOkCancelToolbar() + .DelegateClosingChecker() + With Settings.Site(Sites.Reddit) + TXT_PATH.Text = .Path + If .Responser.Cookies Is Nothing Then .Responser.Cookies = New CookieKeeper(.Responser.CookiesDomain) + End With + SetCookieText() + TextBoxExtended.SetFalseDetector(Me, True, AddressOf .Detector) + .EndLoaderOperations() + End With + Catch ex As Exception + MyDefs.InvokeLoaderError(ex) + End Try + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + With Settings.Site(Sites.Reddit) + If TXT_PATH.IsEmptyString Then .Path = Nothing Else .Path = TXT_PATH.Text + .Update() + End With + MyDefs.CloseForm() + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.CloseForm(DialogResult.Cancel) + End Sub + Private Sub TXT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_PATH.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then + Dim f As SFile = SFile.SelectPath(Settings.Site(Sites.Reddit).Path) + If Not f.IsEmptyString Then TXT_PATH.Text = f + End If + End Sub + Private Sub TXT_COOKIES_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_COOKIES.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Edit Then + Using f As New CookieListForm(Settings.Site(Sites.Reddit).Responser.Cookies) : f.ShowDialog() : End Using + SetCookieText() + End If + End Sub + Private Sub TXT_COOKIES_ActionOnButtonClearClick() Handles TXT_COOKIES.ActionOnButtonClearClick + With Settings.Site(Sites.Reddit).Responser + If Not .Cookies Is Nothing Then .Cookies.Dispose() + .Cookies = New CookieKeeper(.CookiesDomain) + End With + SetCookieText() + End Sub + Private Sub SetCookieText() + Dim c% = 0 + With Settings.Site(Sites.Reddit).Responser + If Not .Cookies Is Nothing Then c = .Cookies.Count + End With + TXT_COOKIES.Text = $"{c} cookies" + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/TwitterEditorForm.Designer.vb b/SCrawler/Editors/TwitterEditorForm.Designer.vb new file mode 100644 index 0000000..b4f8f68 --- /dev/null +++ b/SCrawler/Editors/TwitterEditorForm.Designer.vb @@ -0,0 +1,180 @@ +Namespace Editors + + Partial Friend Class TwitterEditorForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(TwitterEditorForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton5 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Me.TXT_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_COOKIES = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_TOKEN = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_AUTH = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + TP_MAIN = New System.Windows.Forms.TableLayoutPanel() + TP_MAIN.SuspendLayout() + CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_TOKEN, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_AUTH, System.ComponentModel.ISupportInitialize).BeginInit() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + Me.SuspendLayout() + ' + 'TP_MAIN + ' + TP_MAIN.ColumnCount = 1 + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) + TP_MAIN.Controls.Add(Me.TXT_PATH, 0, 0) + TP_MAIN.Controls.Add(Me.TXT_COOKIES, 0, 1) + TP_MAIN.Controls.Add(Me.TXT_TOKEN, 0, 2) + TP_MAIN.Controls.Add(Me.TXT_AUTH, 0, 3) + TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + TP_MAIN.Location = New System.Drawing.Point(0, 0) + TP_MAIN.Name = "TP_MAIN" + TP_MAIN.RowCount = 4 + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!)) + TP_MAIN.Size = New System.Drawing.Size(544, 107) + TP_MAIN.TabIndex = 0 + ' + 'TXT_PATH + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_OPEN" + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_CLEAR" + Me.TXT_PATH.Buttons.Add(ActionButton1) + Me.TXT_PATH.Buttons.Add(ActionButton2) + Me.TXT_PATH.CaptionText = "Path" + Me.TXT_PATH.CaptionToolTipEnabled = True + Me.TXT_PATH.CaptionToolTipText = "Specific path to store Twitter files" + Me.TXT_PATH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_PATH.Location = New System.Drawing.Point(3, 3) + Me.TXT_PATH.Name = "TXT_PATH" + Me.TXT_PATH.Size = New System.Drawing.Size(538, 22) + Me.TXT_PATH.TabIndex = 0 + ' + 'TXT_COOKIES + ' + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 0 + ActionButton3.Name = "BTT_EDIT" + ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image) + ActionButton4.Index = 1 + ActionButton4.Name = "BTT_CLEAR" + Me.TXT_COOKIES.Buttons.Add(ActionButton3) + Me.TXT_COOKIES.Buttons.Add(ActionButton4) + Me.TXT_COOKIES.CaptionText = "Cookies" + Me.TXT_COOKIES.ClearTextByButtonClear = False + Me.TXT_COOKIES.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_COOKIES.Location = New System.Drawing.Point(3, 29) + Me.TXT_COOKIES.Name = "TXT_COOKIES" + Me.TXT_COOKIES.Size = New System.Drawing.Size(538, 22) + Me.TXT_COOKIES.TabIndex = 1 + Me.TXT_COOKIES.TextBoxReadOnly = True + ' + 'TXT_TOKEN + ' + ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image) + ActionButton5.Index = 0 + ActionButton5.Name = "BTT_CLEAR" + Me.TXT_TOKEN.Buttons.Add(ActionButton5) + Me.TXT_TOKEN.CaptionText = "Token" + Me.TXT_TOKEN.CaptionToolTipEnabled = True + Me.TXT_TOKEN.CaptionToolTipText = "Set token from [x-csrf-token] response header" + Me.TXT_TOKEN.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_TOKEN.Location = New System.Drawing.Point(3, 55) + Me.TXT_TOKEN.Name = "TXT_TOKEN" + Me.TXT_TOKEN.Size = New System.Drawing.Size(538, 22) + Me.TXT_TOKEN.TabIndex = 2 + ' + 'TXT_AUTH + ' + ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image) + ActionButton6.Index = 0 + ActionButton6.Name = "BTT_CLEAR" + Me.TXT_AUTH.Buttons.Add(ActionButton6) + Me.TXT_AUTH.CaptionText = "Authorization" + Me.TXT_AUTH.CaptionToolTipEnabled = True + Me.TXT_AUTH.CaptionToolTipText = "Set authorization from [authorization] response header. This field must start fro" & + "m [Bearer] key word" + Me.TXT_AUTH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_AUTH.Location = New System.Drawing.Point(3, 81) + Me.TXT_AUTH.Name = "TXT_AUTH" + Me.TXT_AUTH.Size = New System.Drawing.Size(538, 22) + Me.TXT_AUTH.TabIndex = 3 + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(544, 107) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(544, 132) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'TwitterEditorForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(544, 132) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.KeyPreview = True + Me.MaximizeBox = False + Me.MaximumSize = New System.Drawing.Size(560, 171) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(560, 171) + Me.Name = "TwitterEditorForm" + Me.ShowInTaskbar = False + Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide + Me.Text = "Twitter" + TP_MAIN.ResumeLayout(False) + CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_TOKEN, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_AUTH, System.ComponentModel.ISupportInitialize).EndInit() + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents TXT_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_COOKIES As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_TOKEN As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_AUTH As PersonalUtilities.Forms.Controls.TextBoxExtended + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/TwitterEditorForm.resx b/SCrawler/Editors/TwitterEditorForm.resx new file mode 100644 index 0000000..59ee30e --- /dev/null +++ b/SCrawler/Editors/TwitterEditorForm.resx @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + 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 + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + AAABAAEAICAAAAEAIADLAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAAZJJ + REFUeAFiGDZgFMguBPBazwB6BEAUx2PbttHFqmJ2sW1UsbrY6NLFrmL2sW3jbMz9z1rNqvh9wry3QnQ5 + LMRdRCAez7AVDQ1+3w2lc9+UwXwP4W3wFGIiBhPQANNxDScKDhgDwWIX4XXxCWIjDekQ/EKjgkP2QJCO + DcoCRyAKbzAY07Ewd8hRSAHnUMtBeA0kQxQSIXiM6rmD9kKK+I7pKGlRYAzEhQeoX3DQWIiJJ5iFSgYF + 5kCUHqFy0UHl8QViIQ6nsAjdUBujIUrXzVbncKRCFFIgSheMwtdiClaqh+odNiqwDxKSFWarX0LS16hA + SdyHBCwa5c12wk74DwnQMbszW1c8gwRksF2B2uiIdfgL8dETlLQr0CLAw3CM06vblgDCL2kur6VxAuKT + CDTT3mSUxDx8hHiQipGqcIMi3XEPopSO6V7DR+ApRCkJU9yElkEvrPVwPniLXprQgbiNLx4PwXjsQGW3 + 9/TTcQfpEIVf2KLa023KtMJSHMMj/IEgFf/xEhexGQNQJmMMQxmMAgBkarVAZoTAyQAAAABJRU5ErkJg + gg== + + + \ No newline at end of file diff --git a/SCrawler/Editors/TwitterEditorForm.vb b/SCrawler/Editors/TwitterEditorForm.vb new file mode 100644 index 0000000..6d8690d --- /dev/null +++ b/SCrawler/Editors/TwitterEditorForm.vb @@ -0,0 +1,84 @@ +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Tools.WEB +Namespace Editors + Friend Class TwitterEditorForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps(Of FieldsChecker) + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps(Of FieldsChecker) + End Sub + Private Sub TwitterEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDefs + .MyViewInitialize(Me, Settings.Design, True) + .AddOkCancelToolbar() + .DelegateClosingChecker() + With Settings.Site(Sites.Twitter) + TXT_PATH.Text = .Path + With .Responser + If .Cookies Is Nothing Then .Cookies = New CookieKeeper(.CookiesDomain) + SetCookieText() + TXT_TOKEN.Text = .Headers(API.Base.SiteSettings.Header_Twitter_Token) + TXT_AUTH.Text = .Headers(API.Base.SiteSettings.Header_Twitter_Authorization) + End With + End With + .MyFieldsChecker = New FieldsChecker + With .MyFieldsChecker + .AddControl(Of String)(TXT_TOKEN, TXT_TOKEN.CaptionText) + .AddControl(Of String)(TXT_AUTH, TXT_AUTH.CaptionText) + .EndLoaderOperations() + End With + TextBoxExtended.SetFalseDetector(Me, True, AddressOf .Detector) + .EndLoaderOperations() + End With + Catch ex As Exception + MyDefs.InvokeLoaderError(ex) + End Try + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + If MyDefs.MyFieldsChecker.AllParamsOK Then + With Settings.Site(Sites.Twitter) + If TXT_PATH.IsEmptyString Then .Path = Nothing Else .Path = TXT_PATH.Text + With .Responser + .Headers(API.Base.SiteSettings.Header_Twitter_Token) = TXT_TOKEN.Text + .Headers(API.Base.SiteSettings.Header_Twitter_Authorization) = TXT_AUTH.Text + End With + .Update() + End With + MyDefs.CloseForm() + End If + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.CloseForm(DialogResult.Cancel) + End Sub + Private Sub TXT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_PATH.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then + Dim f As SFile = SFile.SelectPath(Settings.Site(Sites.Twitter).Path) + If Not f.IsEmptyString Then TXT_PATH.Text = f + End If + End Sub + Private Sub TXT_COOKIES_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_COOKIES.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Edit Then + Using f As New CookieListForm(Settings.Site(Sites.Twitter).Responser.Cookies) : f.ShowDialog() : End Using + SetCookieText() + End If + End Sub + Private Sub TXT_COOKIES_ActionOnButtonClearClick() Handles TXT_COOKIES.ActionOnButtonClearClick + With Settings.Site(Sites.Twitter).Responser + If Not .Cookies Is Nothing Then .Cookies.Dispose() + .Cookies = New CookieKeeper(.CookiesDomain) + End With + SetCookieText() + End Sub + Private Sub SetCookieText() + Dim c% = 0 + With Settings.Site(Sites.Twitter).Responser + If Not .Cookies Is Nothing Then c = .Cookies.Count + End With + TXT_COOKIES.Text = $"{c} cookies" + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/UserCreatorForm.Designer.vb b/SCrawler/Editors/UserCreatorForm.Designer.vb new file mode 100644 index 0000000..a492bad --- /dev/null +++ b/SCrawler/Editors/UserCreatorForm.Designer.vb @@ -0,0 +1,378 @@ +Namespace Editors + + Partial Friend Class UserCreatorForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel + Dim TP_SITE As System.Windows.Forms.TableLayoutPanel + Dim TP_PARAMS As System.Windows.Forms.TableLayoutPanel + Dim TP_OTHER As System.Windows.Forms.TableLayoutPanel + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(UserCreatorForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim TT_MAIN As System.Windows.Forms.ToolTip + Me.TXT_USER = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.OPT_REDDIT = New System.Windows.Forms.RadioButton() + Me.OPT_TWITTER = New System.Windows.Forms.RadioButton() + Me.CH_TEMP = New System.Windows.Forms.CheckBox() + Me.CH_FAV = New System.Windows.Forms.CheckBox() + Me.CH_PARSE_USER_MEDIA = New System.Windows.Forms.CheckBox() + Me.CH_READY_FOR_DOWN = New System.Windows.Forms.CheckBox() + Me.TXT_DESCR = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_USER_FRIENDLY = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TP_ADD_BY_LIST = New System.Windows.Forms.TableLayoutPanel() + Me.CH_ADD_BY_LIST = New System.Windows.Forms.CheckBox() + Me.CH_AUTO_DETECT_SITE = New System.Windows.Forms.CheckBox() + Me.TXT_LABELS = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + TP_MAIN = New System.Windows.Forms.TableLayoutPanel() + TP_SITE = New System.Windows.Forms.TableLayoutPanel() + TP_PARAMS = New System.Windows.Forms.TableLayoutPanel() + TP_OTHER = New System.Windows.Forms.TableLayoutPanel() + TT_MAIN = New System.Windows.Forms.ToolTip(Me.components) + TP_MAIN.SuspendLayout() + CType(Me.TXT_USER, System.ComponentModel.ISupportInitialize).BeginInit() + TP_SITE.SuspendLayout() + TP_PARAMS.SuspendLayout() + TP_OTHER.SuspendLayout() + CType(Me.TXT_DESCR, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_USER_FRIENDLY, System.ComponentModel.ISupportInitialize).BeginInit() + Me.TP_ADD_BY_LIST.SuspendLayout() + CType(Me.TXT_LABELS, System.ComponentModel.ISupportInitialize).BeginInit() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + Me.SuspendLayout() + ' + 'TP_MAIN + ' + TP_MAIN.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_MAIN.ColumnCount = 1 + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MAIN.Controls.Add(Me.TXT_USER, 0, 0) + TP_MAIN.Controls.Add(TP_SITE, 0, 2) + TP_MAIN.Controls.Add(TP_PARAMS, 0, 3) + TP_MAIN.Controls.Add(TP_OTHER, 0, 4) + TP_MAIN.Controls.Add(Me.TXT_DESCR, 0, 7) + TP_MAIN.Controls.Add(Me.TXT_USER_FRIENDLY, 0, 1) + TP_MAIN.Controls.Add(Me.TP_ADD_BY_LIST, 0, 5) + TP_MAIN.Controls.Add(Me.TXT_LABELS, 0, 6) + TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + TP_MAIN.Location = New System.Drawing.Point(0, 0) + TP_MAIN.Name = "TP_MAIN" + TP_MAIN.RowCount = 8 + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 19.99851!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 150.0!)) + TP_MAIN.Size = New System.Drawing.Size(454, 366) + TP_MAIN.TabIndex = 0 + ' + 'TXT_USER + ' + Me.TXT_USER.CaptionText = "User name" + Me.TXT_USER.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_USER.Location = New System.Drawing.Point(4, 4) + Me.TXT_USER.Name = "TXT_USER" + Me.TXT_USER.PlaceholderEnabled = True + Me.TXT_USER.PlaceholderText = "Enter user name or url here..." + Me.TXT_USER.Size = New System.Drawing.Size(446, 22) + Me.TXT_USER.TabIndex = 0 + ' + 'TP_SITE + ' + TP_SITE.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_SITE.ColumnCount = 2 + TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_SITE.Controls.Add(Me.OPT_REDDIT, 0, 0) + TP_SITE.Controls.Add(Me.OPT_TWITTER, 1, 0) + TP_SITE.Dock = System.Windows.Forms.DockStyle.Fill + TP_SITE.Location = New System.Drawing.Point(1, 59) + TP_SITE.Margin = New System.Windows.Forms.Padding(0) + TP_SITE.Name = "TP_SITE" + TP_SITE.RowCount = 1 + TP_SITE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_SITE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29.0!)) + TP_SITE.Size = New System.Drawing.Size(452, 30) + TP_SITE.TabIndex = 2 + ' + 'OPT_REDDIT + ' + Me.OPT_REDDIT.AutoSize = True + Me.OPT_REDDIT.Dock = System.Windows.Forms.DockStyle.Fill + Me.OPT_REDDIT.Location = New System.Drawing.Point(4, 4) + Me.OPT_REDDIT.Name = "OPT_REDDIT" + Me.OPT_REDDIT.Size = New System.Drawing.Size(218, 22) + Me.OPT_REDDIT.TabIndex = 0 + Me.OPT_REDDIT.TabStop = True + Me.OPT_REDDIT.Text = "Reddit" + Me.OPT_REDDIT.UseVisualStyleBackColor = True + ' + 'OPT_TWITTER + ' + Me.OPT_TWITTER.AutoSize = True + Me.OPT_TWITTER.Dock = System.Windows.Forms.DockStyle.Fill + Me.OPT_TWITTER.Location = New System.Drawing.Point(229, 4) + Me.OPT_TWITTER.Name = "OPT_TWITTER" + Me.OPT_TWITTER.Size = New System.Drawing.Size(219, 22) + Me.OPT_TWITTER.TabIndex = 1 + Me.OPT_TWITTER.TabStop = True + Me.OPT_TWITTER.Text = "Twitter" + Me.OPT_TWITTER.UseVisualStyleBackColor = True + ' + 'TP_PARAMS + ' + TP_PARAMS.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_PARAMS.ColumnCount = 2 + TP_PARAMS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_PARAMS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_PARAMS.Controls.Add(Me.CH_TEMP, 0, 0) + TP_PARAMS.Controls.Add(Me.CH_FAV, 1, 0) + TP_PARAMS.Dock = System.Windows.Forms.DockStyle.Fill + TP_PARAMS.Location = New System.Drawing.Point(1, 90) + TP_PARAMS.Margin = New System.Windows.Forms.Padding(0) + TP_PARAMS.Name = "TP_PARAMS" + TP_PARAMS.RowCount = 1 + TP_PARAMS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_PARAMS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29.0!)) + TP_PARAMS.Size = New System.Drawing.Size(452, 30) + TP_PARAMS.TabIndex = 3 + ' + 'CH_TEMP + ' + Me.CH_TEMP.AutoSize = True + Me.CH_TEMP.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_TEMP.Location = New System.Drawing.Point(4, 4) + Me.CH_TEMP.Name = "CH_TEMP" + Me.CH_TEMP.Size = New System.Drawing.Size(218, 22) + Me.CH_TEMP.TabIndex = 0 + Me.CH_TEMP.Text = "Temporary" + Me.CH_TEMP.UseVisualStyleBackColor = True + ' + 'CH_FAV + ' + Me.CH_FAV.AutoSize = True + Me.CH_FAV.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_FAV.Location = New System.Drawing.Point(229, 4) + Me.CH_FAV.Name = "CH_FAV" + Me.CH_FAV.Size = New System.Drawing.Size(219, 22) + Me.CH_FAV.TabIndex = 1 + Me.CH_FAV.Text = "Favorite" + Me.CH_FAV.UseVisualStyleBackColor = True + ' + 'TP_OTHER + ' + TP_OTHER.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_OTHER.ColumnCount = 2 + TP_OTHER.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_OTHER.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_OTHER.Controls.Add(Me.CH_PARSE_USER_MEDIA, 1, 0) + TP_OTHER.Controls.Add(Me.CH_READY_FOR_DOWN, 0, 0) + TP_OTHER.Dock = System.Windows.Forms.DockStyle.Fill + TP_OTHER.Location = New System.Drawing.Point(1, 121) + TP_OTHER.Margin = New System.Windows.Forms.Padding(0) + TP_OTHER.Name = "TP_OTHER" + TP_OTHER.RowCount = 1 + TP_OTHER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_OTHER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29.0!)) + TP_OTHER.Size = New System.Drawing.Size(452, 30) + TP_OTHER.TabIndex = 4 + ' + 'CH_PARSE_USER_MEDIA + ' + Me.CH_PARSE_USER_MEDIA.AutoSize = True + Me.CH_PARSE_USER_MEDIA.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_PARSE_USER_MEDIA.Location = New System.Drawing.Point(229, 4) + Me.CH_PARSE_USER_MEDIA.Name = "CH_PARSE_USER_MEDIA" + Me.CH_PARSE_USER_MEDIA.Size = New System.Drawing.Size(219, 22) + Me.CH_PARSE_USER_MEDIA.TabIndex = 0 + Me.CH_PARSE_USER_MEDIA.Text = "Get user media only" + TT_MAIN.SetToolTip(Me.CH_PARSE_USER_MEDIA, "For twitter only!" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "If checked then user media only will be downloaded." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Otherwise" & + " all media (include comments and retwits) will be downloaded.") + Me.CH_PARSE_USER_MEDIA.UseVisualStyleBackColor = True + ' + 'CH_READY_FOR_DOWN + ' + Me.CH_READY_FOR_DOWN.AutoSize = True + Me.CH_READY_FOR_DOWN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_READY_FOR_DOWN.Location = New System.Drawing.Point(4, 4) + Me.CH_READY_FOR_DOWN.Name = "CH_READY_FOR_DOWN" + Me.CH_READY_FOR_DOWN.Size = New System.Drawing.Size(218, 22) + Me.CH_READY_FOR_DOWN.TabIndex = 1 + Me.CH_READY_FOR_DOWN.Text = "Ready for download" + TT_MAIN.SetToolTip(Me.CH_READY_FOR_DOWN, "If checked then this user can be downloaded by [Download All]") + Me.CH_READY_FOR_DOWN.UseVisualStyleBackColor = True + ' + 'TXT_DESCR + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Dock = System.Windows.Forms.DockStyle.Top + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_CLEAR" + Me.TXT_DESCR.Buttons.Add(ActionButton1) + Me.TXT_DESCR.CaptionDock = System.Windows.Forms.DockStyle.Top + Me.TXT_DESCR.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.None + Me.TXT_DESCR.CaptionVisible = False + Me.TXT_DESCR.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_DESCR.GroupBoxed = True + Me.TXT_DESCR.GroupBoxText = "Description" + Me.TXT_DESCR.Location = New System.Drawing.Point(4, 217) + Me.TXT_DESCR.Multiline = True + Me.TXT_DESCR.Name = "TXT_DESCR" + Me.TXT_DESCR.Size = New System.Drawing.Size(446, 145) + Me.TXT_DESCR.TabIndex = 5 + ' + 'TXT_USER_FRIENDLY + ' + Me.TXT_USER_FRIENDLY.CaptionText = "Friendly name" + Me.TXT_USER_FRIENDLY.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_USER_FRIENDLY.Location = New System.Drawing.Point(4, 33) + Me.TXT_USER_FRIENDLY.Name = "TXT_USER_FRIENDLY" + Me.TXT_USER_FRIENDLY.Size = New System.Drawing.Size(446, 22) + Me.TXT_USER_FRIENDLY.TabIndex = 1 + ' + 'TP_ADD_BY_LIST + ' + Me.TP_ADD_BY_LIST.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + Me.TP_ADD_BY_LIST.ColumnCount = 2 + Me.TP_ADD_BY_LIST.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + Me.TP_ADD_BY_LIST.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + Me.TP_ADD_BY_LIST.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) + Me.TP_ADD_BY_LIST.Controls.Add(Me.CH_ADD_BY_LIST, 0, 0) + Me.TP_ADD_BY_LIST.Controls.Add(Me.CH_AUTO_DETECT_SITE, 1, 0) + Me.TP_ADD_BY_LIST.Dock = System.Windows.Forms.DockStyle.Fill + Me.TP_ADD_BY_LIST.Location = New System.Drawing.Point(1, 152) + Me.TP_ADD_BY_LIST.Margin = New System.Windows.Forms.Padding(0) + Me.TP_ADD_BY_LIST.Name = "TP_ADD_BY_LIST" + Me.TP_ADD_BY_LIST.RowCount = 1 + Me.TP_ADD_BY_LIST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + Me.TP_ADD_BY_LIST.Size = New System.Drawing.Size(452, 30) + Me.TP_ADD_BY_LIST.TabIndex = 6 + ' + 'CH_ADD_BY_LIST + ' + Me.CH_ADD_BY_LIST.AutoSize = True + Me.CH_ADD_BY_LIST.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_ADD_BY_LIST.Location = New System.Drawing.Point(4, 4) + Me.CH_ADD_BY_LIST.Name = "CH_ADD_BY_LIST" + Me.CH_ADD_BY_LIST.Size = New System.Drawing.Size(218, 22) + Me.CH_ADD_BY_LIST.TabIndex = 0 + Me.CH_ADD_BY_LIST.Text = "Add by list" + Me.CH_ADD_BY_LIST.UseVisualStyleBackColor = True + ' + 'CH_AUTO_DETECT_SITE + ' + Me.CH_AUTO_DETECT_SITE.AutoSize = True + Me.CH_AUTO_DETECT_SITE.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_AUTO_DETECT_SITE.Location = New System.Drawing.Point(229, 4) + Me.CH_AUTO_DETECT_SITE.Name = "CH_AUTO_DETECT_SITE" + Me.CH_AUTO_DETECT_SITE.Size = New System.Drawing.Size(219, 22) + Me.CH_AUTO_DETECT_SITE.TabIndex = 1 + Me.CH_AUTO_DETECT_SITE.Text = "Auto detect site" + Me.CH_AUTO_DETECT_SITE.UseVisualStyleBackColor = True + ' + 'TXT_LABELS + ' + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 0 + ActionButton2.Name = "BTT_OPEN" + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 1 + ActionButton3.Name = "BTT_CLEAR" + Me.TXT_LABELS.Buttons.Add(ActionButton2) + Me.TXT_LABELS.Buttons.Add(ActionButton3) + Me.TXT_LABELS.CaptionText = "Labels" + Me.TXT_LABELS.CaptionWidth = 50.0R + Me.TXT_LABELS.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_LABELS.Location = New System.Drawing.Point(4, 186) + Me.TXT_LABELS.Name = "TXT_LABELS" + Me.TXT_LABELS.Size = New System.Drawing.Size(446, 22) + Me.TXT_LABELS.TabIndex = 7 + Me.TXT_LABELS.TextBoxReadOnly = True + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(454, 366) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(454, 366) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'UserCreatorForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(454, 366) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.KeyPreview = True + Me.MaximizeBox = False + Me.MaximumSize = New System.Drawing.Size(470, 405) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(470, 405) + Me.Name = "UserCreatorForm" + Me.ShowInTaskbar = False + Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide + Me.Text = "Create User" + TP_MAIN.ResumeLayout(False) + CType(Me.TXT_USER, System.ComponentModel.ISupportInitialize).EndInit() + TP_SITE.ResumeLayout(False) + TP_SITE.PerformLayout() + TP_PARAMS.ResumeLayout(False) + TP_PARAMS.PerformLayout() + TP_OTHER.ResumeLayout(False) + TP_OTHER.PerformLayout() + CType(Me.TXT_DESCR, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_USER_FRIENDLY, System.ComponentModel.ISupportInitialize).EndInit() + Me.TP_ADD_BY_LIST.ResumeLayout(False) + Me.TP_ADD_BY_LIST.PerformLayout() + CType(Me.TXT_LABELS, System.ComponentModel.ISupportInitialize).EndInit() + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents TXT_USER As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents OPT_REDDIT As RadioButton + Private WithEvents OPT_TWITTER As RadioButton + Private WithEvents CH_TEMP As CheckBox + Private WithEvents CH_FAV As CheckBox + Private WithEvents CH_PARSE_USER_MEDIA As CheckBox + Private WithEvents TXT_USER_FRIENDLY As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents CH_READY_FOR_DOWN As CheckBox + Private WithEvents TXT_DESCR As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TP_ADD_BY_LIST As TableLayoutPanel + Private WithEvents CH_ADD_BY_LIST As CheckBox + Private WithEvents CH_AUTO_DETECT_SITE As CheckBox + Private WithEvents TXT_LABELS As PersonalUtilities.Forms.Controls.TextBoxExtended + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/UserCreatorForm.resx b/SCrawler/Editors/UserCreatorForm.resx new file mode 100644 index 0000000..d566329 --- /dev/null +++ b/SCrawler/Editors/UserCreatorForm.resx @@ -0,0 +1,591 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + False + + + False + + + False + + + False + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + AAABAAkAMDAQAAAAAABoBgAAlgAAACAgEAAAAAAA6AIAAP4GAAAQEBAAAAAAACgBAADmCQAAMDAAAAEA + CACoDgAADgsAACAgAAABAAgAqAgAALYZAAAQEAAAAQAIAGgFAABeIgAAMDAAAAEAIACoJQAAxicAACAg + AAABACAAqBAAAG5NAAAQEAAAAQAgAGgEAAAWXgAAKAAAADAAAABgAAAAAQAEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAgACAAAAAgACAAICAAADAwMAAgICAAAAA/wAA/wAAAP//AP8A + AAD/AP8A//8AAP///wAiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi + IiIiIiIiIiIiIiIiIiAAAyIiIiIiIiIiIiIiIiIiIiIiIiIiIgAAADIiIiIiIiIiIiIiIiIiIiIiIiIi + IAC7sAMiIiIiIiIiIiIiIiIiIiIiIiIiIAsHuwAyIiIiIiIiIiIiIiIiIiIiIiIiILuAe7ADIiIiIiIi + IiIiIiIiLMAAAAAAALO4B7sAMiIiIiIiIiIiIiLAAADMZmZmwLs7gHuwAyIiIiIiIiIiLAAAxmZmzMzM + wACzuAe7ADIiIiIiIiIsAAZmzMzMzMzMAAC7u4B7sAMzMzMzIiLABszMzMzMzMzAAAAAC7gHuwAAAAAA + MiIAbMzMzMAAAAwAAAAACzuAe7gzMzMwAyIGzMzMAAODcwAAABEAC7u4C7u7u7uzADIAzMwAODc3NzAB + GRkQAAC7uwuwi7u7MAMgDMCDc3Nzc4ARERERAAALsLsIu3i7swMiAMA3Nzc3NwABODg4AiILC7CLtxe7 + swMiIABzc3NzgwODg4OAIiILuwi7cHu7swMiIgA3Nzc3OAg4ODgCIiILsIu3F7u7swMiIiADc3OAAAAA + g4AiIiILCLtwe3d3swMiIiAINzg4Nzc3CDAiIiI7i7cXswADswMiIiADg3Nzc3N3A4AiIiI7u3B7MIIg + swMiIgAACDc3Nzc3AAAAACI7txe7MIIDswMiIAAAAHNzc3ODA4ODgwI7uHu7MIA7sDIiAAAAADc4Nzc3 + CDg4OAIju7u7MwO7AyIiAAAAA3ODc3NzAIODgwIiO7u7u7uwMiIgAAAIdzc3N3c3Nwg4MAIiI7u7u7sD + IiIAAAADc4Nzd3NzcwODgwIiIjMzMzMyIiIAAAAHdzc3d3c3MDg4OAAiIiIiIiIiIiIAAAADc3Nzc3Nz + cIODg4MCIiIiIiIiIiIAAAAANzg3NzA3MDg4ODgCIiIiIiIiIiIAAAAAAACDc3AAAIODg4AiIiIiIiIi + IiIAAAAAAAA4Nzc3ADg4ODAiIiIiIiIiIiIAAAAAAAADc3NzcIOAg4AiIiIiIiIiIiIAAAAAAAAANzc3 + cDgwAAgiIiIiIiIiIiIAAAAAAAAAA3NzcIODgwgiIiIiIiIiIiIAAAAAAAAAADc3MDg4OAgiIiIiIiIi + IiIgAAAAAAAAAAAAAIODg4AiIiIiIiIiIiIgAAAAAAAAAAAAADg4ODAiIiIiIiIiIiIiAAAAAAAAAAAA + AACDg4ACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAACIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAACIiIiIiIi + IiIiIiIAAAAAAAAAAAAAAAACIiIiIiIiIiIiIiIiIiAAAAAAAAAAAAAiIiIiIiIiIiIiIiIiIiIAAAAA + AAAAACIiIiIiIiIiIiIiIiIiIiIiAAAAAAAAIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi + IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiL///////8AAP///////wAA///+D///AAD///wH//8AAP// + +AP//wAA///4Af//AAD///gA//8AAP+AAAB//wAA/AAAAD//AADgAAAAH/8AAIAAAAAADwAAAAAAAAAH + AAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAAAACAAAAAAAAAAMAAABwAAAAA4AAAPAAAAADwAAB8AAAAAPgA + APwAAAAA+AAA/AAAAAD4AAD8AGAAAPAAAAwAQAAA4AAABAABAADAAAAGAAMAAMAAAAcABwAAgAAAB4AP + AAAAAAAHwB8AAAAAAAP//wAAAAAAAf//AAAAAAAB//8AAAAAAAP//wAAAAAAA///AAAAAAAD//8AAAAA + AAP//wAAAAAAA///AAAAAAAD//8AAIAAAAP//wAAgAAAA///AADAAAAB//8AAOAAAAH//wAA8AAAAf// + AAD8AAAB//8AAP/gAAP//wAA//AAD///AAD//AA///8AAP///////wAA////////AAAoAAAAIAAAAEAA + AAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAICAAIAAAACAAIAAgIAAAMDA + wACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////ACIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIAAy + IiIiIiIiIiIiIiIiIgCIAyIiIiIiIiIiIiIiIiIHC4AyIiIiIiIiIiiAAAAAC3C4AyIiIiIiIoAAAAzM + zAC3C4AyIiIiIoAADMzMzMABAHC4AzMzMiIADMzAAMwAERC3C4AAAAMiDMzAA4MAARGRALC7u7uAMiDM + CDc3MAhziRALsws7uAMgAHdzeAGDhzAiCzCzC7sDIgA3N4MAOHMCIgsLMLu7AyIgA3MBAQOAIiI7swgA + iwMiIAc3g4dwMCIiOzCwggsDIgAAd3d38AAAIjt7sIC7gyAAAAd3dzE4NwIju7gLuDIgAAB3c3dwA4cC + Iju7u4MiAAAHdzd/d3A4EiIjMzMyIgAAB3d3938DgwAiIiIiIiIAAAA3d3B3CHdzAiIiIiIiAAAAADdx + AAd3MCIiIiIiIgAAAAADd3ADCHAiIiIiIiIAAAAAADf3CBADIiIiIiIiAAAAAAADdwN3CCIiIiIiIiAA + AAAAAAAIc3AiIiIiIiIgAAAAAAAAADcwAiIiIiIiIgAAAAAAAAAAAAIiIiIiIiIiAAAAAAAAAAACIiIi + IiIiIiIgAAAAAAAAIiIiIiIiIiIiIiAAAAAAIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi + IiIiIiIi///////+H////A////wH//gAA//AAAH/AAAABwAAAAMAAAABgAAAAIAAMADAAHAA4ADwAOAA + 8BDAADAAgAAYAYAAHAMAAB4HAAAP/wAAB/8AAA//AAAP/wAAD/8AAA//gAAP/4AAB//AAAf/8AAH//4A + D///gD////////////8oAAAAEAAAACAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + gAAAAAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////ACIi + IiIAMiIiIiIiIDsDIiIiDMRAsLAyIgzMzMwLCwAyDMAAABCwuwMAB3ARkjuzsCB3gAAiOzCwIgh3cAA7 + uzMgBzdwhwMzMgB3f3cIAiIiAHd3AHOIIiIAAHfwMAIiIgAAB3CHAiIiAAAAADgAIiIgAAAAAAAiIiIg + AAAAAiIi/x/AA/4PARHAB7C7AAGAMgAACDcAQAhzgMALs8AAuAOAAXdzAB+DhwAPCzAAH7sDAB83NwAP + OHOADwsL4B+7AygAAAAwAAAAYAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////ABEM + aQAAAAAANBpLAAAAAAB/TG4AYF5eAP1lVAD8ZFMA/WZVAPljUAD9alcA/WtYAL+LhADnWD4A711GAP1y + XAD9dV4A/XhgAPFoTgDzbVMA/XxkANxRMQD4e18A/YRpANJMJwDvdlYA/IttAP2OcADNSCEA4GZCALFl + TQD+knIAwEATAKU/GQDSXDIA1WI3AOuAWQD5km8At0YbAMVXKwDMXS8At1cxAH5AJwCFRy4A6Zp6AGxV + TACMUDYA13RFAGpjXwDViFUAbUkxAP+/kQCsZSsA7riKAJpYGQD/798A/8+cAP/ZpgDf0bwAhWAaAP3j + sAD/9+gAkXkwAP//8gD///wAv9msAICrZwDP4sUAcKlfAEiQNwBtxGIAespvAEyZRgBqqWYAL5gtAAqF + CgAWihYAGpYaAB6PHgAZdxkAKa0pACOQIwAbaBsAPLc8AEO7QwBAs0AAJWYlADmaOQBKvkoAT8FPAESm + RABSwlIATbNNAFC4UABWxFYAW8VbAGPKYwBpzWkAb9FvAGfAZwBFfkUAddJ1AHHLcQB813wAj+CPAICz + gAA1WTgAn7CkADd9VwACaHYAaZquABNyogAYdqYAF2OKACBggQAsWG8AE1+IACR+rgA5n9kAOou3AD+V + wwBHn9AAV6nXAGOr0gCezOYAo9DqAA1zswAkfbYAIm6dAD2i3wBNs/IAU7n5AHq74QCEwOQAlMjnAJfK + 6ACezekAFXm6ACOFxgBDqO0AUbf/AFW7/wBWvP8AWmBkABuBzQAfhdQAS7H/AE2z/wBOtP8AQnOZACeM + 4gAtkuYARKn/AESq/wBHrf8ASa//ACyS8QA6oP8APKH/AD2i/wBApv8AQ6j/ADKW/AAylfsAM5n/ADWb + /wA3nf8AEliiAC+M8wAxkfkANpT3AAkSHAAXY7oAKnziAC2C6gAndNoAJnHXACl64AAod90AIWK1ACNo + zgAkatAAFlOwAB5fwgAgYMYAImXLABBCngAcVrwAI2jdAB5awAAQLFsADhksABtRtwAaTbMADSloAB1W + 0gAWQZ4AGUiuAAUpgwAUP6QAFDyiABQ6oAASNZsADCV+AA8tkwAQL5UABQcOAAgdbAANJo0ABxVbAAYY + ewAuNFcAHyApAAQMcgABAhUAAQRqAKSkpACXl5cAj4+PAISEhAB+fn4AcXFxAG1tbQBmZmYAVFRUAE1N + TQBKSkoARkZGAD8/PwA4ODgANjY2AC8vLwAsLCwAKioqACgoKAAkJCQAISEhAB8fHwAcHBwAGhoaABgY + GAAXFxcAEhISAA0NDQAKCgoAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF4ODhMuEy4TIy4TLh4eDg + 4ODgBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXg4SMsIiMiIyIjIiMjIywsNC/h4eAFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBeAoIiIeGhcPFxALCwkQDyIiIiIjIzTg4QUFBQUFBeDg4ODg4ODg4ODg + 4AUFBQUFBSsiIhoaFw8QCwgIDAwNDygiEAsPGiIjNODg4eEH4eJsWGxYbFhsWGxs4+HgBQUFBSseGhoP + DwsJDA0RERERIjcpDwoJCxcaIjRYVE1UVE1QU1NTU05OT01NTVRY4AUFBSsoGg8XCwkMERMWFhYaKz4z + HhENCAsPFyJRWVZbTU1fWltbVlZVUlJST09N4uAFBTMiFw8LCA0RFhYZGTEoOz47IhYRDQkLDyJKW11Z + TFFZYGFdXVtWVlJSUk9NbOAFBTEiDxAJDRETGRkdGSIuPj4+KxQWEQ0IDyJKYGFObUNNYmJiYF1bVlZV + UlJNWOAFBQUjFwsMERYZGR0hHio7Ozs7MxcZFhEMECJGYWJUPkFKU2hjY2JgXVZWVVJNbOAFBQUxIgsN + ExYZHSEqKTo7Ozs7MykZFhMNCyJiZF9TPz85UV5oZGNiYFtWVVJN4OAFBQUFKx4RFhkdJyYiNzU6OjU6 + Lh4dGRYRFzhkZ1lrQUFBbU1oaWdjYmFbVlJU4AUFBQUFBSIXFhkdJiImNzo3NTo6LiIdGRMfIkRnZ05D + QkJCQmtRaWlkYmFdVk1m4AUFBQUFBQUrKSYbIjEOIAYGDiE3NyIdGR8iQGdpalQ/AQEBAT9TSmlnZGJg + UFTgBQUFBQUFBQUFMTEiIwTX2dfZ19kGJiIxKCNGSGdpak0/Pz8/Pz9DVF5pZGJMVOEFBQUFBQUFBQUF + 4OnvwdPU0tLS0s3ZBCMjIFRcZ2lqaFQ5OTk+OTk+alRlZ0xU4AUFBQUFBQUFBQX1APf3AADTz8/Pz8/S + 1wIFBQVUTmVqZVM+bXdxcXF320RNUVTgBQUFBQUFBQUF8AD29/YA0NPNzMvLy8vMz9nVBQUFTVROWU13 + gJKSkpKSgHZUWOAFBQUFBQUFBQXw9/b19fatzMfHx8fHx8fHy87XBQUFBQUFZnaLk5iTmJOTmJJx4+AF + BQUFBQUFBQX39fX09ADOx8PDw8PDw8PDw8fU1QUFBQUFl5KYmZmenpmZmJiScePgBQUFBQUFBQD19PTw + 9K3Dw729vb25vb29vcPSxAUFBQUFgKWmpqampqampqWeknbgBQUFBQUFBfb08PDw9MC9vbm7u7u7u7u5 + ub3HyAUFBQWAnqenqKioqKiop6empot14AUFBQUFBfXw8O3t9NG6u7q3t7e3t7e3u7q6zcgFBQWAqJ+f + oaGhoaGhn5+op6V24AUFBQUFBfTt7err8cG3t7KytLS0tLSysre7yMgFBQWAoaGhoqKioqKioaGhn5+L + deAFBQUFBfDt6uvo6q2ytLSvsLCwsK+wtLKyvMgFBZeeoqObm5ycnJubo6OioaGYdeAFBQUFBfTq6+jo + 5/e7r7CqqqqqqqqwsLC0vHYFBXmNm5ydnZSUlJSdnZybo6KhduAFBQUFBfTo6Ojn5vHIqqqmpqanpqal + qrCwvMgFBZebnZWVlpaOjpaWlZWdnKOigOAFBQUFBfbo6ebl5ujQtLCqqqefn6inpqWeyAUFBXmUlY6O + j5CQkJCOjo6VlJybkuAFBQUFBfDq5ubl5OTxwcvDt7exsKunpqaYyAUFBZeWjo+QkJCQkJCQkI6OlpWd + kuAFBQUFBQX15uXk4uPi6vT2rdHJvcW3t7LA8gUFBXmNkJCQkJCQkJCQkJCPjpaVi+AFBQUFBQX16OTk + 5uIH4N/f5vHY08TUxK0A6AUFBZeDkJB4jIt4m5WWjo6OlpSMceAFBQUFBQUF9uTi4uLh393a2tsH6fD0 + 8Or3BQUFBXmMjHGLenqMcYuTmKekmItyduAFBQUFBQUF9fXiB+Hg393b2kNt3d8H5PTtBQUFBQVxcXKM + eHx8fYZ6eXFyd3dxc+AFBQUFBQUFBfX04uHf3t3d3Nra294H6/YFBQUFBQUFcXp6fHx9h4d/f399cIGA + dAUFBQUFBQUFBQX19eLe3dzb3d7f4OLt9gUFBQUFBQUFcXp8fX2Hh35/f4d8end24AUFBQUFBQUFBQUF + BfXw4t7b3eDk7vbmBQUFBQUFBQUFBXF8fYeHiYeHfXx8enGXBQUFBQUFBQUFBQUFBQUF9fUAAPXoBQUF + BQUFBQUFBQUFBQVxfYd+f4qHh318cnkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + cXmHf39+fHdyBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXmXeZd5l3kFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUF////////AAD///////8AAP///////wAA////////AAD///////8AAP// + /////wAA4AAH////AADAAAH///8AAIAAAH4AHwAAgAAAAAAHAACAAAAAAAMAAIAAAAAAAQAAgAAAAAAB + AACAAAAAAAEAAMAAAAAAAQAAwAAAAAABAADgAAAAAAMAAPAAAAAAAwAA+AAAAAAHAAD8AAAAAA8AAPwA + AAAAHwAA+AAOAAA/AADgAAcAAH8AAMAAB+AAfwAAwAAD4AA/AACAAAPgAD8AAIAAA8AAHwAAgAABwAAf + AACAAAHAAA8AAIAAAYAADwAAgAABgAAPAACAAAGAAA8AAIAAA4AADwAAgAADgAAPAADAAAOAAA8AAMAA + A4AADwAA4AAHgAAPAADgAAfAAA8AAPAAD+AAHwAA+AAf4AAfAAD+AD/wAD8AAP+B//gAfwAA/////AH/ + AAD////+A/8AAP///////wAA////////AAD///////8AAP///////wAAKAAAACAAAABAAAAAAQAIAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AEQxpAAAAAAA0GksATCFPAH9MbgBgXl4A/WVUAPxk + UwD9ZlUA+WNQAP1qVwD9a1gAv4uEAOdYPgDvXUYA/XJcAP11XgD9eGAA8WhOAPNtUwD9fGQA3FExAPh7 + XwD9hGkA0kwnAO92VgD8i20A/Y5wAM1IIQDgZkIAsWVNAP6ScgDAQBMApT8ZANJcMgDVYjcA64BZAPmS + bwC3RhsAxVcrAMxdLwC3VzEAfkAnAIVHLgDpmnoAbFVMAIxQNgDXdEUAamNfANWIVQBtSTEA/7+RAKxl + KwDuuIoAmlgZAP/v3wD/z5wA/9mmAN/RvACFYBoA/eOwAP/36ACReTAA///yAP///AC/2awAgKtnAM/i + xQBwqV8ASJA3AG3EYgB6ym8ATJlGAGqpZgAvmC0ACoUKABaKFgAalhoAHo8eABl3GQAprSkAI5AjABto + GwA8tzwAQ7tDAECzQAAlZiUAOZo5AEq+SgBPwU8ARKZEAFLCUgBNs00AULhQAFbEVgBbxVsAY8pjAGnN + aQBv0W8AZ8BnAEV+RQB10nUAcctxAHzXfACP4I8AgLOAADVZOACfsKQAN31XAAJodgBpmq4AE3KiABh2 + pgAXY4oAIGCBACxYbwATX4gAJH6uADmf2QA6i7cAP5XDAEef0ABXqdcAY6vSAJ7M5gCj0OoADXOzACR9 + tgAibp0APaLfAE2z8gBTufkAervhAITA5ACUyOcAl8roAJ7N6QAVeboAI4XGAEOo7QBRt/8AVbv/AFa8 + /wBaYGQAG4HNAB+F1ABLsf8ATbP/AE60/wBCc5kAJ4ziAC2S5gBEqf8ARKr/AEet/wBJr/8ALJLxADqg + /wA8of8APaL/AECm/wBDqP8AMpb8ADKV+wAzmf8ANZv/ADed/wASWKIAL4zzADGR+QA2lPcACRIcABdj + ugAqfOIALYLqACd02gAmcdcAKXrgACh33QAhYrUAI2jOACRq0AAWU7AAHl/CACBgxgAiZcsAEEKeABxW + vAAjaN0AHlrAABAsWwAOGSwAG1G3ABpNswANKWgAHVbSABZBngAZSK4ABSmDABQ/pAAUPKIAFDqgABI1 + mwAMJX4ADy2TABAvlQAFBw4ACB1sAA0mjQAHFVsABhh7AC40VwAfICkABAxyAAECFQABBGoApKSkAJeX + lwCPj48AhISEAH5+fgBxcXEAbW1tAGZmZgBUVFQATU1NAEpKSgBGRkYAPz8/ADg4OAA2NjYALy8vACws + LAAqKioAKCgoACQkJAAhISEAHx8fABwcHAAaGhoAGBgYABcXFwASEhIADQ0NAAoKCgACAgIAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4ODg4ODg4OAAAAAAAAAAAAAAAAAA + AAAAAAAAAODgMC0tLS0tLTQvMuDg4AAAAAAAAAAAAAAAAAAAAAAAKyIaFw8QCwgIHhoaIywv4ODg4ODg + 4ODg4ODg4OAAAAAiGhcQCQwREhQzKgoLDyI0WFhUUVNQUFBOUVRs4OAAACIXEAoRExYZKT4zFQwJEDhX + W0xTXV1aVlVSUk1R4AAAKQ8JERMZHCU3PjcfEwwLNmBhRkReYmFdVlVST1HgAAAqDw0TGSEmMzs7OyQZ + Ego2Y1xDP0pnY2JgVlVPUeAAAAAqGxYcJyo6Ojo6MRwTFEBnWUFBRVlpZGJbVVHgAAAAAAAlGxwqLg4O + NzUxHRgoSWlLQgEBa2VpY2FMUQAAAAAAAAAgKAXZ19cCBiQkPUhpaks/Pzk5SmhkX2YAAAAAAAAA5PL3 + 2M3Pz87UBAdLWWRqRDxweXBtR1xmAAAAAAAAAPT29tDEzMrKysvU1QAASkpugJKTkotvbOAAAAAAAADy + 9fT1xMfHw8PDx8nRAAAAAACenp6enpN2B+AAAAAAAPTz8fXCvb+/ub+9vcipAACBpqenp6empph14AAA + AADw8e/twbq7tre3t7u7vHUAcZigoKCgoKCfqIuR4AAAAPDu7Orzt7G0s7OztLK41QBxoaOam5ubo6Kh + mXXgAAAA8Ovp6O21sKqrpauqr7l1AHGbnJSUlJSdnJqidOAAAADw6+fm5sCqq6efp6akrnUAcZSVjo6O + jpaVnZuC4AAAAADw5uXj6sDGxb6wrKupqQBxjo+QkJCQj46WlIvgAAAAAOvm5OQH4ePW09LMxK0AAHGQ + hYN4hI6QhY6NceAAAAAAAOvi4uHd29rf5enr5gAAcYtxjHp5jJKTjHdzAAAAAAAAAO4H393c2tre5PEA + AACLcXp7fIaJfn16cpcAAAAAAAAAAOzh3Nvd4OXpAAAAAABxeXyGh4p+fXpxAAAAAAAAAAAAAOzs7Ozs + 7AAAAAAAAABxe4h/iIZ8dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxcXFxcXEAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////+AH//+AAP//gAAAA4AA + AAGAAAABgAAAAYAAAAHAAAAD4AAAB/AAAA/gAAAfwAMAH4AD4A+AAYAPAAEABwABAAcAAQAHAAEAB4AB + AAeAAwAHwAMAD+AHAA/wD4Af+B/AP///4H////////////////8oAAAAEAAAACAAAAABAAgAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wARDGkAAAAAADQaSwBMIU8Af0xuAGBeXgD9ZVQA/GRTAP1m + VQD5Y1AA/WpXAP1rWAC/i4QA51g+AO9dRgD9clwA/XVeAP14YADxaE4A821TAP18ZADcUTEA+HtfAP2E + aQDSTCcA73ZWAPyLbQD9jnAAzUghAOBmQgCxZU0A/pJyAMBAEwClPxkA0lwyANViNwDrgFkA+ZJvALdG + GwDFVysAzF0vALdXMQB+QCcAhUcuAOmaegBsVUwAjFA2ANd0RQBqY18A1YhVAG1JMQD/v5EArGUrAO64 + igCaWBkA/+/fAP/PnAD/2aYA39G8AIVgGgD947AA//foAJF5MAD///IA///8AL/ZrACAq2cAz+LFAHCp + XwBIkDcAbcRiAHrKbwBMmUYAaqlmAC+YLQAKhQoAFooWABqWGgAejx4AGXcZACmtKQAjkCMAG2gbADy3 + PABDu0MAQLNAACVmJQA5mjkASr5KAE/BTwBEpkQAUsJSAE2zTQBQuFAAVsRWAFvFWwBjymMAac1pAG/R + bwBnwGcARX5FAHXSdQBxy3EAfNd8AI/gjwCAs4AANVk4AJ+wpAA3fVcAAmh2AGmargATcqIAGHamABdj + igAgYIEALFhvABNfiAAkfq4AOZ/ZADqLtwA/lcMAR5/QAFep1wBjq9IAnszmAKPQ6gANc7MAJH22ACJu + nQA9ot8ATbPyAFO5+QB6u+EAhMDkAJTI5wCXyugAns3pABV5ugAjhcYAQ6jtAFG3/wBVu/8AVrz/AFpg + ZAAbgc0AH4XUAEux/wBNs/8ATrT/AEJzmQAnjOIALZLmAESp/wBEqv8AR63/AEmv/wAskvEAOqD/ADyh + /wA9ov8AQKb/AEOo/wAylvwAMpX7ADOZ/wA1m/8AN53/ABJYogAvjPMAMZH5ADaU9wAJEhwAF2O6ACp8 + 4gAtguoAJ3TaACZx1wApeuAAKHfdACFitQAjaM4AJGrQABZTsAAeX8IAIGDGACJlywAQQp4AHFa8ACNo + 3QAeWsAAECxbAA4ZLAAbUbcAGk2zAA0paAAdVtIAFkGeABlIrgAFKYMAFD+kABQ8ogAUOqAAEjWbAAwl + fgAPLZMAEC+VAAUHDgAIHWwADSaNAAcVWwAGGHsALjRXAB8gKQAEDHIAAQIVAAEEagCkpKQAl5eXAI+P + jwCEhIQAfn5+AHFxcQBtbW0AZmZmAFRUVABNTU0ASkpKAEZGRgA/Pz8AODg4ADY2NgAvLy8ALCwsACoq + KgAoKCgAJCQkACEhIQAfHx8AHBwcABoaGgAYGBgAFxcXABISEgANDQ0ACgoKAAICAgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA39/f4ODg4OAAAAAAAAAA4CAwMDAw + LzLf4ODg4N/f4B8XCxEUMRQabGxMR0xYbOAzCxYcMzoVDEBeS2JdVVPgAB8ZJjo6Gw1EazleZ1tH4AAA + IAXVBiBAaWo/Q2FcAAAA89DEy8/R4kuXi4Fu4wAA5vHAw73Cz+JwnqamnnXdAPTszrGysr+ReqKioqGM + 4ADq6HWrpqy3kXuUlJWdmeEA4OTm5cm6dt58hISPjo3gAADn4dza4+UAfYF8fXtxcAAAAOAHB+EAAAB5 + h397cAAAAAAAAAAAAAAAAHl5eQAAAAAAAAAAAAAAAAAAAAAAAAD//xcQgH8TFgAAPjMAAAkQAABbTIAA + XVrAA1JSgAPgAAABDwkAARkcAAE+NwABDAuBAWFGw4NiYf/HVVL//+AAKAAAADAAAABgAAAAAQAgAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAATAAAAHgAAACUAAAAsAAAALwAA + AC8AAAAvAAAALwAAAC8AAAAvAAAALgAAACkAAAAkAAAAHwAAABgAAAARAAAACQAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAEAAAADEAAABVAAAAbQAA + AHwAAACJAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjAAAAIMAAAB5AAAAbgAAAGEAAABSAAAAQAAA + AC4AAAAfAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKA0BRm0i + ArWIKgLijy0C67A3A/+wNwP/sDcD/7A3A/+wNwP/sDcD/7A3A/+wNwP/nzID944sAu2FKgLnaSEC11Qa + AckwDwGyAAAAlwAAAIcAAABwAAAAUAAAAC0AAAARAAAABAAAAAAAAAAAAAAAAQAAAAQAAAAKAAAADwAA + ABUAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAFQAAAA0AAAAGAAAAAQAAAAAAAAAAAAAAAAAA + AAB8JwJErDYD9bk8DP/AQBT/ykcf/9RNKf/dUjL/4lU4/+hYPv/uXET/9WBL//diTv/6Y1H/7lxE/+pa + QP++PxH/uTwM/8VDGf+0OQf/qDQD+4UpAulSGgHNAAAAnQAAAH0AAABPAAAAKAAAABwAAAAiAAAALAAA + ADcAAABDAAAATQAAAFkAAABfAAAAXwAAAF8AAABfAAAAXwAAAF8AAABfAAAAWQAAAEoAAAA6AAAAJwAA + ABEAAAAEAAAAAAAAAACjMwOsuj0N/8lGHv/RSyb/104s/+FUNv/lVzv/8F1G//hiT//9ZVT//WZV//1p + V//9alj//WpY/+pdQv+1Qw//tToI//hiT//4Yk//6lk//9BKJf+2Owr/nzID90UWAcwAAACYAAAAdQAA + AGgAAAB2AAwAjwAmAK0AJACzAD8AzwA+ANIAPgDTAD4A0wA+ANMAPgDTAD4A0wA+ANMAPgDTACMAuwAT + AKkAAACSAAAAegAAAEkAAAAWAAAAAQAAAACoNQPIw0IX/9BLJf/XTiz/4VQ2/+hYPv/1YEv//GVT//1o + Vv/9bVn//XBc//1zXv/9dF//+HBZ/7o+Dv/muYb/v1sn/+BYOf/9aFb//GVT//VgS//oWD7/1k4s/7M5 + Bv9iLAHlADwA2ABTAOoAYgD6AGYA/wVsBf8KcQr/H4wf/yORI/8ikCL/IJAg/yCQIP8cjhz/Go0a/xaL + Fv8OgA7/CHcI/wJqAv8AXAD3ACgAzAAAAIUAAAA3AAAACAAAAACqNQPGx0Ub/9ZOK//hVDb/6Fg+//Vg + S//9ZlT//WtY//1xXP/9d2D//Xpi//18ZP/9f2b/0lUt/8RkMf//7rv/3J5r/8hKH//9cVz//WxZ//1m + VP/1YEv/6Fg+/9xRMf+wNwP/I4IY/zGhMf9DtEP/Tb9N/wVsBf8Odw7/UMFQ/0/AT/9Nv03/S75L/0e8 + R/9CukL/PLc8/zSzNP8tsC3/Jawl/xynHP8SlRL/AWoB/wATAK0AAABTAAAAEgAAAACrNQO0xUQa/91S + Mv/lVzv/9WBL//1mVP/9bVr//XNe//16Yv/9f2b//YNp//2Gav/lbkv/tUIO//rbqf//6Lb/9dKf/7A3 + A//9emL//XNe//1tWv/9ZlT/9WBL/+ZXPP+9PxH/ZZ06/06/Tv9Tw1P/NaE1/zCDKP8geRv/Mpwy/1nG + Wf9Yxlj/VcRV/1HBUf9Mv0z/R7xH/z+5P/81tDX/LrAu/yWsJf8cpxz/Cn4K/wA4AM0AAABcAAAAFgAA + AACpNQNkuj0O/+NVOf/wXUb//GVT//1sWf/9c17//Xpi//2CaP/9h2v//o1v//mJav+1PAr/5qt4///h + rv//4q///+Kw/79XI//qb07//Xpi//1zXv/9bVn//GVT//BdRv+9PxH/aqA//1jGWP9eyF7/HoUe/5/G + iv+/2ab/BmwG/2DGYP9ky2T/YMlg/1vHW/9WxFb/T8BP/0i9SP9BuUH/N7U3/y2wLf8kqyT/DoYO/wA+ + ANEAAABVAAAAEwAAAACmNAMRrzcD8dtRMP/4Yk///WhW//1xXP/9emL//YJo//2IbP/+j3D//pR0/8RP + IP/OdED//9uo///bqP//3Kn//9yp/9N/S//XXjb//YJo//16Yv/9cl3//WlX//hiT/+8PhD/caNG/2TL + ZP9ix2L/AGYA/+/11f///+T/YJ9W/ySIJP9v0G//a85r/2XMZf9fyV//WMZY/1HBUf9JvUn/P7k//zW0 + Nf8qrir/DoAO/wA6AMQAAABBAAAACgAAAAAAAAAArDYDg7w+EP/9ZVT//W5a//13YP/9f2b//Ydr//6P + cP/+lnX/12g9/79UIP/6ypf//9Sh///Uof//1qP//9aj/9yQXf/IUiX//Ydr//1/Zv/9d2D//W5a//hi + T/+wNwP/Z8xn/27Qbv9PsE//MIMs////6f///+v/7/Xc/xBwD/9TslP/dtR2/3HRcf9ozWj/Ycph/1jG + WP9PwE//R7xH/z64Pv8xsjH/BW8F/wAhAJUAAAApAAAAAgAAAAAAAAAAAAAAAK83A9HNSiL//XBc//16 + Yv/9g2n//o1v//6UdP/melL/tUAM//Cwff//zpv//86b///Om///z5z//8+c/+updv/ETR///o1v//2E + af/9emL//XFc/+BWN/+eXR3/cdFx/3fUd/83mDf/gLN4////8P////L////y/6/Pp/8IbQj/cMtw/3rW + ev9y0nL/aM1o/2DJYP9YxVj/Tr9O/0K6Qv8onSj/AF4A8wAAAFQAAAATAAAAAAAAAAAAAAAAAAAAAKY0 + AxGvNwPw11Yx//18ZP/9hmr//o9x/++GYP+1PQr/5o9h//68jv//v5H//7+R///Ck///xpX//8aV/+ul + cv+/SRn//o9x//2Ha//9fWX/72lO/7U7Cf+AqlX/d9R3/4HZgf8ihCL/v9m6////+P////n////6//// + +v9wqW//IoQi/4Lagv971nv/cdFx/2fMZ/9bx1v/U8NT/0i9SP8Mdgz/ADoAqgAAACoAAAAEAAAAAAAA + AAAAAAAAAAAAAAAAAACpNQMyrTYD0shOIv/0f2D/74Bd/7U9Cv/hdEv/3ox5/59mdf9/U3P/f1l3/79/ + e//+p4D//qyE//6shP+wNwP//pJz//6Jbf/qbU3/tTsJ/5F5MP900nT/f9l//4jdiP8AZgD/7/Xv//// + ///////////////////v9e//MIMw/0WiRf+B2YH/dtR2/23Pbf9hymH/WMVY/yeTJ/8AWwDoAAAAQAAA + AA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUxoBIpkwA6W1PAr/tTwK/48tFv86HWD/AAFn/wEF + av8DCG7/Awhu/wABZ/8QC2j/f0xt/+p6Vf+6QxH/4XFJ/8NMHv+rQAj/gZRA/23Pbf951Xn/g9uD/43f + jf8AZgD///ny///58v//9+////Xs///17P//9Oj/z9e5/xBuDf9ct1z/fdd9/3HRcf9mzGb/OKI4/wBj + APcALwBpAAAAEwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAoAAAAoAAAAVAAAAJUaCAHYTRgI/wAD + NP8CCFP/Ch6D/w0njf8NJ43/DSeN/wwli/8IGn7/AQhr/yYUXP+lNAr/mzED6240ArMRaQb/RatF/3DR + cP99133/iN2I/3TJdP8gdhr//+zZ///o0v//6NL//+jS///lzP//48f//+LG/6+6hv8IbQj/aMNo/3PS + c/86oDr/AGMA9wAwAGYAAAATAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAAADAAAADYAAACnAAAA8wEB + Af8DAwP/BAQE/wICAv8AAAD/CRlT/xAxl/8RMpj/ETKY/xEymP8QMJb/DSiN/wMQc/8MDFXzAAAAogAA + AFwAVwBxAGYA8CuPK/9uyW7/id6J/2zCbP9AhC7//9y5/5+xsP9AhKP/BWuj/wdtpv8GbKX/MHye/4+m + pv+PomX/CG0I/x6CHv8AYADtADYAWgAAABAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAPQAA + AOUBAQH/BQUF/wcHB/8JCQn/AwMD/wEDCv8IGEX/Dy+C/xM6oP8UPKL/FD2j/xQ7of8TOqD/Ezie/w8v + lP8BEnD/AAlA3AAAAIcAAAA1AFQAJwBkAKMAZgD/Gn0a/0GdQf8AZgr/QIKe/wtxr/8Xfcb/GoDM/xqA + zP8agMz/GH7J/w1zs/8CaIn/AGEe+wA/ANAAEABlAAAAGQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEAAAAqAAAA4gMDA/8KCgr/DAwM/w4ODv8HBwf/BAwg/xQ7m/8WQqj/FkOp/xdFq/8XRav/F0Wr/xdF + q/8XRav/FkKo/xZBp/8MLY//ABNr+wACC6kAAABYAAAAFAAAAAAAYAARAGAAZgBeDb8AZnz/FXvC/yKI + 3P8iiN3/Iojd/yKI3f8iiN3/IYfb/yCG2f8Zf8v/AmOX+wAaJsAAAACEAAAAPAAAAAsAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAgAAACoBAQE/w0NDf8QEBD/EhIS/xQUFP8BAQH/EziL/xhIrv8aTLL/Gk2z/xpO + tP8bULb/G1C2/xtQtv8aTrT/Gk2z/xlLsf8YR63/Ax56/wANPNUAAAB5AAAAJAAAAAAAAAAAAAAADgBa + h8YZfsr/J43n/ymO6v8rkO7/LZLy/y2S8v8rkO7/KY7q/yeN5/8li+L/HILR/wJjl/sAEhu3AAAAcgAA + ACgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAADEAAAD/Dg4O/xMTE/8VFRX/GBgY/xQUFP8FDiL/Gk60/xtR + t/8cVbv/HVe9/x1Xvf8eWb//HlrA/x5Yvv8dV73/HVa8/xxUuv8bUbf/CzKQ/wAZZPMAAACOAAAAMwAA + AAMAAAABAEhtWg91uP8wlvn/Mpj9/zOZ//8zmf//M5n//zOZ//8zmf//M5n//zKY/f8wlvn/LpP0/x+F + 1/8AUnvuAAAAnQAAAFMAAAATAAAAAAAAAAAAAAAAAAAAAAAAAIAGBgb/FRUV/xgYGP8bGxv/Hx8f/xIS + Ev8LIEb/HVa8/x5awP8gXsT/IWHH/yFiyP8hYsj/IWLI/yFiyP8hYsj/IGDG/x9dw/8eWb//Fkqr/wAh + d/8AAACYAAAAQQAAAAkAAAAHAF6Ozi6U8v82nP//N53//zie//84nv//OJ7//zie//84nv//OJ7//zac + //81m///NJr//zOY/v8Teb7/AC9G0QAAAH0AAAArAAAAAwAAAAAAAAAAAAAAAAAAAKwNDQ3/Gxsb/x8f + H/8iIiL/JSUl/xMTE/8PLmH/IWHH/yFjyf8iZ83/I2rQ/yRt0/8kbdP/JG3T/yRt0/8kbNL/I2rQ/yJm + zP8hY8n/IF/F/wAmev8ADSu2AAAATQAAAA8AR2ouC3Gs/zie//86oP//O6H//zyi//89o///PaP//z2j + //89o///PKL//zuh//86oP//OJ7//zac//8xl/n/AFyK9wAAAJoAAABJAAAADQAAAAAAAAAAAAAAAAAA + AMgVFRX/ICAg/yQkJP8oKCj/Kioq/x8fH/8IGTP/I2nP/yRt0/8mcdf/J3Ta/yd23P8oeN7/KHje/yh4 + 3v8ndtz/JnPZ/yVw1v8kbNL/I2jO/wQzhv8ADyq7AAAAWQAAABUAWINwIYfS/z2j//8+pP//P6X//0Cm + //9Bp///Qaf//0Gn//9Bp///QKb//z+l//8+pP//PaP//zuh//84nv//FXu//wAiM8EAAABoAAAAHAAA + AAAAAAAAAAAAAAAAAMcZGRn/JSUl/ykpKf8tLS3/MDAw/ykpKf8FDhr/JnHX/yh33f8ped//Kn7k/yuA + 5v8sguj/LIPp/yuB5/8rgOb/Kn3j/yl53/8nddv/JXDW/wlAlP8AHk3SAAAAWwAAABYAXYudL5Xm/0Gn + //9CqP//RKr//0Wr//9GrP//Rqz//0as//9Fq///Rav//0Op//9CqP//Qaf//z6k//89o///KI7f/wBH + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////wAA////////AAD///////8AAP///////wAA////////AADAAAP///8AAIAAAH///wAAgAAAGAAH + AACAAAAAAAEAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAMAA + AAAAAAAA4AAAAAABAADgAAAAAAEAAPAAAAAAAwAA8AAAAAADAADAAAAAAAcAAIAAAAAADwAAgAAAAAAf + AAAAAACAAB8AAAAAAMAADwAAAAAAAAAPAAAAAAAAAAcAAAAAAAAABwAAAAAAAAAHAAAAAAAAAAMAAAAA + AAAAAwAAAAAAAAADAAAAAAAAAAMAAIAAAAAAAwAAgAAAgAADAACAAACAAAMAAMAAAIAAAwAA4AABwAAH + AADgAAHAAAcAAPAAA8AABwAA/AAH4AAPAAD+AB/wAB8AAP////gAPwAA/////AD/AAD///////8AAP// + /////wAA////////AAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAMAAAAFQAAABgAAAAYAAAAGAAA + ABgAAAAYAAAAFgAAABIAAAALAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAJQAAAEUAAABZAAAAXwAA + AF8AAABfAAAAXwAAAF8AAABcAAAAUwAAAEYAAAA2AAAAJgAAABYAAAAJAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9RGQGMbyMCy2sh + AtJrIQLTayEC02shAtNrIQLTayEC01QaAcg9EwG5EgYAoAAAAI8AAAB7AAAAXQAAADkAAAAdAAAAFgAA + ABwAAAAjAAAAKQAAAC4AAAAvAAAALwAAAC8AAAAuAAAAKAAAAB4AAAAPAAAABAAAAAAAAAAArTcG18FB + Ff/RSyb/21Ew/+hYP//zX0r/+WNQ//1lVP/9ZVT/zUgh/9JLJv/UTSn/oTYO82ggAtogCgGwAAAAiAAA + AGcAAABeAAAAagAAAHcAAACDAAAAjAAAAI8AAACPAAAAjwAAAIwAAACCAAAAbQAAAEQAAAAWAAAAAQAA + AAC7PQ7/0kwn/91SM//vXUb//GRT//1pV//9cVz//XRe/+9qTv/Ti1f/zVsw//1nVf/5Y1D/5lc8/7c+ + FPtCIwHXADcAzwRPBN0IXwjqFHQU9SKRIv8fjx//H48f/x2OHf8Wihb/C24L9wNVA+kAKQDHAAAAgQAA + ADMAAAAGAAAAAMNDF//bUTD/711G//1mVf/9clz//Xdg//19ZP/9g2j/yFos//rir//ThlP/821T//1r + WP/8ZFP/7FtC/5pYGf9As0D/T8FP/y+SLP8kjiT/UsJS/1LCUv9Kvkr/QLlA/zu3O/8try3/Iakh/wqF + Cv8AFACmAAAAQwAAAAoAAAAAuT0O4uhYP//8ZFP//XJc//15Yf/9hWr//Yxu/9djOv/rt4T//+Ow//DE + kf/gZkL//Xdg//1qV//5Y1D/p2Im/1bEVv9Zw1n/cKlf/4Czbf9Ns03/ZMtk/1zHXP9Tw1P/RbxF/zy3 + PP8try3/Gpka/wAlAK8AAAA9AAAABwAAAACsNgOD5Vc7//1rWP/9d2D//YZq//6Scv/rgFn/2IdU///Z + pv//2ab//9qn/9JaMf/9g2j//XVe//1mVf+wZy//Z81n/0SoRP+/2az////l/0eYQv9003T/as5q/2LK + Yv9WxFb/RbxF/zm2Of8akhr/ACEAlAAAACgAAAACAAAAAAAAAAC7Pg/R+G9X//19ZP/9i27/+ZJv/8li + MP//zpv//8+c///PnP//0J3/13ZH//2JbP/9e2P/82ZO/5F5MP921Hb/Ppo9////8v////L/z+LF/ziY + OP9713v/btBu/2LKYv9RwVH/Prk+/w9zD/IAAABPAAAAEQAAAAAAAAAAAAAAAKY0AxG+RRjT73ZW//mM + a//NWy7/6Zp6/7+Kg/+/jIT/7q2K//+/kf/XcUP//Y5w//h7X/+6TBr/espv/4HZgf9kq2P////8//// + ////////gLOA/2fAZ/961nr/ac1p/1vGW/8unS7/ADcAlQAAACIAAAAEAAAAAAAAAAAAAAACAAAAEC4O + AT6JKwK4tEUe/0whT/8BBGr/BA1z/wMLcf8RDGn/f0xu/9JgNP/SXjP/hWAa/23EYv961nr/jN+M/3Cm + af//9u3///Pn///y5f//79//WZdM/3HLcf9w0XD/ULhQ/wZaBsQAAAAoAAAABwAAAAAAAAAAAAAAAQAA + ABAAAABMAAAAtQAAAOcCAgL/AQIV/wwlfv8QL5X/EC+V/w8tk/8GFnv/LRNF9xEFAKYAQACZN5s3/3XQ + df+S4ZL/gKNg/9/RvP9wnq//RYuv/2GWrP+fsKT/SJA3/0OkQ/8IVAjAAAAAKQAAAAYAAAAAAAAAAAAA + AAAAAAAGAAAAVQICAu4ICAj/CwsL/wUHDv8MJGT/EziY/xQ8ov8UPKL/FDyi/xQ6oP8FGnr/AAcy0QAA + AHwAOwBTDm4OpDuWO/Iwe1n/DXOz/xuBz/8dg9L/HILP/xB2uf8CaHb/ACgMyQAAAHkAAAAtAAAABgAA + AAAAAAAAAAAAAAAAACACAgLpDQ0N/xMTE/8ODg7/Ditq/xhGrP8ZSa//Gk2z/xpNs/8aTbP/GUmv/xQ/ + pP8AFmf3AAAAlQAAAEAAAAANAEpvbhh+yf8skvD/LZPy/y2T8v8tk/L/K5Hv/x+F1/8CVIDuAAAAoAAA + AFsAAAAYAAAAAQAAAAAAAAAAAAAAchEREf8XFxf/Ghoa/wwMDP8bUbf/HFW7/x5Zv/8fXML/H17E/x5a + wP8dV73/HFW7/wUpg/8ACCCyAAAAUgAAAB8OcK/oM5n//zWb//81m///NZv//zWb//80mv//M5n//yWL + 5P8AO1ncAAAAhgAAADQAAAAGAAAAAAAAAAACAgK6GRkZ/x8fH/8jIyP/Dhks/yBgxv8iZcv/I2jO/yRq + 0P8katD/JGrQ/yJmzP8hY8n/EEKe/wATOsgAAABcAEltcCiN3/87of//PKH//zyh//88of//PKH//zyh + //86oP//N53//xN0ufsACg+lAAAAUQAAABAAAAAAAAAAAAoKCschISH/Jycn/ywsLP8XFxf/JGvR/yd0 + 2v8od93/KXrg/yl74f8ped//KHfd/yZx1/8WU7D/ABxM0wAAAF8AVH2cPqP//0Kn//9Eqf//RKr//0Sq + //9Eqv//Q6j//0Cm//89ov//LZLm/wAwScsAAABoAAAAHAAAAAAAAAAABgYGtikpKf8vLy//NjY2/yQk + JP8hYrX/LIPp/y+N8/8xk/n/MpX7/zCS+P8ui/H/Kn3j/xxjwP8AIE7SAAAAWRBvp81Eqv//R63//0qw + //9Lsf//S7H//0ux//9Jr///Rqz//0Sp//9Apf//BExy4wAAAHoAAAAlAAAAAAAAAAAAAACEKioq/zg4 + OP8+Pj7/Pz8//xQ1XP8vjfb/MJD5/zWb//86oP//Npz//zOZ//8ylvz/F2O6/wAlUs0AAABGF3ewy0yy + //9Ns///ULb//1G3//9Rt///ULb//060//9Ns///Sa///0Wr//8SZJbuAAAAiAAAACsAAAAAAAAAAAAA + ACEcHBz/Pz8//0VFRf9MTEz/LCws/wsiWf8WQZ7/HVbS/yNo3f8ugOr/NpT3/zGQ+f8SWKL/ABs1pAAA + AC4Ze7THULb//1W7//9WvP//V73//1e9//9WvP//Vbv//1K4//9OtP//S7H//xl+uv8AAACGAAAAKwAA + AAAAAAAAAAAAAAUFBcJAQED/S0tL/0lJSf9dXV3/ZmZm/01NTf8fICn/BxVb/w0mjf8RMp7/Ditp/wMM + F/kAAABhAAAAGQBilKVWvP//U7n5/z2i3/85n9n/TbPy/1W7//9WvP//U7n//1G3//9DqO3/EW6f+gAA + AHQAAAAiAAAAAAAAAAAAAAAAAAAAIR0dHfBRUVH/V1dX/2ZmZv+EhIT/m5ub/6Wlpf9xcXH/RkZG/y4u + Lv8qKir/AAcMxQAAADMAAAAHAGKTZByCuf8Qc6b/LYq8/z+Yyv8wirr/IYPB/x2DzP8ghtL/JYfL/yR/ + r/8AVH7oAAAAVwAAABMAAAAAAAAAAAAAAAAAAAAAAAAAYiEhIf9hYWH/c3Nz/4SEhP+Pj4//oqKi/6Wl + pf9+fn7/SUlJ/woKCu4AAABJAAAAEAAAAAEAYJARBGib8TeSxP9Hn9D/VqnY/3W54P+Xyuj/nczo/2Sl + x/9Ml7z/GHam/wA+XrcAAAAxAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQhsbG/BjY2P/jo6O/5OT + k/+Dg4P/bW1t/0dHR/8RERHeAAAAUgAAAA0AAAACAAAAAAAAAAAAZJWDLou9/2Gv2/96u+H/hMDk/5/O + 6v+ezOb/ZKzT/zmSwv8NbZ73ABUfTwAAABAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAA + AHQWFhbELS0txykpKcgLCwusAAAAcQAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAZJaiS5vG/5TI + 5/+j0Or/lMjn/3694v9XqNb/G3mr9QA0Tl4AAAASAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAZJWDJHyp01yhxP9PmsH/M4i18gplkq4AOlg4AAAACgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////////wAH//4AAP/+AAAABgAAAAIAAAACAAAAAgAAAAIAA + AADAAAABwAAAAYAAAAMAAAAHAAAABwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAOAAAADgAAAA8AA + AAPgAYAD8AfAB///4A////////////////8oAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAQAAAAkAAAATAAAAGAAAABgAAAAXAAAAEwAAAAsAAAADAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAsAAAAvAAAAUwAAAF8AAABfAAAAXgAAAFYAAABFAAAALQAAABwAAAAbAAAAIQAA + ACMAAAAiAAAAHAAAAA9mIAI3ii0Mr3wrEMyDLxvTgy8b02YiCM09EwG6AAAAmQAAAIIAAABoAAAAZwAA + AHMAAAB3AAAAdgAAAGcAAAA9tz0Pxd1SM//5Y1D//XBb//NsUv/SbkH/+GVR/8xKKfstMgfXElcS2yF5 + IeothC3rIX4h7BFrEecDMAPAAAAAZ7c9D6P5Y1D//Xpi//6Mbv/chVb/9c2b/+9wUv/9alf/koc8/1Ov + T/9nrlz/Ycph/1XDVf84tTj/FnoW6QAAAGahMgMj4V0/8f2Ia//hfVH/+seU///ToP/ld1D/+HRb/5Gc + UP+GwoD/7/Xg/1WvVf9z0nP/UsJS/xh1GNkAAAA9AAAADVYbAWKhTELvQiNa/0M2eP9gSHf/u1s4+5N6 + Nf+C2oL/pMaX///17P+6z6j/Y8Fj/0GjQfkAKQB3AAAAFwAAAEkEBATtAwYN/w8rcf8UOqD/EDGX/wIP + XO4AJQCvQJBAy0OIjv8Qdrn/IH27/xpxW/sAGwC0AAAAVwAAABMKCgrKGhoa/xIvaP8aTbP/HVe9/xtP + tf8NMpP/AAggrQU9XpQtk/L/M5n//zOZ//8rke//BCxEzAAAAHkAAAAlFRUV/ygoKP8YQoH/JnPZ/yZz + 2f8mc9n/G1y9/wAPLLMdc7DQP6X//0Cm//9Apv//PqT//x97vvcAAACRAAAANyAgIPE1NTX/JUVr/zCQ + 9v80mv//M5b6/yFz0v8AFjGtK4bG1kyy//9Ns///TbP//0mv//8xl+b/AAoQnQAAAD0UFBSiSkpK/0JC + Qv82RmX/G0WQ/yJixv8VR33/ABgxhjKQzc5MsvL/SrDs/1e9//9Qtv//QqXq/wAnO6YAAAAwAAAAES4u + LvBpaWn/jY2N/6SkpP9PT0//ER0m1wAAAC8LbJ2XKYe5/1Kk0v9hqNP/UZ/Q/xh1pP8AAABaAAAAGQAA + AAAAAAAhLCwsslxcXP9LS0vkISEhrgAAACcAAAAIAGCQIimDs/CLxOX/oc/q/1ekz/8NXomtAAAAIAAA + AAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5QhLoCqhEyRtYkAVoFfAAAADQAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAB/AAAAABf/AAAw/wAARv8AAFX/AABc/wAAYP8AAGT/AABo/wAALP8AAK//AABT/wAA + U/+AAFj//4FT////Qv8= + + + \ No newline at end of file diff --git a/SCrawler/Editors/UserCreatorForm.vb b/SCrawler/Editors/UserCreatorForm.vb new file mode 100644 index 0000000..980bf88 --- /dev/null +++ b/SCrawler/Editors/UserCreatorForm.vb @@ -0,0 +1,358 @@ +Imports System.ComponentModel +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Imports SCrawler.API.Base +Namespace Editors + Friend Class UserCreatorForm : Implements IOkCancelToolbar + Private ReadOnly MyDef As DefaultFormProps(Of FieldsChecker) + Friend Property User As UserInfo + Friend Property UserInstance As IUserData + Friend Property StartIndex As Integer = -1 + Friend ReadOnly Property UserTemporary As Boolean + Get + If CH_FAV.Checked Then + Return False + Else + Return CH_TEMP.Checked + End If + End Get + End Property + Friend ReadOnly Property UserFavorite As Boolean + Get + Return CH_FAV.Checked + End Get + End Property + Friend ReadOnly Property UserMediaOnly As Boolean + Get + If User.Site = Sites.Twitter Then + Return CH_PARSE_USER_MEDIA.Checked + Else + Return False + End If + End Get + End Property + Friend ReadOnly Property UserReady As Boolean + Get + Return CH_READY_FOR_DOWN.Checked + End Get + End Property + Friend ReadOnly Property UserDescr As String + Get + Return TXT_DESCR.Text + End Get + End Property + Friend ReadOnly Property UserFriendly As String + Get + Return TXT_USER_FRIENDLY.Text + End Get + End Property + Friend ReadOnly Property UserLabels As List(Of String) + Friend Sub New() + InitializeComponent() + UserLabels = New List(Of String) + MyDef = New DefaultFormProps(Of FieldsChecker) + End Sub + Friend Sub New(ByVal _User As UserInfo) + Me.New + User = _User + End Sub + Friend Sub New(ByVal _Instance As IUserData) + Me.New + If Not _Instance Is Nothing Then + UserInstance = _Instance + User = DirectCast(UserInstance, UserDataBase).User + End If + End Sub + Private Sub UserCreatorForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDef + .MyViewInitialize(Me, Settings.Design, True) + .AddOkCancelToolbar() + If User.Name.IsEmptyString Then + OPT_REDDIT.Checked = False + OPT_TWITTER.Checked = False + CH_PARSE_USER_MEDIA.Enabled = False + CH_READY_FOR_DOWN.Checked = True + CH_TEMP.Checked = Settings.DefaultTemporary.Value + Else + TP_ADD_BY_LIST.Enabled = False + TXT_USER.Text = User.Name + Select Case User.Site + Case Sites.Reddit : OPT_REDDIT.Checked = True : CH_PARSE_USER_MEDIA.Enabled = False + Case Sites.Twitter : OPT_TWITTER.Checked = True + End Select + OPT_REDDIT.Enabled = False + OPT_TWITTER.Enabled = False + If Not UserInstance Is Nothing Then + TXT_USER.Enabled = False + With UserInstance + TXT_USER_FRIENDLY.Text = .FriendlyName + CH_FAV.Checked = .Favorite + CH_TEMP.Checked = .Temporary + CH_PARSE_USER_MEDIA.Checked = .ParseUserMediaOnly + CH_READY_FOR_DOWN.Checked = .ReadyForDownload + TXT_DESCR.Text = .Description + UserLabels.ListAddList(.Labels) + If UserLabels.ListExists Then TXT_LABELS.Text = UserLabels.ListToString + End With + End If + End If + .MyFieldsChecker = New FieldsChecker + .MyFieldsChecker.AddControl(Of String)(TXT_USER, TXT_USER.CaptionText) + .MyFieldsChecker.EndLoaderOperations() + TextBoxExtended.SetFalseDetector(Me, True, AddressOf .Detector) + .EndLoaderOperations() + End With + Catch ex As Exception + MyDef.InvokeLoaderError(ex) + End Try + End Sub + Private Sub UserCreatorForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + If e.KeyCode = Keys.F4 Then ChangeLabels() : e.Handled = True + End Sub + Private Sub UserCreatorForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + If Not BeforeCloseChecker(MyDef.ChangesDetected) Then + e.Cancel = True + Else + MyDef.Dispose() + If Not DialogResult = DialogResult.OK And Not DialogResult = DialogResult.Cancel And StartIndex >= 0 Then DialogResult = DialogResult.OK + End If + End Sub + Private Sub UserCreatorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + UserLabels.Clear() + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + If Not CH_ADD_BY_LIST.Checked Then + If MyDef.MyFieldsChecker.AllParamsOK Then + If OPT_REDDIT.Checked Or OPT_TWITTER.Checked Then + Dim tmpUser As UserInfo = User.Clone + With tmpUser + .Name = TXT_USER.Text + .Site = IIf(OPT_REDDIT.Checked, Sites.Reddit, Sites.Twitter) + .UpdateUserFile() + End With + User = tmpUser + If Not UserInstance Is Nothing Then + With DirectCast(UserInstance, UserDataBase) + .User = User + .FriendlyName = TXT_USER_FRIENDLY.Text + .Favorite = CH_FAV.Checked + .Temporary = CH_TEMP.Checked + .ReadyForDownload = CH_READY_FOR_DOWN.Checked + .UserDescription = TXT_DESCR.Text + Dim l As New ListAddParams(LAP.NotContainsOnly + LAP.ClearBeforeAdd) + If .IsCollection Then + With DirectCast(UserInstance, API.UserDataBind) + If .Count > 0 Then .Collections.ForEach(Sub(c) c.Labels.ListAddList(UserLabels, l)) + End With + Else + .Labels.ListAddList(UserLabels, LAP.NotContainsOnly, LAP.ClearBeforeAdd) + End If + If OPT_TWITTER.Checked Then .ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked + .UpdateUserInformation() + End With + End If + GoTo CloseForm + Else + MsgBoxE("User site does not selected", MsgBoxStyle.Exclamation) + End If + End If + Else + If CreateUsersByList() Then GoTo CloseForm + End If + Exit Sub +CloseForm: + MyDef.CloseForm() + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDef.CloseForm(IIf(StartIndex >= 0, DialogResult.OK, DialogResult.Cancel)) + End Sub + Private ReadOnly TwitterRegEx As New RegexStructure("[htps:/]{7,8}.*?twitter.com/([^/]+)", 1) + Private ReadOnly RedditRegEx1 As New RegexStructure("[htps:/]{7,8}.*?reddit.com/user/([^/]+)", 1) + Private ReadOnly RedditRegEx2 As New RegexStructure(".?u/([^/]+)", 1) + Private _TextChangeInvoked As Boolean = False + Private Sub TXT_USER_ActionOnTextChange() Handles TXT_USER.ActionOnTextChange + Try + If Not _TextChangeInvoked Then + _TextChangeInvoked = True + If Not CH_ADD_BY_LIST.Checked Then + Select Case GetSiteByText(TXT_USER.Text) + Case Sites.Twitter : OPT_TWITTER.Checked = True + Case Sites.Reddit : OPT_REDDIT.Checked = True + Case Else : OPT_TWITTER.Checked = False : OPT_REDDIT.Checked = False + End Select + End If + MyDef.Detector() + _TextChangeInvoked = False + End If + Catch ex As Exception + End Try + End Sub + Private Function GetSiteByText(ByRef TXT As String) As Sites + If Not TXT.IsEmptyString AndAlso TXT.Length > 8 Then + Dim s$ = RegexReplace(TXT, TwitterRegEx) + If Not s.IsEmptyString Then + TXT = s + Return Sites.Twitter + Else + s = RegexReplace(TXT, RedditRegEx1) + If Not s.IsEmptyString Then + TXT = s + Return Sites.Reddit + Else + s = RegexReplace(TXT, RedditRegEx2) + If Not s.IsEmptyString Then + TXT = s + Return Sites.Reddit + End If + End If + End If + End If + Return Sites.Undefined + End Function + Private Sub OPT_REDDIT_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_REDDIT.CheckedChanged + MyDef.Detector() + End Sub + Private Sub OPT_TWITTER_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_TWITTER.CheckedChanged + MyDef.Detector() + CH_PARSE_USER_MEDIA.Enabled = OPT_TWITTER.Checked + End Sub + Private Sub CH_TEMP_CheckedChanged(sender As Object, e As EventArgs) Handles CH_TEMP.CheckedChanged + If CH_TEMP.Checked Then CH_FAV.Checked = False + MyDef.Detector() + End Sub + Private Sub CH_FAV_CheckedChanged(sender As Object, e As EventArgs) Handles CH_FAV.CheckedChanged + If CH_FAV.Checked Then CH_TEMP.Checked = False + MyDef.Detector() + End Sub + Private Sub CH_READY_FOR_DOWN_CheckedChanged(sender As Object, e As EventArgs) Handles CH_READY_FOR_DOWN.CheckedChanged + MyDef.Detector() + End Sub + Private Sub CH_PARSE_USER_MADIA_CheckedChanged(sender As Object, e As EventArgs) Handles CH_PARSE_USER_MEDIA.CheckedChanged + MyDef.Detector() + End Sub + Private Sub CH_ADD_BY_LIST_CheckedChanged(sender As Object, e As EventArgs) Handles CH_ADD_BY_LIST.CheckedChanged + If CH_ADD_BY_LIST.Checked Then + TXT_DESCR.GroupBoxText = "Users list" + Else + TXT_DESCR.GroupBoxText = "Description" + End If + TXT_USER.Enabled = Not CH_ADD_BY_LIST.Checked + TXT_USER_FRIENDLY.Enabled = Not CH_ADD_BY_LIST.Checked + End Sub + Private Sub CH_AUTO_DETECT_SITE_CheckedChanged(sender As Object, e As EventArgs) Handles CH_AUTO_DETECT_SITE.CheckedChanged + OPT_REDDIT.Enabled = Not CH_AUTO_DETECT_SITE.Checked + OPT_TWITTER.Enabled = Not CH_AUTO_DETECT_SITE.Checked + End Sub + Private Function CreateUsersByList() As Boolean + Try + If CH_ADD_BY_LIST.Checked Then + If Not TXT_DESCR.IsEmptyString Then + Dim u As List(Of String) = TXT_DESCR.Text.StringToList(Of String, List(Of String))(vbNewLine).ListForEach(Function(s, ii) s.Trim,, False) + If u.ListExists Then + Dim NonIdentified As New List(Of String) + Dim UsersForCreate As New List(Of UserInfo) + Dim BannedUsers() As String = Nothing + Dim uu$ + Dim tmpUser As UserInfo + Dim s As Sites + Dim Added% = 0 + Dim Skipped% = 0 + Dim uid% + + Select Case True + Case OPT_REDDIT.Checked : s = Sites.Reddit + Case OPT_TWITTER.Checked : s = Sites.Twitter + Case Else : s = Sites.Undefined + End Select + + For i% = 0 To u.Count - 1 + uu = u(i) + If CH_AUTO_DETECT_SITE.Checked Then s = GetSiteByText(uu) + + If Not s = Sites.Undefined Then + tmpUser = New UserInfo(uu, s) + uid = -1 + If Settings.UsersList.Count > 0 Then uid = Settings.UsersList.IndexOf(tmpUser) + If uid < 0 And Not UsersForCreate.Contains(tmpUser) Then + UsersForCreate.Add(tmpUser) + Else + Skipped += 1 + End If + Else + NonIdentified.Add(u(i)) + End If + Next + + If UsersForCreate.Count > 0 Then + BannedUsers = UserBanned(UsersForCreate.Select(Function(uuu) uuu.Name).ToArray) + If BannedUsers.ListExists Then UsersForCreate.RemoveAll(Function(uuu) BannedUsers.Contains(uuu.Name)) + If UsersForCreate.Count > 0 Then + For Each tmpUser In UsersForCreate + Settings.UpdateUsersList(tmpUser) + If StartIndex = -1 Then StartIndex = Settings.Users.Count + Settings.Users.Add(UserDataBase.GetInstance(tmpUser, False)) + With Settings.Users.Last + .FriendlyName = TXT_USER_FRIENDLY.Text + .Favorite = CH_FAV.Checked + .Temporary = CH_TEMP.Checked + .ReadyForDownload = CH_READY_FOR_DOWN.Checked + .Labels.ListAddList(UserLabels) + If s = Sites.Twitter Then .ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked + .UpdateUserInformation() + End With + Added += 1 + Next + End If + End If + + Dim m As New MMessage($"Added {Added} users (skipped (already exists and/or duplicated) {Skipped})") + If BannedUsers.ListExists Or NonIdentified.Count > 0 Then + Dim t$ = String.Empty + If BannedUsers.ListExists Then t.StringAppendLine($"Banned users:{vbNewLine}{BannedUsers.ListToString(, vbNewLine)}") + If NonIdentified.Count > 0 Then t.StringAppendLine($"Non-Identified users:{vbNewLine}{NonIdentified.ListToString(, vbNewLine)}", vbNewLine.StringDup(2)) + m.Style = MsgBoxStyle.Exclamation + m.Text.StringAppendLine("Some of users does not recognized and/or banned") + m.Text.StringAppendLine(t, vbNewLine.StringDup(2)) + TXT_DESCR.Text = t + Else + TXT_DESCR.Clear() + End If + + MsgBoxE(m) + Return Added > 0 And Not BannedUsers.ListExists And NonIdentified.Count = 0 + Else + MsgBoxE("No one user can not recognized", MsgBoxStyle.Exclamation) + End If + Else + MsgBoxE("[Users list] is empty", MsgBoxStyle.Critical) + End If + End If + Return False + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on adding users by list", False) + End Try + End Function + Private Sub TXT_LABELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_LABELS.ActionOnButtonClick + Select Case Sender.DefaultButton + Case ActionButton.DefaultButtons.Open : ChangeLabels() + Case ActionButton.DefaultButtons.Clear : UserLabels.Clear() + End Select + End Sub + Private Sub ChangeLabels() + Using fl As New LabelsForm(UserLabels) + fl.ShowDialog() + If fl.DialogResult = DialogResult.OK Then + UserLabels.ListAddList(fl.LabelsList, LAP.NotContainsOnly, LAP.ClearBeforeAdd) + If UserLabels.ListExists Then + TXT_LABELS.Text = UserLabels.ListToString + Else + TXT_LABELS.Clear() + End If + End If + End Using + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/LabelsKeeper.vb b/SCrawler/LabelsKeeper.vb new file mode 100644 index 0000000..136200f --- /dev/null +++ b/SCrawler/LabelsKeeper.vb @@ -0,0 +1,103 @@ +Imports PersonalUtilities.Tools +Friend Class LabelsKeeper : Implements ICollection(Of String), IMyEnumerator(Of String), IDisposable + Friend Event NewLabelAdded() + Friend Const NoLabeledName As String = "No Label" + Friend Const NoParsedUser As String = "No Parsed" + Friend ReadOnly NoLabel As New ListViewGroup(NoLabeledName, NoLabeledName) + Private ReadOnly LabelsList As List(Of String) + Private ReadOnly LabelsFile As SFile = "Settings\Labels.txt" + Friend ReadOnly NewLabels As List(Of String) + Friend ReadOnly Property NewLabelsExists As Boolean + Get + Return NewLabels.Count > 0 + End Get + End Property + Friend ReadOnly Property CurrentSelection As List(Of String) + Friend Sub New() + LabelsList = New List(Of String) + NewLabels = New List(Of String) + CurrentSelection = New List(Of String) + If LabelsFile.Exists Then LabelsList.ListAddList(IO.File.ReadAllLines(LabelsFile), LAP.NotContainsOnly) + End Sub + Friend ReadOnly Property ToList As List(Of String) + Get + Return LabelsList + End Get + End Property + Friend ReadOnly Property Count As Integer Implements ICollection(Of String).Count, IMyEnumerator(Of String).MyEnumeratorCount + Get + Return LabelsList.Count + End Get + End Property + Default Friend ReadOnly Property Item(ByVal Index As Integer) As String Implements IMyEnumerator(Of String).MyEnumeratorObject + Get + Return LabelsList(Index) + End Get + End Property + Friend Sub Clear() Implements ICollection(Of String).Clear + LabelsList.Clear() + NewLabels.Clear() + End Sub + Friend Sub Update() + If LabelsList.Count > 0 Then + LabelsList.Sort() + TextSaver.SaveTextToFile(LabelsList.ListToString(, vbNewLine), LabelsFile, True, False, EDP.SendInLog) + Else + If LabelsFile.Exists Then LabelsFile.Delete(,,, EDP.SendInLog) + End If + End Sub + Friend Overloads Sub Add(ByVal _Item As String) Implements ICollection(Of String).Add + Add(_Item, True) + End Sub + Friend Overloads Sub Add(ByVal _Item As String, ByVal UpdateMainFrame As Boolean) + If Not _Item.IsEmptyString And Not LabelsList.Contains(_Item) Then + LabelsList.Add(_Item) + If Not NewLabels.Contains(_Item) Then NewLabels.Add(_Item) + If UpdateMainFrame Then RaiseEvent NewLabelAdded() + End If + End Sub + Friend Sub AddRange(ByVal _Items As IEnumerable(Of String)) + If _Items.ListExists Then + For Each i$ In _Items : Add(i, False) : Next + RaiseEvent NewLabelAdded() + End If + End Sub + Friend Function Contains(ByVal _Item As String) As Boolean Implements ICollection(Of String).Contains + Return LabelsList.Contains(_Item) + End Function + Friend Function Remove(ByVal _Item As String) As Boolean Implements ICollection(Of String).Remove + Return LabelsList.Remove(_Item) + End Function + Private ReadOnly Property IsReadOnly As Boolean = False Implements ICollection(Of String).IsReadOnly + Private Sub CopyTo(ByVal _Array() As String, ByVal ArrayIndex As Integer) Implements ICollection(Of String).CopyTo + Throw New NotImplementedException() + End Sub +#Region "IEnumerable Support" + Private Function GetEnumerator() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator + Return New MyEnumerator(Of String)(Me) + End Function + Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator + Return GetEnumerator() + End Function +#End Region +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + Clear() + CurrentSelection.Clear() + End If + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region +End Class \ No newline at end of file diff --git a/SCrawler/MainFrame.Designer.vb b/SCrawler/MainFrame.Designer.vb new file mode 100644 index 0000000..8869790 --- /dev/null +++ b/SCrawler/MainFrame.Designer.vb @@ -0,0 +1,578 @@ + +Partial Class MainFrame + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim SEP_2 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim MENU_SETTINGS As System.Windows.Forms.ToolStripDropDownButton + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainFrame)) + Dim MENU_SETTINGS_SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim SEP_3 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_2 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_3 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_4 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_5 As System.Windows.Forms.ToolStripSeparator + Dim SEP_4 As System.Windows.Forms.ToolStripSeparator + Dim MENU_VIEW_SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim MENU_VIEW_SEP_2 As System.Windows.Forms.ToolStripSeparator + Me.BTT_SETTINGS_REDDIT = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SETTINGS_TWITTER = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SETTINGS = New System.Windows.Forms.ToolStripMenuItem() + Me.Toolbar_TOP = New System.Windows.Forms.ToolStrip() + Me.BTT_ADD_USER = New System.Windows.Forms.ToolStripButton() + Me.BTT_EDIT_USER = New System.Windows.Forms.ToolStripButton() + Me.BTT_DELETE_USER = New System.Windows.Forms.ToolStripButton() + Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton() + Me.BTT_SHOW_INFO = New System.Windows.Forms.ToolStripButton() + Me.BTT_CHANNELS = New System.Windows.Forms.ToolStripButton() + Me.BTT_DOWN_SELECTED = New System.Windows.Forms.ToolStripButton() + Me.BTT_DOWN_ALL = New System.Windows.Forms.ToolStripButton() + Me.BTT_DOWN_VIDEO = New System.Windows.Forms.ToolStripButton() + Me.BTT_DOWN_STOP = New System.Windows.Forms.ToolStripButton() + Me.MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton() + Me.BTT_VIEW_LARGE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_VIEW_SMALL = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_VIEW_LIST = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_ALL = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_REGULAR = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_TEMP = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_FAV = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_LABELS = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_NO_LABELS = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SELECT_LABELS = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_LOG = New System.Windows.Forms.ToolStripButton() + Me.BTT_VERSION_INFO = New System.Windows.Forms.ToolStripButton() + Me.Toolbar_BOTTOM = New System.Windows.Forms.StatusStrip() + Me.PR_MAIN = New System.Windows.Forms.ToolStripProgressBar() + Me.LBL_JOBS_COUNT = New System.Windows.Forms.ToolStripStatusLabel() + Me.LBL_STATUS = New System.Windows.Forms.ToolStripStatusLabel() + Me.LIST_PROFILES = New System.Windows.Forms.ListView() + Me.USER_CONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components) + Me.BTT_CONTEXT_DOWN = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_EDIT = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_DELETE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_FAV = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_TEMP = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_GROUPS = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_ADD_TO_COL = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_COL_MERGE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CHANGE_IMAGE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_OPEN_PATH = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_OPEN_SITE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_INFO = New System.Windows.Forms.ToolStripMenuItem() + SEP_1 = New System.Windows.Forms.ToolStripSeparator() + SEP_2 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator() + MENU_SETTINGS = New System.Windows.Forms.ToolStripDropDownButton() + MENU_SETTINGS_SEP_1 = New System.Windows.Forms.ToolStripSeparator() + SEP_3 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_2 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_3 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_4 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_5 = New System.Windows.Forms.ToolStripSeparator() + SEP_4 = New System.Windows.Forms.ToolStripSeparator() + MENU_VIEW_SEP_1 = New System.Windows.Forms.ToolStripSeparator() + MENU_VIEW_SEP_2 = New System.Windows.Forms.ToolStripSeparator() + Me.Toolbar_TOP.SuspendLayout() + Me.Toolbar_BOTTOM.SuspendLayout() + Me.USER_CONTEXT.SuspendLayout() + Me.SuspendLayout() + ' + 'SEP_1 + ' + SEP_1.Name = "SEP_1" + SEP_1.Size = New System.Drawing.Size(6, 25) + ' + 'SEP_2 + ' + SEP_2.Name = "SEP_2" + SEP_2.Size = New System.Drawing.Size(6, 25) + ' + 'CONTEXT_SEP_1 + ' + CONTEXT_SEP_1.Name = "CONTEXT_SEP_1" + CONTEXT_SEP_1.Size = New System.Drawing.Size(192, 6) + ' + 'MENU_SETTINGS + ' + MENU_SETTINGS.AutoToolTip = False + MENU_SETTINGS.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text + MENU_SETTINGS.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_SETTINGS_REDDIT, Me.BTT_SETTINGS_TWITTER, MENU_SETTINGS_SEP_1, Me.BTT_SETTINGS}) + MENU_SETTINGS.Image = CType(resources.GetObject("MENU_SETTINGS.Image"), System.Drawing.Image) + MENU_SETTINGS.ImageTransparentColor = System.Drawing.Color.Magenta + MENU_SETTINGS.Name = "MENU_SETTINGS" + MENU_SETTINGS.Size = New System.Drawing.Size(62, 22) + MENU_SETTINGS.Text = "Settings" + ' + 'BTT_SETTINGS_REDDIT + ' + Me.BTT_SETTINGS_REDDIT.Name = "BTT_SETTINGS_REDDIT" + Me.BTT_SETTINGS_REDDIT.Size = New System.Drawing.Size(116, 22) + Me.BTT_SETTINGS_REDDIT.Text = "Reddit" + ' + 'BTT_SETTINGS_TWITTER + ' + Me.BTT_SETTINGS_TWITTER.Name = "BTT_SETTINGS_TWITTER" + Me.BTT_SETTINGS_TWITTER.Size = New System.Drawing.Size(116, 22) + Me.BTT_SETTINGS_TWITTER.Text = "Twitter" + ' + 'MENU_SETTINGS_SEP_1 + ' + MENU_SETTINGS_SEP_1.Name = "MENU_SETTINGS_SEP_1" + MENU_SETTINGS_SEP_1.Size = New System.Drawing.Size(113, 6) + ' + 'BTT_SETTINGS + ' + Me.BTT_SETTINGS.Name = "BTT_SETTINGS" + Me.BTT_SETTINGS.Size = New System.Drawing.Size(116, 22) + Me.BTT_SETTINGS.Text = "Settings" + ' + 'SEP_3 + ' + SEP_3.Name = "SEP_3" + SEP_3.Size = New System.Drawing.Size(6, 25) + ' + 'CONTEXT_SEP_2 + ' + CONTEXT_SEP_2.Name = "CONTEXT_SEP_2" + CONTEXT_SEP_2.Size = New System.Drawing.Size(192, 6) + ' + 'CONTEXT_SEP_3 + ' + CONTEXT_SEP_3.Name = "CONTEXT_SEP_3" + CONTEXT_SEP_3.Size = New System.Drawing.Size(192, 6) + ' + 'CONTEXT_SEP_4 + ' + CONTEXT_SEP_4.Name = "CONTEXT_SEP_4" + CONTEXT_SEP_4.Size = New System.Drawing.Size(192, 6) + ' + 'CONTEXT_SEP_5 + ' + CONTEXT_SEP_5.Name = "CONTEXT_SEP_5" + CONTEXT_SEP_5.Size = New System.Drawing.Size(192, 6) + ' + 'SEP_4 + ' + SEP_4.Name = "SEP_4" + SEP_4.Size = New System.Drawing.Size(6, 25) + ' + 'MENU_VIEW_SEP_1 + ' + MENU_VIEW_SEP_1.Name = "MENU_VIEW_SEP_1" + MENU_VIEW_SEP_1.Size = New System.Drawing.Size(141, 6) + ' + 'MENU_VIEW_SEP_2 + ' + MENU_VIEW_SEP_2.Name = "MENU_VIEW_SEP_2" + MENU_VIEW_SEP_2.Size = New System.Drawing.Size(141, 6) + ' + 'Toolbar_TOP + ' + Me.Toolbar_TOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden + Me.Toolbar_TOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {MENU_SETTINGS, SEP_1, Me.BTT_ADD_USER, Me.BTT_EDIT_USER, Me.BTT_DELETE_USER, Me.BTT_REFRESH, Me.BTT_SHOW_INFO, Me.BTT_CHANNELS, SEP_2, Me.BTT_DOWN_SELECTED, Me.BTT_DOWN_ALL, Me.BTT_DOWN_VIDEO, Me.BTT_DOWN_STOP, SEP_3, Me.MENU_VIEW, SEP_4, Me.BTT_LOG, Me.BTT_VERSION_INFO}) + Me.Toolbar_TOP.Location = New System.Drawing.Point(0, 0) + Me.Toolbar_TOP.Name = "Toolbar_TOP" + Me.Toolbar_TOP.Size = New System.Drawing.Size(934, 25) + Me.Toolbar_TOP.TabIndex = 1 + ' + 'BTT_ADD_USER + ' + Me.BTT_ADD_USER.Image = Global.SCrawler.My.Resources.Resources.PlusPIC + Me.BTT_ADD_USER.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_ADD_USER.Name = "BTT_ADD_USER" + Me.BTT_ADD_USER.Size = New System.Drawing.Size(49, 22) + Me.BTT_ADD_USER.Text = "Add" + Me.BTT_ADD_USER.ToolTipText = "Add user (Insert)" + ' + 'BTT_EDIT_USER + ' + Me.BTT_EDIT_USER.Image = Global.SCrawler.My.Resources.Resources.PencilPic_01_16 + Me.BTT_EDIT_USER.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_EDIT_USER.Name = "BTT_EDIT_USER" + Me.BTT_EDIT_USER.Size = New System.Drawing.Size(47, 22) + Me.BTT_EDIT_USER.Text = "Edit" + Me.BTT_EDIT_USER.ToolTipText = "Edit user (F3)" + ' + 'BTT_DELETE_USER + ' + Me.BTT_DELETE_USER.Image = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_DELETE_USER.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DELETE_USER.Name = "BTT_DELETE_USER" + Me.BTT_DELETE_USER.Size = New System.Drawing.Size(60, 22) + Me.BTT_DELETE_USER.Text = "Delete" + Me.BTT_DELETE_USER.ToolTipText = "Delete user (Del)" + ' + 'BTT_REFRESH + ' + Me.BTT_REFRESH.AutoToolTip = False + Me.BTT_REFRESH.Image = Global.SCrawler.My.Resources.Resources.Refresh + Me.BTT_REFRESH.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_REFRESH.Name = "BTT_REFRESH" + Me.BTT_REFRESH.Size = New System.Drawing.Size(66, 22) + Me.BTT_REFRESH.Text = "Refresh" + ' + 'BTT_SHOW_INFO + ' + Me.BTT_SHOW_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32 + Me.BTT_SHOW_INFO.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_SHOW_INFO.Name = "BTT_SHOW_INFO" + Me.BTT_SHOW_INFO.Size = New System.Drawing.Size(48, 22) + Me.BTT_SHOW_INFO.Text = "Info" + Me.BTT_SHOW_INFO.ToolTipText = "Show download summary" + ' + 'BTT_CHANNELS + ' + Me.BTT_CHANNELS.Image = Global.SCrawler.My.Resources.Resources.RedditPic512 + Me.BTT_CHANNELS.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_CHANNELS.Name = "BTT_CHANNELS" + Me.BTT_CHANNELS.Size = New System.Drawing.Size(76, 22) + Me.BTT_CHANNELS.Text = "Channels" + ' + 'BTT_DOWN_SELECTED + ' + Me.BTT_DOWN_SELECTED.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_DOWN_SELECTED.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWN_SELECTED.Name = "BTT_DOWN_SELECTED" + Me.BTT_DOWN_SELECTED.Size = New System.Drawing.Size(150, 22) + Me.BTT_DOWN_SELECTED.Text = "Download selected (F5)" + Me.BTT_DOWN_SELECTED.ToolTipText = "Download selected user" + ' + 'BTT_DOWN_ALL + ' + Me.BTT_DOWN_ALL.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_DOWN_ALL.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWN_ALL.Name = "BTT_DOWN_ALL" + Me.BTT_DOWN_ALL.Size = New System.Drawing.Size(119, 22) + Me.BTT_DOWN_ALL.Text = "Download all (F6)" + Me.BTT_DOWN_ALL.ToolTipText = "Download all users" + ' + 'BTT_DOWN_VIDEO + ' + Me.BTT_DOWN_VIDEO.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text + Me.BTT_DOWN_VIDEO.Image = CType(resources.GetObject("BTT_DOWN_VIDEO.Image"), System.Drawing.Image) + Me.BTT_DOWN_VIDEO.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWN_VIDEO.Name = "BTT_DOWN_VIDEO" + Me.BTT_DOWN_VIDEO.Size = New System.Drawing.Size(120, 22) + Me.BTT_DOWN_VIDEO.Text = "Download video (F2)" + Me.BTT_DOWN_VIDEO.ToolTipText = "Download video by URL" + ' + 'BTT_DOWN_STOP + ' + Me.BTT_DOWN_STOP.AutoToolTip = False + Me.BTT_DOWN_STOP.Enabled = False + Me.BTT_DOWN_STOP.Image = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_DOWN_STOP.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWN_STOP.Name = "BTT_DOWN_STOP" + Me.BTT_DOWN_STOP.Size = New System.Drawing.Size(51, 22) + Me.BTT_DOWN_STOP.Text = "Stop" + ' + 'MENU_VIEW + ' + Me.MENU_VIEW.AutoToolTip = False + Me.MENU_VIEW.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text + Me.MENU_VIEW.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_VIEW_LARGE, Me.BTT_VIEW_SMALL, Me.BTT_VIEW_LIST, MENU_VIEW_SEP_1, Me.BTT_SHOW_ALL, Me.BTT_SHOW_REGULAR, Me.BTT_SHOW_TEMP, Me.BTT_SHOW_FAV, Me.BTT_SHOW_LABELS, Me.BTT_SHOW_NO_LABELS, MENU_VIEW_SEP_2, Me.BTT_SELECT_LABELS}) + Me.MENU_VIEW.Image = CType(resources.GetObject("MENU_VIEW.Image"), System.Drawing.Image) + Me.MENU_VIEW.ImageTransparentColor = System.Drawing.Color.Magenta + Me.MENU_VIEW.Name = "MENU_VIEW" + Me.MENU_VIEW.Size = New System.Drawing.Size(45, 22) + Me.MENU_VIEW.Text = "View" + ' + 'BTT_VIEW_LARGE + ' + Me.BTT_VIEW_LARGE.Name = "BTT_VIEW_LARGE" + Me.BTT_VIEW_LARGE.Size = New System.Drawing.Size(144, 22) + Me.BTT_VIEW_LARGE.Text = "Large images" + ' + 'BTT_VIEW_SMALL + ' + Me.BTT_VIEW_SMALL.Name = "BTT_VIEW_SMALL" + Me.BTT_VIEW_SMALL.Size = New System.Drawing.Size(144, 22) + Me.BTT_VIEW_SMALL.Text = "Small images" + ' + 'BTT_VIEW_LIST + ' + Me.BTT_VIEW_LIST.Name = "BTT_VIEW_LIST" + Me.BTT_VIEW_LIST.Size = New System.Drawing.Size(144, 22) + Me.BTT_VIEW_LIST.Text = "List" + ' + 'BTT_SHOW_ALL + ' + Me.BTT_SHOW_ALL.Name = "BTT_SHOW_ALL" + Me.BTT_SHOW_ALL.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_ALL.Text = "All" + ' + 'BTT_SHOW_REGULAR + ' + Me.BTT_SHOW_REGULAR.Name = "BTT_SHOW_REGULAR" + Me.BTT_SHOW_REGULAR.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_REGULAR.Text = "Regular" + ' + 'BTT_SHOW_TEMP + ' + Me.BTT_SHOW_TEMP.Name = "BTT_SHOW_TEMP" + Me.BTT_SHOW_TEMP.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_TEMP.Text = "Temporary" + ' + 'BTT_SHOW_FAV + ' + Me.BTT_SHOW_FAV.Name = "BTT_SHOW_FAV" + Me.BTT_SHOW_FAV.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_FAV.Text = "Favorites" + ' + 'BTT_SHOW_LABELS + ' + Me.BTT_SHOW_LABELS.Name = "BTT_SHOW_LABELS" + Me.BTT_SHOW_LABELS.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_LABELS.Text = "Labels" + ' + 'BTT_SHOW_NO_LABELS + ' + Me.BTT_SHOW_NO_LABELS.Name = "BTT_SHOW_NO_LABELS" + Me.BTT_SHOW_NO_LABELS.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_NO_LABELS.Text = "No labels" + ' + 'BTT_SELECT_LABELS + ' + Me.BTT_SELECT_LABELS.Name = "BTT_SELECT_LABELS" + Me.BTT_SELECT_LABELS.Size = New System.Drawing.Size(144, 22) + Me.BTT_SELECT_LABELS.Text = "Select labels" + ' + 'BTT_LOG + ' + Me.BTT_LOG.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text + Me.BTT_LOG.Image = CType(resources.GetObject("BTT_LOG.Image"), System.Drawing.Image) + Me.BTT_LOG.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_LOG.Name = "BTT_LOG" + Me.BTT_LOG.Size = New System.Drawing.Size(34, 19) + Me.BTT_LOG.Text = "LOG" + Me.BTT_LOG.ToolTipText = "Show error log" + ' + 'BTT_VERSION_INFO + ' + Me.BTT_VERSION_INFO.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right + Me.BTT_VERSION_INFO.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image + Me.BTT_VERSION_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32 + Me.BTT_VERSION_INFO.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_VERSION_INFO.Name = "BTT_VERSION_INFO" + Me.BTT_VERSION_INFO.Size = New System.Drawing.Size(23, 20) + Me.BTT_VERSION_INFO.Text = "Info" + Me.BTT_VERSION_INFO.ToolTipText = "Show program information and check for new version" + ' + 'Toolbar_BOTTOM + ' + Me.Toolbar_BOTTOM.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.PR_MAIN, Me.LBL_JOBS_COUNT, Me.LBL_STATUS}) + Me.Toolbar_BOTTOM.Location = New System.Drawing.Point(0, 439) + Me.Toolbar_BOTTOM.Name = "Toolbar_BOTTOM" + Me.Toolbar_BOTTOM.Size = New System.Drawing.Size(934, 22) + Me.Toolbar_BOTTOM.TabIndex = 2 + Me.Toolbar_BOTTOM.Text = "StatusStrip1" + ' + 'PR_MAIN + ' + Me.PR_MAIN.Name = "PR_MAIN" + Me.PR_MAIN.Size = New System.Drawing.Size(200, 16) + Me.PR_MAIN.Visible = False + ' + 'LBL_JOBS_COUNT + ' + Me.LBL_JOBS_COUNT.Name = "LBL_JOBS_COUNT" + Me.LBL_JOBS_COUNT.Size = New System.Drawing.Size(0, 17) + ' + 'LBL_STATUS + ' + Me.LBL_STATUS.Name = "LBL_STATUS" + Me.LBL_STATUS.Size = New System.Drawing.Size(0, 17) + ' + 'LIST_PROFILES + ' + Me.LIST_PROFILES.Activation = System.Windows.Forms.ItemActivation.OneClick + Me.LIST_PROFILES.ContextMenuStrip = Me.USER_CONTEXT + Me.LIST_PROFILES.Dock = System.Windows.Forms.DockStyle.Fill + Me.LIST_PROFILES.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None + Me.LIST_PROFILES.HideSelection = False + Me.LIST_PROFILES.Location = New System.Drawing.Point(0, 25) + Me.LIST_PROFILES.Name = "LIST_PROFILES" + Me.LIST_PROFILES.Size = New System.Drawing.Size(934, 414) + Me.LIST_PROFILES.TabIndex = 3 + Me.LIST_PROFILES.UseCompatibleStateImageBehavior = False + ' + 'USER_CONTEXT + ' + Me.USER_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.BTT_CONTEXT_EDIT, Me.BTT_CONTEXT_DELETE, CONTEXT_SEP_1, Me.BTT_CONTEXT_FAV, Me.BTT_CONTEXT_TEMP, Me.BTT_CONTEXT_GROUPS, Me.BTT_CONTEXT_ADD_TO_COL, Me.BTT_CONTEXT_COL_MERGE, CONTEXT_SEP_2, Me.BTT_CHANGE_IMAGE, CONTEXT_SEP_3, Me.BTT_CONTEXT_OPEN_PATH, CONTEXT_SEP_4, Me.BTT_CONTEXT_OPEN_SITE, CONTEXT_SEP_5, Me.BTT_CONTEXT_INFO}) + Me.USER_CONTEXT.Name = "USER_CONTEXT" + Me.USER_CONTEXT.Size = New System.Drawing.Size(196, 298) + ' + 'BTT_CONTEXT_DOWN + ' + Me.BTT_CONTEXT_DOWN.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_CONTEXT_DOWN.Name = "BTT_CONTEXT_DOWN" + Me.BTT_CONTEXT_DOWN.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_DOWN.Text = "Download data" + ' + 'BTT_CONTEXT_EDIT + ' + Me.BTT_CONTEXT_EDIT.Image = Global.SCrawler.My.Resources.Resources.PencilPic_01_16 + Me.BTT_CONTEXT_EDIT.Name = "BTT_CONTEXT_EDIT" + Me.BTT_CONTEXT_EDIT.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_EDIT.Text = "Edit user information" + ' + 'BTT_CONTEXT_DELETE + ' + Me.BTT_CONTEXT_DELETE.Image = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_CONTEXT_DELETE.Name = "BTT_CONTEXT_DELETE" + Me.BTT_CONTEXT_DELETE.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_DELETE.Text = "Delete user / collection" + ' + 'BTT_CONTEXT_FAV + ' + Me.BTT_CONTEXT_FAV.Image = Global.SCrawler.My.Resources.Resources.StarPic_24 + Me.BTT_CONTEXT_FAV.Name = "BTT_CONTEXT_FAV" + Me.BTT_CONTEXT_FAV.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_FAV.Text = "Change favorite" + ' + 'BTT_CONTEXT_TEMP + ' + Me.BTT_CONTEXT_TEMP.Image = CType(resources.GetObject("BTT_CONTEXT_TEMP.Image"), System.Drawing.Image) + Me.BTT_CONTEXT_TEMP.Name = "BTT_CONTEXT_TEMP" + Me.BTT_CONTEXT_TEMP.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_TEMP.Text = "Change temporary" + ' + 'BTT_CONTEXT_GROUPS + ' + Me.BTT_CONTEXT_GROUPS.Name = "BTT_CONTEXT_GROUPS" + Me.BTT_CONTEXT_GROUPS.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_GROUPS.Text = "Change labels" + ' + 'BTT_CONTEXT_ADD_TO_COL + ' + Me.BTT_CONTEXT_ADD_TO_COL.Image = Global.SCrawler.My.Resources.Resources.DBPic_32 + Me.BTT_CONTEXT_ADD_TO_COL.Name = "BTT_CONTEXT_ADD_TO_COL" + Me.BTT_CONTEXT_ADD_TO_COL.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_ADD_TO_COL.Text = "Add to collection" + ' + 'BTT_CONTEXT_COL_MERGE + ' + Me.BTT_CONTEXT_COL_MERGE.Name = "BTT_CONTEXT_COL_MERGE" + Me.BTT_CONTEXT_COL_MERGE.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_COL_MERGE.Text = "Merge collection files" + ' + 'BTT_CHANGE_IMAGE + ' + Me.BTT_CHANGE_IMAGE.Image = Global.SCrawler.My.Resources.Resources.PicturePic_32 + Me.BTT_CHANGE_IMAGE.Name = "BTT_CHANGE_IMAGE" + Me.BTT_CHANGE_IMAGE.Size = New System.Drawing.Size(195, 22) + Me.BTT_CHANGE_IMAGE.Text = "Change image" + ' + 'BTT_CONTEXT_OPEN_PATH + ' + Me.BTT_CONTEXT_OPEN_PATH.Image = Global.SCrawler.My.Resources.Resources.Folder_32 + Me.BTT_CONTEXT_OPEN_PATH.Name = "BTT_CONTEXT_OPEN_PATH" + Me.BTT_CONTEXT_OPEN_PATH.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_OPEN_PATH.Text = "Open contains folder" + ' + 'BTT_CONTEXT_OPEN_SITE + ' + Me.BTT_CONTEXT_OPEN_SITE.Image = Global.SCrawler.My.Resources.Resources.GlobeBlue_32 + Me.BTT_CONTEXT_OPEN_SITE.Name = "BTT_CONTEXT_OPEN_SITE" + Me.BTT_CONTEXT_OPEN_SITE.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_OPEN_SITE.Text = "Open site" + ' + 'BTT_CONTEXT_INFO + ' + Me.BTT_CONTEXT_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32 + Me.BTT_CONTEXT_INFO.Name = "BTT_CONTEXT_INFO" + Me.BTT_CONTEXT_INFO.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_INFO.Text = "Information" + ' + 'MainFrame + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(934, 461) + Me.Controls.Add(Me.LIST_PROFILES) + Me.Controls.Add(Me.Toolbar_BOTTOM) + Me.Controls.Add(Me.Toolbar_TOP) + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.KeyPreview = True + Me.MinimumSize = New System.Drawing.Size(950, 500) + Me.Name = "MainFrame" + Me.Text = "Social networks crawler" + Me.Toolbar_TOP.ResumeLayout(False) + Me.Toolbar_TOP.PerformLayout() + Me.Toolbar_BOTTOM.ResumeLayout(False) + Me.Toolbar_BOTTOM.PerformLayout() + Me.USER_CONTEXT.ResumeLayout(False) + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Private WithEvents BTT_SETTINGS_REDDIT As ToolStripMenuItem + Private WithEvents BTT_SETTINGS_TWITTER As ToolStripMenuItem + Private WithEvents BTT_SETTINGS As ToolStripMenuItem + Private WithEvents BTT_ADD_USER As ToolStripButton + Private WithEvents BTT_DELETE_USER As ToolStripButton + Private WithEvents BTT_DOWN_SELECTED As ToolStripButton + Private WithEvents BTT_DOWN_ALL As ToolStripButton + Private WithEvents Toolbar_TOP As ToolStrip + Private WithEvents Toolbar_BOTTOM As StatusStrip + Private WithEvents PR_MAIN As ToolStripProgressBar + Private WithEvents LBL_STATUS As ToolStripStatusLabel + Private WithEvents BTT_CONTEXT_DOWN As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_EDIT As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_DELETE As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_FAV As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_TEMP As ToolStripMenuItem + Private WithEvents USER_CONTEXT As ContextMenuStrip + Private WithEvents BTT_VIEW_LARGE As ToolStripMenuItem + Private WithEvents BTT_VIEW_SMALL As ToolStripMenuItem + Private WithEvents BTT_VIEW_LIST As ToolStripMenuItem + Private WithEvents BTT_CHANGE_IMAGE As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_OPEN_PATH As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_INFO As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_OPEN_SITE As ToolStripMenuItem + Private WithEvents BTT_DOWN_STOP As ToolStripButton + Private WithEvents BTT_CONTEXT_COL_MERGE As ToolStripMenuItem + Private WithEvents LBL_JOBS_COUNT As ToolStripStatusLabel + Private WithEvents BTT_DOWN_VIDEO As ToolStripButton + Private WithEvents BTT_SHOW_INFO As ToolStripButton + Private WithEvents BTT_LOG As ToolStripButton + Private WithEvents BTT_CHANNELS As ToolStripButton + Private WithEvents LIST_PROFILES As ListView + Private WithEvents MENU_VIEW As ToolStripDropDownButton + Private WithEvents BTT_CONTEXT_ADD_TO_COL As ToolStripMenuItem + Private WithEvents BTT_REFRESH As ToolStripButton + Private WithEvents BTT_SHOW_ALL As ToolStripMenuItem + Private WithEvents BTT_SHOW_REGULAR As ToolStripMenuItem + Private WithEvents BTT_SHOW_TEMP As ToolStripMenuItem + Private WithEvents BTT_SHOW_FAV As ToolStripMenuItem + Private WithEvents BTT_SHOW_LABELS As ToolStripMenuItem + Private WithEvents BTT_SELECT_LABELS As ToolStripMenuItem + Private WithEvents BTT_SHOW_NO_LABELS As ToolStripMenuItem + Private WithEvents BTT_EDIT_USER As ToolStripButton + Private WithEvents BTT_CONTEXT_GROUPS As ToolStripMenuItem + Private WithEvents BTT_VERSION_INFO As ToolStripButton +End Class diff --git a/SCrawler/MainFrame.resx b/SCrawler/MainFrame.resx new file mode 100644 index 0000000..aa33c66 --- /dev/null +++ b/SCrawler/MainFrame.resx @@ -0,0 +1,478 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + False + + + False + + + False + + + False + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + 132, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + 239, 17 + + + 387, 17 + + + + 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 + PwHTXv9NiH+iYhJWqDTaidq6+vHly5+ut120uOanq9ewkXwXLATzgC3g2yz7+c8BOx0L8tH6MvgZeAYs + At+48gfYvPlXp/n+iqDm2Lj4f73w4kt1S+yWJa3+1e9fQ5Bp8ZkfwPMCwN9yOBn2+KfAk+ChX8G+Dps/ + r1u/xd3D6+rf/v5+9YqVq6Sv/vF9Xh2XnFf8yCt5XGzeWrdeY+/glPLrtRte+M1bG1dBlPfP4uvT/xKb + N95xYLfifeVScsnnXMZvA+8pi/7fhb+CbP4D9GPXvMEwYYwAAAAASUVORK5CYII= + + + + + AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACOMzL/jjMy/44zMv+OMzL/jjMy/44zMv9Ts2//U7Nv/1Ozb/9Ts2//U7Nv/1Oz + b/891/H/Pdfx/z3X8f891/H/Pdfx/z3X8f8ukuD/LpLg/y6S4P8ukuD/LpLg/y6S4P8vOs7/LzrO/y86 + zv8vOs7/LzrO/y86zv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8vLx+OMzL/jjMy/44zMv+OMzL/jjMy/4w4NOJTs2//U7Nv/1Oz + b/9Ts2//U7Nv/1O0cuI91/H/Pdfx/z3X8f891/H/Pdfx/z3X8f8ukuD/LpLg/y6S4P8ukuD/LpLg/y6S + 4P8vOs7/LzrO/y86zv8vOs7/LzrO/y86zv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI0yMjeOMzL/jjMy/44zMv+OMzL/jjMy/4tD + N9NTs2//U7Nv/1Ozb/9Ts2//U7Nv/1K1fNM91/H/Pdfx/z3X8f891/H/Pdfx/zzW8OkukuD/LpLg/y6S + 4P8ukuD/LpLg/y6R4PcvOs7/LzrO/y86zv8vOs7/LzrO/y86zuYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwzM0+OMzL/jjMy/44z + Mv+OMzL/jjMy/4hRPcdTs2//U7Nv/1Ozb/9Ts2//U7Nv/1G4h8c91/H/Pdfx/z3X8f891/H/Pdfx/zzV + 8eIukuD/LpLg/y6S4P8ukuD/LpLg/y2R4OIvOs7/LzrO/y86zv8vOs7/LzrO/y46zd4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4z + MZ6OMzL/jjMy/44zMv+OMzL/jjMy/4NiRMBTs2//U7Nv/1Ozb/9Ts2//U7Nv/067mMA91/H/Pdfx/z3X + 8f891/H/Pdfx/zzR78sukuD/LpLg/y6S4P8ukuD/LpLg/y2Q39cvOs7/LzrO/y86zv8vOs7/LzrO/y86 + ztYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAI0zMu6OMzL/jjMy/44zMv+OMzL/jjMy/26RXMdTs2//U7Nv/1Ozb/9Ts2//U7Nv/0vB + rr491/H/Pdfx/z3X8f891/H/Pdfx/zjI7b8ukuD/LpLg/y6S4P8ukuD/LpLg/y2J3cUvOs7/LzrO/y86 + zv8vOs7/LzrO/y46zq4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAjzMzP44zMv+OMzL/jjMy/44zMv+OMzL/jjIx91SwbvZTs2//U7Nv/1Oz + b/9Ts2//U7Nv/0XM1M491/H/Pdfx/z3X8f891/H/Pdfx/za66cAukuD/LpLg/y6S4P8ukuD/LpLg/y55 + 2b4vOs7/LzrO/y86zv8vOs7/LzrO/y46zo4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjjIxro4zMv+OMzL/jjMy/44zMv+OMzL/iUw7y1Oz + b/9Ts2//U7Nv/1Ozb/9Ts2//U7Nv7z3X8f891/H/Pdfx/z3X8f891/H/Pdfx/zCk49cukuD/LpLg/y6S + 4P8ukuD/LpLg/y1p1ccvOs7/LzrO/y86zv8vOs7/LzrO/y46zWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPNC4vjjMy/44zMv+OMzL/jjMy/44z + Mv+OMzL/dIdXwlOzb/9Ts2//U7Nv/1Ozb/9Ts2//T7qSwj3X8f891/H/Pdfx/z3X8f891/H/PNXx4i6S + 4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y5N0OIvOs7/LzrO/y86zv8vOs7/LzrO/y07zDcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNMjLOjjMy/44z + Mv+OMzL/jjMy/44zMv+NNDLvWqpr6FOzb/9Ts2//U7Nv/1Ozb/9Ts2//RsnKxz3X8f891/H/Pdfx/z3X + 8f891/H/OcvtwC6S4P8ukuD/LpLg/y6S4P8ukuD/LZHg4i86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y4+ + zw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4z + MHeOMzL/jjMy/44zMv+OMzL/jjMy/44zMv95flG/U7Nv/1Ozb/9Ts2//U7Nv/1Ozb/9Ssm/3PdXt9j3X + 8f891/H/Pdfx/z3X8f891/H/M63myi6S4P8ukuD/LpLg/y6S4P8ukuD/Lobcwi86zv8vOs7/LzrO/y86 + zv8vOs7/LjnNzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAjDMzT44zMv+OMzL/jjMy/44zMv+OMzL/jjMy/441MulUsG72U7Nv/1Ozb/9Ts2//U7Nv/1Oz + b/9PuI3FPdfx/z3X8f891/H/Pdfx/z3X8f881/HvLpTh9i6S4P8ukuD/LpLg/y6S4P8ukuD/LXDXwi86 + zv8vOs7/LzrO/y86zv8vOs7/LjrOjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACvhoQ4jzg39o4zMv+OMzL/jjMy/44zMv+OMzL/jjMy/3SHV8JTs2//U7Nv/1Oz + b/9Ts2//U7Nv/1Ozb/9D0NzXPdfx/z3X8f891/H/Pdfx/z3X8f87zu7FLpLg/y6S4P8ukuD/LpLg/y6S + 4P8ukuD/Lk3Q4i86zv8vOs7/LzrO/y86zv8vOs7/LznMTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAALKPjmi5mpn4roaG/485OP+OMzL/jjMy/44zMv+OMzL/i0c5zlOz + b/9Ts2//U7Nv/1Ozb/9Ts2//U7Nv/067mMA91/H/Pdfx/z3X8f891/H/Pdfx/z3X8f82uOjCLpLg/y6S + 4P8ukuD/LpLg/y6S4P8ujt/ULzrO/y86zv8vOs7/LzrO/y86zv8vOs7/Lj7PDwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtJKSkrmamv+5mpr/uZqa/66Ghv+POTj/jjMy/44z + Mv+MODTiWqpr6FOzb/9Ts2//U7Nv/1Ozb/9Ts2//UrJv9z/U5+g91/H/Pdfx/z3X8f891/H/Pdfx/zzW + 8OkulOH2LpLg/y6S4P8ukuD/LpLg/y6S4P8ucdfFLzrO/y86zv8vOs7/LzrO/y86zv8uOs6+AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKPj1+4l5fguZqa/7mamv+5mpr/uZqa/7ma + mv+uhob/jzk4/44yMfdkoGTXU7Nv/1Ozb/9Ts2//U7Nv/1Ozb/9Ts2//Tr2dvz3X8f891/H/Pdfx/z3X + 8f891/H/Pdfx/za46MIukuD/LpLg/y6S4P8ukuD/LpLg/y6R4PcvQ8/2LzrO/y86zv8vOs7/LzrO/y86 + zv8uOs1nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKd+fhuzkJBxtZKS2bmamv+5mpr/uZqa/7ma + mv+5mpr/uZqa/7mamv+5mpr/roaG/3GTYMdTs2//U7Nv/1Ozb/9Ts2//U7Nv/1Ozb/9SsnHpP9Tn6D3X + 8f891/H/Pdfx/z3X8f891/H/PNXw1y6S4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y6C278vOs7/LzrO/y86 + zv8vOs7/LzrO/y85zvYuPs8PAAAAAAAAAACzjY1Ns42NTbOQkHG0kpKSt5aWzLmamv+5mpr/uZqa/7ma + mv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+7nZzzssOu2ZHGnf9WtHH/U7Nv/1Ozb/9Ts2//U7Nv/1Ky + b/dFzNTOPdfx/z3X8f891/H/Pdfx/z3X8f891/H/NLDmxy6S4P8ukuD/LpLg/y6S4P8ukuD/LpHg9y5K + 0OgvOs7/LzrO/y86zv8vOs7/LzrO/y46zq4AAAAAAAAAAAAAAAC5mpr/uZqa/7mamv+5mpr/uZqa/7ma + mv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/72hoOerya7mos2s/6LNrP+Rxp3/VrRx/1Oz + b/9Ts2//U7Nv/0nFusA91/H/Pdfx/z3X8f891/H/Pdfx/z3X8f880vDOLpLg/y6S4P8ukuD/LpLg/y6S + 4P8ukuD/LoDbyS86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y85zE8AAAAAAAAAAAAAAAC5mpr/uZqa/7ma + mv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/vaml2qbMrPOizaz/os2s/6LN + rP+izaz/kcad/1a0cf9Ts2//Tr2dvz3X8f891/H/Pdfx/z3X8f891/H/Pdfx/z3X8f8wpOPXLpLg/y6S + 4P8ukuD/LpLg/y6S4P8ukODpLkDP9i86zv8vOs7/LzrO/y86zv8vOs7/LjnNzgAAAAAAAAAAAAAAAAAA + AAC5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/72jouOyw67Zos2s/6LN + rP+izaz/os2s/6LNrP+izaz/os2s/5HGnf9VuIbLPdfx/z3X8f891/H/Pdfx/z3X8f891/H/Pdfx/zjG + 7L4ukuD/LpLg/y6S4P8ukuD/LpLg/y6S4P8td9i/LzrO/y86zv8vOs7/LzrO/y86zv8vOs7/LznMTwAA + AAAAAAAAAAAAAAAAAAC5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+8np7vtr6t1KLN + rP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6vUvdeK3/H3Qtfx/z3X8f891/H/Pdfx/z3X + 8f891/H/O9Dvxy6S4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y6Q4OsuQM/2LzrO/y86zv8vOs7/LzrO/y86 + zv8uOc3OAAAAAAAAAAAAAAAAAAAAAAAAAAC5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+8oJ/qvLGp07LD + rtmizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/rNjL0Zzk9f+c5PX/ieD0/0LX + 8f891/H/Pdfx/z3X8f871O/eLpTh9i6S4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y1p1ccvOs7/LzrO/y86 + zv8vOs7/LzrO/y86zv8vOcxPAAAAAAAAAAAAAAAAAAAAAAAAAAC+p6Tcvqek3L2vqNS6t6vSurms0a3H + reOizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6PNrfmp3dzVnOT1/5zk + 9f+c5PX/nOT1/4ng9P9C1/H/Pdfx/zzX8fAwnuLiLpLg/y6S4P8ukuD/LpLg/y6S4P8ukuD/Lo3e0C86 + zv8vOs7/LzrO/y86zv8vOs7/LzrO/y45zc4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACizaz/os2s/6LN + rP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/pc6v76Xg + 5d+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+J4PT/Qdbw9zKr5dQukuD/LpLg/y6S4P8ukuD/LpLg/y6S + 4P8tkeDjLkPO7y86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y46zy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6TP + rvOr2tDRnePy+Jzk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+d4/T5j8nt2TST4P8ukuD/LpLg/y6S + 4P8ukuD/LpLg/y6R4PcuVdHkLzrO/y86zv8vOs7/LzrO/y86zv8vOs7/LjnOngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LN + rP+jza35rNjI0p/j8fOc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5/k9e+hyu7jmbvq/4Wx + 5/80k+D/LpLg/y6S4P8ukuD/LpLg/y5o1cwvOs7/LzrO/y86zv8vOs7/LzrO/y86zv8uOc3uKTTJFwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LN + rP+izaz/ptCx6qvXxdOh4e3qnOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/ouP15JzD + 6/SZu+r/mbvq/5m76v+Fsef/NJPg/y6S4P8ukuD/LXvZxi86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y86 + zv8uOM1HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACizaz/os2s/6LNrP+izaz/os2s/6LN + rP+izaz/p9Cz56vZztKk4ejjnOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+l4PTZmr3q+Jm76v+Zu+r/mbvq/5m76v+Zu+r/hbHn/zST4P8uiN3MLzrO/y86zv8vOs7/LzrO/y86 + zv8vOs7/LzrO/y84zG8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACp0rjcqdK43KvW + wtSr2c7Sq9rQ0aff5Nyh4e3qnOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+c5PX/nOT1/6ba8teZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/42z5941Rc/2LzrO/y86 + zv8vOs7/LzrO/y86zv8vOs7/LznOlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+c5PX/nOT1/5zk9f+l4fTbncPr75m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/o73p2Zqe + 3/iFiNr/NT/O/y86zv8vOs7/LzrO/y86zv8uOs6+HD2+BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+c5PX/nOT1/5zk9f+c5PX/pOL13qHK7uOZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+ltufVmZve/5mb3v+Zm97/hYja/zU/zv8vOs7/LzrO/y46zd4uPs8PAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+c5PX/nOT1/5zk9f+c5PX/nOT1/6Hj9Oeiz+/fmbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/nL3q86Ku5N6Zm97/mZve/5mb3v+Zm97/mZve/4WI2v81P87/LjnN7iw5zCcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+c5PX/nOT1/5zk9f+c5PX/nOT1/6Hj9eun3vPSoszu4Jm76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+fvurnn6fh5pmb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Fh9n3LjjNRwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk + 9f+c5PX/nOT1/5zk9f+c5PX/nOT1/6Tk9OCn2PHSoMfs5pm76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/6O/6tqcoN/zmZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5aY + 3fJ/gtlJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACl4/XcpeP13KXj9dyl4/Xcp93z0afY8dKjze7cnMDr85m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+gv+rjoq7j3Jmb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb + 3v+Zm97/lJbc2X6A2SUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/nr7q6qWz5dWZm97/mZve/5mb3v+Zm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Sld2+aXDWEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5y96vOmuOfSmp7f+Jmb3v+Zm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/4mL2pYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+dvervprrn0pyg3/OZm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+WmN34io3aZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+avOr5pL7q1qOw5NmZm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5OW3eyEh9o4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+iv+rcprrn0qKu49yZm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm974i43al4SLzwgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACiv+rcor/q3KK/6tyiv+rcpL7q16a659KksuXXoKni45mb3v+Zm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5SW3cWEh9gvAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Vl93MjY/cTQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZm97/mZve/5mb3v+Zm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/kJLcy42P + 3E0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/lZfd7I2P + 26aEh9o4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACZm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mJre7JOV + 3bCHitlUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACZm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Ymt3ylJbdvo+R + 23mMj9oxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVl93MlZfdzJWX3cyVl93MlJbdxZGT25KPkdpxjY/cTYSL + zwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAAAAAAP//gAAAAAAA//+AAAAA + AAD//4AAAAAAAP//gAAAAAAA//+AAAAAAAD//wAAAAAAAP//AAAAAAAA//4AAAAAAAD//gAAAAAAAP/8 + AAAAAQAA//gAAAABAAD/8AAAAAEAAP/gAAAAAQAA/8AAAAADAAD/AAAAAAMAAPgAAAAAAwAAAAAAAAAH + AAAAAAAAAAcAAAAAAAAADwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAA/AAAAAAAAAD8AAAAA + AAAAfwAAAAAAAAB/AAAAAAAAAP8AAAAAAAAB/wAAAAAAAAP/AAAAAAAAA/8AAAAAAAAH/wAAAAAAAA// + AAAAAAAAH/8AAAAAAAA//wAAAAAAAH//AAAAAAAA//8AAAAAAAP//wAAAAAAB///AAAAAAAP//8AAAAA + AB///wAAAAAAf///AAAAAAH///8AAAAAB////wAAAAAf////AAAAAP////8AAAAH/////wAAAH////// + AAA= + + + \ No newline at end of file diff --git a/SCrawler/MainFrame.vb b/SCrawler/MainFrame.vb new file mode 100644 index 0000000..3f8af8e --- /dev/null +++ b/SCrawler/MainFrame.vb @@ -0,0 +1,777 @@ +Imports System.ComponentModel +Imports System.Globalization +Imports System.Threading +Imports PersonalUtilities.Forms +Imports SCrawler.API +Imports SCrawler.API.Base +Imports SCrawler.Editors +Public Class MainFrame + Private MyView As FormsView + Private ReadOnly _VideoDownloadingMode As Boolean = False + Private MyChannels As ChannelViewForm + Private _UFinit As Boolean = True + Public Sub New() + InitializeComponent() + Dim n As DateTimeFormatInfo = CultureInfo.GetCultureInfo("en-us").DateTimeFormat.Clone + n.FullDateTimePattern = "ddd MMM dd HH:mm:ss +ffff yyyy" + n.TimeSeparator = String.Empty + Twitter.DateProvider = New ADateTime(DirectCast(n.Clone, DateTimeFormatInfo)) With {.DateTimeStyle = DateTimeStyles.AssumeUniversal} + Settings = New SettingsCLS + Dim Args() As String = Environment.GetCommandLineArgs + If Args.ListExists(2) AndAlso Args(1) = "v" Then + Using f As New VideosDownloaderForm : f.ShowDialog() : End Using + _VideoDownloadingMode = True + Else + Downloader = New TDownloader + End If + End Sub + Private Sub MainFrame_Load(sender As Object, e As EventArgs) Handles Me.Load + If _VideoDownloadingMode Then GoTo FormClosingInvoker + InfoForm = New DownloadedInfoForm + AddHandler Downloader.OnJobsChange, AddressOf Downloader_UpdateJobsCount + AddHandler Downloader.OnDownloading, AddressOf Downloader_OnDownloading + AddHandler Downloader.OnDownloadCountChange, AddressOf InfoForm.Downloader_OnDownloadCountChange + Settings.LoadUsers() + MyView = New FormsView(Me) + MyView.ImportFromXML(Settings.Design) + MyView.SetMeSize() + MainProgress = New Toolbars.MyProgress(Toolbar_BOTTOM, PR_MAIN, LBL_STATUS) With {.DropCurrentProgressOnTotalChange = False} + Dim gk$ + With LIST_PROFILES.Groups + gk = GetLviGroupName(Sites.Undefined, False, False, True) + .Add(New ListViewGroup(gk, gk)) + gk = GetLviGroupName(Sites.Undefined, False, True, True) + .Add(New ListViewGroup(gk, gk)) + gk = GetLviGroupName(Sites.Undefined, True, False, True) + .Add(New ListViewGroup(gk, gk)) + For Each s In {Sites.Reddit, Sites.Twitter} + gk = GetLviGroupName(s, False, True, False) + .Add(New ListViewGroup(gk, gk)) + gk = GetLviGroupName(s, False, False, False) + .Add(New ListViewGroup(gk, gk)) + gk = GetLviGroupName(s, True, False, False) + .Add(New ListViewGroup(gk, gk)) + Next + If Settings.Labels.Count > 0 Then Settings.Labels.ToList.ForEach(Sub(l) .Add(New ListViewGroup(l, l))) + .Add(Settings.Labels.NoLabel) + End With + With Settings + LIST_PROFILES.View = .ViewMode + SetViewButtonsCheckers(.ViewMode.Value = View.LargeIcon, .ViewMode.Value = View.SmallIcon, .ViewMode.Value = View.List) + AddHandler .Labels.NewLabelAdded, AddressOf UpdateLabelsGroups + End With + RefillList() + UpdateLabelsGroups() + SetShowButtonsCheckers(Settings.ShowingMode.Value) + CheckForReparse() + CheckVersion(False) + _UFinit = False + GoTo EndFunction +FormClosingInvoker: + Close() +EndFunction: + End Sub + Private _CloseInvoked As Boolean = False + Private Async Sub MainFrame_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + If Not _VideoDownloadingMode Then + If _CloseInvoked Then GoTo CloseResume + Dim ChannelsWorking As Func(Of Boolean) = Function() If(MyChannels?.Working, False) + If (Not Downloader.Working And Not ChannelsWorking.Invoke) OrElse + MsgBoxE({"Program still downloading something..." & vbNewLine & + "Do you really want to stop downloading and exit of program?", + "Downloading in progress"}, + MsgBoxStyle.Exclamation,,, + {"Stop downloading and close", "Cancel"}) = 0 Then + If Downloader.Working Then _CloseInvoked = True : Downloader.Stop() + If ChannelsWorking.Invoke Then _CloseInvoked = True : MyChannels.Stop(False) + If _CloseInvoked Then + e.Cancel = True + Await Task.Run(Sub() + While Downloader.Working Or ChannelsWorking.Invoke : Thread.Sleep(500) : End While + End Sub) + End If + Downloader.Dispose() + InfoForm.Dispose() + If Not MyChannels Is Nothing Then MyChannels.Dispose() + If Not VideoDownloader Is Nothing Then VideoDownloader.Dispose() + MyView.Dispose(Settings.Design) + Settings.Dispose() + Else + e.Cancel = True + Exit Sub + End If + End If + If Not MyMainLOG.IsEmptyString Then SaveLogToFile() + If _CloseInvoked Then Close() +CloseResume: + End Sub + Private Sub MainFrame_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + Dim b As Boolean = True + Select Case e.KeyCode + Case Keys.Insert : BTT_ADD_USER.PerformClick() + Case Keys.Delete : DeleteSelectedUser() + Case Keys.F1 : BTT_VERSION_INFO.PerformClick() + Case Keys.F2 : DownloadVideoByURL() + Case Keys.F3 : EditSelectedUser() + Case Keys.F5 : BTT_DOWN_SELECTED.PerformClick() + Case Keys.F6 : If Settings.ShowingMode.Value = ShowingModes.All Then BTT_DOWN_ALL.PerformClick() + Case Else : b = False + End Select + If b Then e.Handled = True + End Sub + Private Sub BTT_VERSION_INFO_Click(sender As Object, e As EventArgs) Handles BTT_VERSION_INFO.Click + CheckVersion(True) + End Sub + Friend Sub RefillList() + Dim a As Action = Sub() + With LIST_PROFILES + .Items.Clear() + If Not .LargeImageList Is Nothing Then .LargeImageList.Images.Clear() + .LargeImageList = New ImageList + If Not .SmallImageList Is Nothing Then .SmallImageList.Images.Clear() + .SmallImageList = New ImageList + .LargeImageList.ColorDepth = ColorDepth.Depth32Bit + .SmallImageList.ColorDepth = ColorDepth.Depth32Bit + .LargeImageList.ImageSize = New Size(DivideWithZeroChecking(Settings.MaxLargeImageHeigh.Value, 100) * 75, Settings.MaxLargeImageHeigh.Value) + .SmallImageList.ImageSize = New Size(DivideWithZeroChecking(Settings.MaxSmallImageHeigh.Value, 100) * 75, Settings.MaxSmallImageHeigh.Value) + End With + End Sub + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke + If Settings.Users.Count > 0 Then + Settings.Users.Sort() + Dim t As New List(Of Task) + For Each User As IUserData In Settings.Users + If User.FitToAddParams Then + If Settings.ViewModeIsPicture Then + t.Add(Task.Run(Sub() UserListUpdate(User, True))) + Else + UserListUpdate(User, True) + End If + End If + Next + If t.Count > 0 Then Task.WhenAll(t.ToArray) : t.Clear() + End If + End Sub + Private Sub UserListUpdate(ByVal User As IUserData, ByVal Add As Boolean) + Try + Dim a As Action + If Add Then + a = Sub() + With LIST_PROFILES + Select Case Settings.ViewMode.Value + Case View.LargeIcon : .LargeImageList.Images.Add(User.LVIKey, User.GetPicture()) + Case View.SmallIcon : .SmallImageList.Images.Add(User.LVIKey, User.GetPicture()) + End Select + .Items.Add(User.GetLVI(LIST_PROFILES)) + End With + End Sub + Else + a = Sub() + With LIST_PROFILES + Dim i% = .Items.IndexOfKey(User.LVIKey) + Dim ImgIndx% + If i >= 0 Then + Select Case Settings.ViewMode.Value + Case View.LargeIcon + ImgIndx = .LargeImageList.Images.IndexOfKey(User.LVIKey) + If ImgIndx >= 0 Then .LargeImageList.Images(ImgIndx) = User.GetPicture() + Case View.SmallIcon + ImgIndx = .SmallImageList.Images.IndexOfKey(User.LVIKey) + If ImgIndx >= 0 Then .SmallImageList.Images(ImgIndx) = User.GetPicture() + End Select + .Items(i).Text = User.ToString + .Items(i).Group = User.GetLVIGroup(LIST_PROFILES) + End If + End With + End Sub + End If + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke + Catch ex As Exception + End Try + End Sub + Private Sub UpdateLabelsGroups() + If Settings.Labels.NewLabelsExists Then + If Settings.Labels.NewLabels.Count > 0 Then + Dim ll As ListViewGroup = Nothing + Dim a As Action = Sub() LIST_PROFILES.Groups.Add(ll) + For Each l$ In Settings.Labels.NewLabels + ll = New ListViewGroup(l, l) + If Not LIST_PROFILES.Groups.Contains(ll) Then + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke + End If + Next + End If + Settings.Labels.NewLabels.Clear() + End If + End Sub + Private Sub OnUsersAddedHandler(ByVal StartIndex As Integer) + If StartIndex <= Settings.Users.Count - 1 Then + For i% = StartIndex To Settings.Users.Count - 1 : UserListUpdate(Settings.Users(i), True) : Next + End If + End Sub +#Region "Toolbar buttons" +#Region "Settings" + Private Sub BTT_SETTINGS_REDDIT_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS_REDDIT.Click + Using f As New RedditEditorForm : f.ShowDialog() : End Using + End Sub + Private Sub BTT_SETTINGS_TWITTER_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS_TWITTER.Click + Using f As New TwitterEditorForm : f.ShowDialog() : End Using + End Sub + Private Sub BTT_SETTINGS_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS.Click + Dim mhl% = Settings.MaxLargeImageHeigh.Value + Dim mhs% = Settings.MaxSmallImageHeigh.Value + Using f As New GlobalSettingsForm + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + If Not Settings.MaxLargeImageHeigh = mhl Or Not Settings.MaxSmallImageHeigh = mhs Then RefillList() + End If + End Using + End Sub +#End Region +#Region "User" + Private Sub BTT_ADD_USER_Click(sender As Object, e As EventArgs) Handles BTT_ADD_USER.Click + Using f As New UserCreatorForm + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + Dim i% + If f.StartIndex >= 0 Then + OnUsersAddedHandler(f.StartIndex) + Else + i = Settings.Users.FindIndex(Function(u) u.Site = f.User.Site And u.Name = f.User.Name) + If i < 0 Then + If Not UserBanned(f.User.Name) Then + Settings.UpdateUsersList(f.User) + Settings.Users.Add(UserDataBase.GetInstance(f.User)) + With Settings.Users(Settings.Users.Count - 1) + .Favorite = f.UserFavorite + .Temporary = f.UserTemporary + .ParseUserMediaOnly = f.UserMediaOnly + .ReadyForDownload = f.UserReady + .FriendlyName = f.UserFriendly + .Description = f.UserDescr + .Labels.ListAddList(f.UserLabels, LAP.ClearBeforeAdd, LAP.NotContainsOnly) + .UpdateUserInformation() + End With + UserListUpdate(Settings.Users(Settings.Users.Count - 1), True) + i = LIST_PROFILES.Items.IndexOfKey(Settings.Users(Settings.Users.Count - 1).LVIKey) + If i >= 0 Then + LIST_PROFILES.SelectedIndices.Clear() + With LIST_PROFILES.Items(i) + .Selected = True + .Focused = True + End With + LIST_PROFILES.EnsureVisible(i) + End If + Else + MsgBoxE($"User [{f.User.Name}] was not added") + End If + Else + i = LIST_PROFILES.Items.IndexOfKey(Settings.Users(i).LVIKey) + If i >= 0 Then + LIST_PROFILES.SelectedIndices.Clear() + With LIST_PROFILES.Items(i) + .Selected = True + .Focused = True + End With + LIST_PROFILES.EnsureVisible(i) + End If + MsgBoxE($"User [{f.User.Name}] already exists", MsgBoxStyle.Exclamation) + End If + End If + End If + End Using + End Sub + Private Sub BTT_EDIT_USER_Click(sender As Object, e As EventArgs) Handles BTT_EDIT_USER.Click + EditSelectedUser() + End Sub + Private Sub BTT_DELETE_USER_Click(sender As Object, e As EventArgs) Handles BTT_DELETE_USER.Click + DeleteSelectedUser() + End Sub + Private Sub BTT_REFRESH_Click(sender As Object, e As EventArgs) Handles BTT_REFRESH.Click + RefillList() + End Sub + Private Sub BTT_SHOW_INFO_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_INFO.Click + ShowInfoForm(True) + End Sub + Private Overloads Sub ShowInfoForm() + ShowInfoForm(False) + End Sub + Private Overloads Sub ShowInfoForm(ByVal BringToFrontIfOpen As Boolean) + If InfoForm.Visible Then + If BringToFrontIfOpen Then InfoForm.BringToFront() + Else + InfoForm.Show() + End If + End Sub + Private Sub BTT_CHANNELS_Click(sender As Object, e As EventArgs) Handles BTT_CHANNELS.Click + If MyChannels Is Nothing Then + MyChannels = New ChannelViewForm + AddHandler MyChannels.OnUsersAdded, AddressOf OnUsersAddedHandler + End If + If MyChannels.Visible Then MyChannels.BringToFront() Else MyChannels.Show() + End Sub +#End Region +#Region "Download" + Private Sub BTT_DOWN_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_SELECTED.Click + DownloadSelectedUser() + End Sub + Private Sub BTT_DOWN_ALL_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_ALL.Click + Downloader.AddRange(Settings.Users.Where(Function(u) u.ReadyForDownload)) + End Sub + Private Sub BTT_DOWN_VIDEO_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_VIDEO.Click + DownloadVideoByURL() + End Sub + Private Sub BTT_DOWN_STOP_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_STOP.Click + Downloader.Stop() + End Sub +#End Region +#Region "View" + Private Sub BTT_VIEW_LARGE_Click(sender As Object, e As EventArgs) Handles BTT_VIEW_LARGE.Click + LIST_PROFILES.View = View.LargeIcon + Dim b As Boolean = Not (Settings.ViewMode.Value = View.LargeIcon) + Settings.ViewMode.Value = View.LargeIcon + SetViewButtonsCheckers(True, False, False) + If b Then RefillList() + End Sub + Private Sub BTT_VIEW_SMALL_Click(sender As Object, e As EventArgs) Handles BTT_VIEW_SMALL.Click + LIST_PROFILES.View = View.SmallIcon + Dim b As Boolean = Not (Settings.ViewMode.Value = View.SmallIcon) + Settings.ViewMode.Value = View.SmallIcon + SetViewButtonsCheckers(False, True, False) + If b Then RefillList() + End Sub + Private Sub BTT_VIEW_LIST_Click(sender As Object, e As EventArgs) Handles BTT_VIEW_LIST.Click + LIST_PROFILES.View = View.List + Dim b As Boolean = Not (Settings.ViewMode.Value = View.List) + Settings.ViewMode.Value = View.List + SetViewButtonsCheckers(False, False, True) + If b Then + With LIST_PROFILES + .LargeImageList.Images.Clear() + .SmallImageList.Images.Clear() + End With + End If + End Sub + Private Sub SetViewButtonsCheckers(ByVal Large As Boolean, ByVal Small As Boolean, ByVal List As Boolean) + BTT_VIEW_LARGE.Checked = Large + BTT_VIEW_SMALL.Checked = Small + BTT_VIEW_LIST.Checked = List + End Sub +#End Region +#Region "Labels" + Private Sub BTT_SHOW_ALL_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_ALL.Click + SetShowButtonsCheckers(ShowingModes.All) + End Sub + Private Sub BTT_SHOW_REGULAR_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_REGULAR.Click + SetShowButtonsCheckers(ShowingModes.Regular) + End Sub + Private Sub BTT_SHOW_TEMP_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_TEMP.Click + SetShowButtonsCheckers(ShowingModes.Temporary) + End Sub + Private Sub BTT_SHOW_FAV_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_FAV.Click + SetShowButtonsCheckers(ShowingModes.Favorite) + End Sub + Private Sub BTT_SHOW_LABELS_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_LABELS.Click + SetShowButtonsCheckers(ShowingModes.Labels) + End Sub + Private Sub BTT_SHOW_NO_LABELS_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_NO_LABELS.Click + SetShowButtonsCheckers(ShowingModes.NoLabels) + End Sub + Private Sub SetShowButtonsCheckers(ByVal m As ShowingModes) + BTT_SHOW_ALL.Checked = m = ShowingModes.All + BTT_SHOW_REGULAR.Checked = m = ShowingModes.Regular + BTT_SHOW_TEMP.Checked = m = ShowingModes.Temporary + BTT_SHOW_FAV.Checked = m = ShowingModes.Favorite + BTT_SHOW_LABELS.Checked = m = ShowingModes.Labels + BTT_SHOW_NO_LABELS.Checked = m = ShowingModes.NoLabels + BTT_SELECT_LABELS.Enabled = BTT_SHOW_LABELS.Checked + If Not Settings.ShowingMode.Value = m Then + If Not m = ShowingModes.Labels Or Settings.Labels.CurrentSelection.Count > 0 Then + Settings.ShowingMode.Value = m + RefillList() + ElseIf m = ShowingModes.Labels And Settings.Labels.CurrentSelection.Count = 0 Then + OpenLabelsForm() + If Settings.Labels.CurrentSelection.Count > 0 Then + Settings.ShowingMode.Value = m + RefillList() + Else + SetShowButtonsCheckers(Settings.ShowingMode.Value) + Exit Sub + End If + ElseIf m = ShowingModes.NoLabels Then + Settings.ShowingMode.Value = m + RefillList() + End If + End If + Settings.ShowingMode.Value = m + If Not m = ShowingModes.All Then BTT_DOWN_ALL.Enabled = False + End Sub + Private Sub BTT_SELECT_LABELS_Click(sender As Object, e As EventArgs) Handles BTT_SELECT_LABELS.Click + OpenLabelsForm() + End Sub + Private Sub OpenLabelsForm() + Using f As New LabelsForm(Settings.Labels.CurrentSelection) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + If f.LabelsList.Count > 0 Then + Settings.Labels.CurrentSelection.ListAddList(f.LabelsList, LAP.ClearBeforeAdd, LAP.NotContainsOnly) + Settings.LatestSelectedLabels.Value = Settings.Labels.CurrentSelection.ListToString(, "|") + Else + Settings.Labels.CurrentSelection.Clear() + Settings.LatestSelectedLabels.Value = String.Empty + End If + End If + End Using + End Sub +#End Region + Private Sub BTT_LOG_Click(sender As Object, e As EventArgs) Handles BTT_LOG.Click + MyMainLOG_ShowForm(Settings.Design) + End Sub +#Region "List functions" + Private _LatestSelected As Integer = -1 + Private Sub LIST_PROFILES_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_PROFILES.SelectedIndexChanged + Dim a As Action = Sub() + If LIST_PROFILES.SelectedIndices.Count > 0 Then + _LatestSelected = LIST_PROFILES.SelectedIndices(0) + Else + _LatestSelected = -1 + End If + End Sub + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke + End Sub + Private Sub LIST_PROFILES_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles LIST_PROFILES.MouseDoubleClick + OpenFolder() + End Sub +#Region "Context" + Private Sub BTT_CONTEXT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DOWN.Click + DownloadSelectedUser() + End Sub + Private Sub BTT_CONTEXT_EDIT_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_EDIT.Click + EditSelectedUser() + End Sub + Private Sub BTT_CONTEXT_DELETE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DELETE.Click + DeleteSelectedUser() + End Sub + Private Sub BTT_CONTEXT_FAV_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_FAV.Click + Dim users As List(Of IUserData) = GetSelectedUserArray() + If AskForMassReplace(users, "Favorite") Then + users.ForEach(Sub(u) + u.Favorite = Not u.Favorite + u.UpdateUserInformation() + UserListUpdate(u, False) + End Sub) + End If + End Sub + Private Sub BTT_CONTEXT_TEMP_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_TEMP.Click + Dim users As List(Of IUserData) = GetSelectedUserArray() + If AskForMassReplace(users, "Temporary") Then + users.ForEach(Sub(u) + u.Temporary = Not u.Temporary + u.UpdateUserInformation() + UserListUpdate(u, False) + End Sub) + End If + End Sub + Private Sub BTT_CONTEXT_GROUPS_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_GROUPS.Click + Try + Dim users As List(Of IUserData) = GetSelectedUserArray() + If users.ListExists Then + Dim l As List(Of String) = ListAddList(Nothing, users.SelectMany(Function(u) u.Labels), LAP.NotContainsOnly) + If l.ListExists Then + Using f As New LabelsForm(l) With {.MultiUser = True} + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + Dim _lp As LAP = LAP.NotContainsOnly + If f.MultiUserClearExists Then _lp += LAP.ClearBeforeAdd + Dim lp As New ListAddParams(_lp) + users.ForEach(Sub(ByVal u As IUserData) + If u.IsCollection Then + With DirectCast(u, UserDataBind) + If .Count > 0 Then .Collections.ForEach(Sub(uu) uu.Labels.ListAddList(f.LabelsList, lp)) + End With + Else + u.Labels.ListAddList(f.LabelsList, lp) + End If + u.UpdateUserInformation() + End Sub) + End If + End Using + End If + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.ShowAllMsg, ex, "[ChangeUserGroups]") + End Try + End Sub + Private Function AskForMassReplace(ByVal users As List(Of IUserData), ByVal param As String) As Boolean + Dim u$ = users.ListIfNothing.Take(20).Select(Function(uu) uu.Name).ListToString(, vbCr) + If Not u.IsEmptyString And users.ListExists(21) Then u &= vbCr & "..." + Return users.ListExists AndAlso (users.Count = 1 OrElse MsgBox($"Do you really want to change [{param}] for {users.Count} users?{vbCr}{vbCr}{u}", + MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton1, + "Users' change parameter") = MsgBoxResult.Yes) + End Function + Private Sub BTT_CHANGE_IMAGE_Click(sender As Object, e As EventArgs) Handles BTT_CHANGE_IMAGE.Click + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then + Dim f As SFile = SFile.SelectFiles(user.File, False, "Select new user picture", "Pictures|*.jpeg;*.jpg;*.png").FirstOrDefault + If Not f.IsEmptyString Then + user.SetPicture(f) + UserListUpdate(user, False) + End If + End If + End Sub + Private Sub BTT_CONTEXT_ADD_TO_COL_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_ADD_TO_COL.Click + If Settings.CollectionsPath.Value.IsEmptyString Then + MsgBoxE("Collection path does not set", MsgBoxStyle.Exclamation) + Else + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then + If user.IsCollection Then + MsgBoxE("Collection can not be added to collection!", MsgBoxStyle.Critical) + Else + Using f As New CollectionEditorForm(user.CollectionName) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + With Settings + Dim fCol As Predicate(Of IUserData) = Function(u) u.IsCollection And u.CollectionName = f.Collection + Dim i% = .Users.FindIndex(fCol) + Dim Added As Boolean = i < 0 + If i < 0 Then + .Users.Add(New UserDataBind(f.Collection)) + i = .Users.Count - 1 + End If + DirectCast(.Users(i), UserDataBind).Add(user) + RemoveUserFromList(user) + i = .Users.FindIndex(fCol) + If i >= 0 Then UserListUpdate(.Users(i), Added) Else RefillList() + End With + MsgBoxE($"[{user.Name}] was added to collection [{f.Collection}]") + End If + End Using + End If + End If + End If + End Sub + Private Sub BTT_CONTEXT_COL_MERGE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_COL_MERGE.Click + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then + If user.IsCollection Then + If DirectCast(user, UserDataBind).DataMerging Then + MsgBoxE("Collection files are already merged") + Else + If MsgBoxE({"Do you really want to merge collection files into one folder?" & vbNewLine & + "This action is not turnable!", "Merging files"}, + MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then + DirectCast(user, UserDataBind).DataMerging = True + End If + End If + Else + MsgBoxE("This is not collection!", MsgBoxStyle.Exclamation) + End If + End If + End Sub + Private Sub BTT_CONTEXT_OPEN_PATH_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_PATH.Click + OpenFolder() + End Sub + Private Sub BTT_CONTEXT_OPEN_SITE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_SITE.Click + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then user.OpenSite() + End Sub + Private Sub BTT_CONTEXT_INFO_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_INFO.Click + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then MsgBoxE(DirectCast(user, UserDataBase).GetUserInformation()) + End Sub + Private Sub USER_CONTEXT_VisibleChanged(sender As Object, e As EventArgs) Handles USER_CONTEXT.VisibleChanged + Try + If USER_CONTEXT.Visible Then + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing AndAlso user.IsCollection Then + With DirectCast(user, UserDataBind) + BTT_CONTEXT_DOWN.DropDownItems.AddRange(.ContextDown) + BTT_CONTEXT_EDIT.DropDownItems.AddRange(.ContextEdit) + BTT_CONTEXT_DELETE.DropDownItems.AddRange(.ContextDelete) + BTT_CONTEXT_OPEN_PATH.DropDownItems.AddRange(.ContextPath) + BTT_CONTEXT_OPEN_SITE.DropDownItems.AddRange(.ContextSite) + End With + End If + Else + BTT_CONTEXT_DOWN.DropDownItems.Clear() + BTT_CONTEXT_EDIT.DropDownItems.Clear() + BTT_CONTEXT_DELETE.DropDownItems.Clear() + BTT_CONTEXT_OPEN_PATH.DropDownItems.Clear() + BTT_CONTEXT_OPEN_SITE.DropDownItems.Clear() + End If + Catch ex As Exception + End Try + End Sub +#End Region +#End Region + Private Function GetSelectedUser() As IUserData + If _LatestSelected >= 0 And _LatestSelected <= LIST_PROFILES.Items.Count - 1 Then + Dim k$ = LIST_PROFILES.Items(_LatestSelected).Name + Dim i% = Settings.Users.FindIndex(Function(u) u.LVIKey = k) + If i >= 0 Then + Return Settings.Users(i) + Else + MsgBoxE("User not found", MsgBoxStyle.Critical) + End If + End If + Return Nothing + End Function + Private Function GetSelectedUserArray() As List(Of IUserData) + Try + With LIST_PROFILES + If .SelectedIndices.Count > 0 Then + Dim l As New List(Of IUserData) + Dim k$ + Dim indx% + For i% = 0 To .SelectedIndices.Count - 1 + k = .Items(.SelectedIndices(i)).Name + indx = Settings.Users.FindIndex(Function(u) u.LVIKey = k) + If i >= 0 Then l.Add(Settings.Users(indx)) + Next + Return l + End If + End With + Return New List(Of IUserData) + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.SendInLog + EDP.ReturnValue, ex, "[MainFrame.GetSelectedUserArray]", New List(Of IUserData)) + End Try + End Function + Private Overloads Sub RemoveUserFromList(ByVal _User As IUserData) + RemoveUserFromList(LIST_PROFILES.Items.IndexOfKey(_User.LVIKey), _User.LVIKey) + End Sub + Private Overloads Sub RemoveUserFromList(ByVal _Index As Integer, ByVal Key As String) + Dim a As Action = Sub() + With LIST_PROFILES + If _Index >= 0 Then + .Items.RemoveAt(_Index) + If Settings.ViewModeIsPicture Then + Dim ImgIndx% + Select Case Settings.ViewMode.Value + Case View.LargeIcon + ImgIndx = .LargeImageList.Images.IndexOfKey(Key) + If ImgIndx >= 0 Then .LargeImageList.Images.RemoveAt(_Index) + Case View.SmallIcon + ImgIndx = .SmallImageList.Images.IndexOfKey(Key) + If ImgIndx >= 0 Then .SmallImageList.Images.RemoveAt(_Index) + End Select + End If + End If + End With + End Sub + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke + End Sub + Private Sub EditSelectedUser() + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then + On Error Resume Next + If user.IsCollection Then + If USER_CONTEXT.Visible Then USER_CONTEXT.Hide() + Using f As New CollectionEditorForm(user.CollectionName) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + user.CollectionName = f.Collection + UserListUpdate(user, False) + End If + End Using + Else + Using f As New UserCreatorForm(user) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then UserListUpdate(user, False) + End Using + End If + End If + End Sub + Private Sub DeleteSelectedUser() + Try + Dim users As List(Of IUserData) = GetSelectedUserArray() + If users.ListExists Then + If USER_CONTEXT.Visible Then USER_CONTEXT.Hide() + Dim ugn As Func(Of IUserData, String) = Function(u) $"{IIf(u.IsCollection, "Collection", "User")}: {u.Name}" + Dim m As New MMessage(users.Select(ugn).ListToString(, vbNewLine), "Users deleting", + {New Messaging.MsgBoxButton("Delete and ban") With {.ToolTip = "Users will be deleted and added to the blacklist"}, + New Messaging.MsgBoxButton("Delete and ban with reason") With { + .ToolTip = "Users will be deleted and added to the blacklist with set a reason to delete"}, + "Delete", "Cancel"}, MsgBoxStyle.Exclamation) With {.ButtonsPerRow = 2} + m.Text = $"The following users ({users.Count}) will be deleted:{vbNewLine}{m.Text}" + Dim result% = MsgBoxE(m) + If result < 3 Then + Dim removedUsers As New List(Of String) + Dim leftUsers As New List(Of String) + Dim l As New ListAddParams(LAP.NotContainsOnly) + Dim b As Boolean = False + Dim reason$ = String.Empty + If result = 1 Then reason = InputBoxE("Enter a deletion reason:", "Deletion reason") + For Each user In users + If user.Delete > 0 Then + If result < 2 Then Settings.BlackList.ListAddValue(New UserBan(user.Name, reason), l) : b = True + RemoveUserFromList(user) + removedUsers.Add(ugn(user)) + Else + leftUsers.Add(ugn(user)) + End If + Next + m = New MMessage(String.Empty, "Users deleting") + If removedUsers.Count = users.Count Then + If removedUsers.Count = 1 Then + m.Text = "User deleted" + Else + m.Text = "All users were deleted" + End If + ElseIf removedUsers.Count = 0 Then + m.Text = "No one user deleted!" + m.Style = MsgBoxStyle.Critical + Else + m.Text = $"The following users were deleted:{vbNewLine}{removedUsers.ListToString(, vbNewLine)}{vbNewLine.StringDup(2)}" + m.Text &= $"The following users were NOT deleted:{vbNewLine}{leftUsers.ListToString(, vbNewLine)}" + m.Style = MsgBoxStyle.Exclamation + End If + If b Then Settings.UpdateBlackList() + MsgBoxE(m) + Else + MsgBoxE("Operation canceled") + End If + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on trying to delete user / collection") + End Try + End Sub + Private Sub DownloadSelectedUser() + Dim users As List(Of IUserData) = GetSelectedUserArray() + If users.ListExists Then + If USER_CONTEXT.Visible Then USER_CONTEXT.Hide() + If users.Count = 1 Then + Downloader.Add(users(0)) + Else + Dim uStr$ = users.Select(Function(u) u.ToString()).ListToString(, vbNewLine) + If MsgBoxE({$"You are select {users.Count} users' profiles{vbNewLine}Do you want to download all of them?{vbNewLine.StringDup(2)}" & + $"Selected users:{vbNewLine}{uStr}", "A few users selected"}, + MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then + Downloader.AddRange(users) + End If + End If + End If + End Sub + Private Sub OpenFolder() + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then user.OpenFolder() + End Sub +#End Region + Friend Sub User_OnPictureUpdated(ByVal User As IUserData) + UserListUpdate(User, False) + End Sub + Private _LogVisible As Boolean = False + Private Sub Downloader_UpdateJobsCount(ByVal TotalCount As Integer) + Dim a As Action = Sub() LBL_JOBS_COUNT.Text = IIf(TotalCount = 0, String.Empty, $"[Jobs {TotalCount}]") + If Toolbar_BOTTOM.InvokeRequired Then Toolbar_BOTTOM.Invoke(a) Else a.Invoke + If Not _LogVisible AndAlso Not MyMainLOG.IsEmptyString Then + a = Sub() BTT_LOG.ControlChangeColor(False) + If Toolbar_TOP.InvokeRequired Then Toolbar_TOP.Invoke(a) Else a.Invoke + _LogVisible = True + End If + End Sub + Private Sub Downloader_OnDownloading(ByVal Value As Boolean) + Dim a As Action = Sub() BTT_DOWN_STOP.Enabled = Not Value + If Toolbar_TOP.InvokeRequired Then Toolbar_TOP.Invoke(a) Else a.Invoke + End Sub +End Class \ No newline at end of file diff --git a/SCrawler/MainMod.vb b/SCrawler/MainMod.vb new file mode 100644 index 0000000..61d5bc4 --- /dev/null +++ b/SCrawler/MainMod.vb @@ -0,0 +1,350 @@ +Imports PersonalUtilities.Functions.XML +Imports SCrawler.API +Imports SCrawler.API.Base +Friend Module MainMod + Friend Settings As SettingsCLS + Friend Const SettingsFolderName As String = "Settings" + Friend ReadOnly LinkPattern As New RegexStructure("[htps:]{0,6}[/]{0,2}(.+)", 1) + Friend ReadOnly FilesPattern As New RegexStructure("[^\./]+?\.\w+", True, False, 1) + Friend Const LVI_TempOption As String = "Temp" + Friend Const LVI_FavOption As String = "Favorite" + Friend Const CannelsLabelName As String = "Channels" + Friend Const LVI_CollectionOption As String = "Collection" + Friend Enum ViewModes As Integer + IconLarge = 0 + IconSmall = 2 + List = 3 + End Enum + Friend Enum ShowingModes As Integer + All = 0 + Regular = 20 + Temporary = 50 + Favorite = 100 + Labels = 500 + NoLabels = 1000 + End Enum + Friend Downloader As TDownloader + Friend InfoForm As DownloadedInfoForm + Friend VideoDownloader As VideosDownloaderForm + Friend ReadOnly ParsersDataDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) + Friend Property MainProgress As PersonalUtilities.Forms.Toolbars.MyProgress + Friend Function GetLviGroupName(ByVal Site As Sites, ByVal Temp As Boolean, ByVal Fav As Boolean, ByVal IsCollection As Boolean) As String + Dim Opt$ = String.Empty + If Temp Then + Opt = LVI_TempOption + ElseIf Fav Then + Opt = LVI_FavOption + End If + If Not Opt.IsEmptyString Then Opt = $" ({Opt})" + If IsCollection Then + Return $"{LVI_CollectionOption}{Opt}" + Else + Return $"{Site}{Opt}" + End If + End Function + Friend Enum Sites As Integer + Undefined = 0 + Reddit = 1 + Twitter = 2 + End Enum + Friend Structure UserInfo : Implements IComparable(Of UserInfo), IEquatable(Of UserInfo), ICloneable + Friend Const Name_Site As String = "Site" + Friend Const Name_Collection As String = "Collection" + Friend Const Name_Merged As String = "Merged" + Friend Const Name_IsChannel As String = "IsChannel" + Friend Name As String + Friend Site As Sites + Friend File As SFile + Friend Merged As Boolean + Friend IncludedInCollection As Boolean + Friend CollectionName As String + Friend IsChannel As Boolean + Friend Sub New(ByVal _Name As String, ByVal s As Sites, Optional ByVal Collection As String = Nothing, + Optional ByVal _Merged As Boolean = False) + Name = _Name + Site = s + IncludedInCollection = Not Collection.IsEmptyString + CollectionName = Collection + Merged = _Merged + UpdateUserFile() + End Sub + Friend Sub New(ByVal x As EContainer) + Me.New(x.Value, + x.Attribute(Name_Site).Value.FromXML(Of Integer)(CInt(Sites.Undefined)), + x.Attribute(Name_Collection).Value, x.Attribute(Name_Merged).Value.FromXML(Of Boolean)(False)) + IsChannel = x.Attribute(Name_IsChannel).Value.FromXML(Of Boolean)(False) + End Sub + Friend Sub New(ByVal c As API.Reddit.Channel) + Name = c.Name + Site = Sites.Reddit + File = c.File + IsChannel = True + End Sub + Public Shared Widening Operator CType(ByVal x As EContainer) As UserInfo + Return New UserInfo(x) + End Operator + Public Shared Widening Operator CType(ByVal u As UserInfo) As String + Return u.Name + End Operator + Public Shared Operator =(ByVal x As UserInfo, ByVal y As UserInfo) + Return x.Equals(y) + End Operator + Public Shared Operator <>(ByVal x As UserInfo, ByVal y As UserInfo) + Return Not x.Equals(y) + End Operator + Public Overrides Function ToString() As String + Return Name + End Function + Friend Sub UpdateUserFile() + File = New SFile With { + .Separator = "\", + .Path = GetFilePathByParams(), + .Extension = "xml", + .Name = $"{UserDataBase.UserFileAppender}_{Site}_{Name}" + } + End Sub + Private Function GetFilePathByParams() As String + If Merged And IncludedInCollection Then + Return $"{Settings.CollectionsPathF.PathNoSeparator}\{CollectionName}\{SettingsFolderName}" + Else + If IncludedInCollection Then + Return $"{Settings.CollectionsPathF.PathNoSeparator}\{CollectionName}\{Site}_{Name}\{SettingsFolderName}" + Else + Return $"{Settings.Site(Site).Path.PathNoSeparator}\{Name}\{SettingsFolderName}" + End If + End If + End Function + Friend Function GetContainer() As EContainer + Return New EContainer("User", Name, {New EAttribute(Name_Site, CInt(Site)), + New EAttribute(Name_Collection, CollectionName), + New EAttribute(Name_Merged, Merged.BoolToInteger), + New EAttribute(Name_IsChannel, IsChannel.BoolToInteger)}) + End Function + Friend Function CompareTo(ByVal Other As UserInfo) As Integer Implements IComparable(Of UserInfo).CompareTo + If Site = Other.Site Then + Return Name.CompareTo(Other.Name) + Else + Return CInt(Site).CompareTo(CInt(Other.Site)) + End If + End Function + Friend Overloads Function Equals(ByVal Other As UserInfo) As Boolean Implements IEquatable(Of UserInfo).Equals + Return Site = Other.Site And Name = Other.Name + End Function + Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean + Return Equals(DirectCast(Obj, UserInfo)) + End Function + Friend Function Clone() As Object Implements ICloneable.Clone + Return New UserInfo With { + .Name = Name, + .Site = Site, + .File = File, + .Merged = Merged, + .IncludedInCollection = IncludedInCollection, + .CollectionName = CollectionName + } + End Function + End Structure + Friend Sub ImageHandler(ByVal User As IUserData) + ImageHandler(User, False) + ImageHandler(User, True) + End Sub + Friend Sub ImageHandler(ByVal User As IUserData, ByVal Add As Boolean) + Try + If Add Then + AddHandler User.OnPictureUpdated, AddressOf MainFrame.User_OnPictureUpdated + Else + RemoveHandler User.OnPictureUpdated, AddressOf MainFrame.User_OnPictureUpdated + End If + Catch ex As Exception + End Try + End Sub + Friend Sub CollectionHandler(ByVal [Collection] As UserDataBind) + Try + AddHandler Collection.OnCollectionSelfRemoved, AddressOf MainFrame.RefillList + Catch ex As Exception + End Try + End Sub + Friend Function GetCurrentBuffer() As String + Dim b$ = BufferText + If Not (Not b.IsEmptyString AndAlso b.Length > 4 AndAlso b.StartsWith("http")) Then b = String.Empty + Return b + End Function + Friend Function GetNewVideoURL() As String + Dim b$ = GetCurrentBuffer() + Dim URL$ = InputBox("Enter video URL:", "Download video by URL", b) + If Not URL.IsEmptyString Then Return URL Else Return String.Empty + End Function + Friend Sub DownloadVideoByURL() + If VideoDownloader Is Nothing Then VideoDownloader = New VideosDownloaderForm + If VideoDownloader.Visible Then + VideoDownloader.BringToFront() + Else + VideoDownloader.Show() + End If + End Sub + Friend Function DownloadVideoByURL(ByVal URL As String, ByVal AskForPath As Boolean, ByVal Silent As Boolean) As Boolean + Dim e As New ErrorsDescriber(Not Silent, Not Silent, True, False) + Try + If Not URL.IsEmptyString Then + Dim u As UserMedia = Nothing + If URL.Contains("twitter") Then + u = Twitter.UserData.GetVideoInfo(URL) + ElseIf URL.Contains("redgifs") Then + u = Reddit.UserData.GetVideoInfo(URL) + Else + MsgBoxE("Site of video URL does not recognized" & vbCr & "Operation canceled", MsgBoxStyle.Exclamation, e) + Return False + End If + + If Not u.URL.IsEmptyString Or Not u.URL_BASE.IsEmptyString Then + Dim f As SFile = u.File + If f.Name.IsEmptyString Then f.Name = $"video_{u.Post.ID}" + If f.Extension.IsEmptyString Then f.Extension = "mp4" + If Not Settings.LatestSavingPath.IsEmptyString And + Settings.LatestSavingPath.Value.Exists(SFO.Path, False) Then f.Path = Settings.LatestSavingPath.Value + If AskForPath OrElse Not f.Exists(SFO.Path, False) Then +#Disable Warning BC40000 + f = SFile.SaveAs(f, "Video file destination", True, "mp4", "Video|*.mp4|All files|*.*", EDP.ReturnValue) +#Enable Warning + End If + If Not f.IsEmptyString Then + Settings.LatestSavingPath.Value = f.PathWithSeparator + Dim dURL$ + Dim FileDownloaded As Boolean = False + Using w As New Net.WebClient + For i% = 0 To 1 + If i = 0 Then dURL = u.URL Else dURL = u.URL_BASE + If Not dURL.IsEmptyString Then + Try + w.DownloadFile(dURL, f) + FileDownloaded = True + Exit For + Catch wex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, wex, "DownloadVideoByURL") + End Try + End If + Next + End Using + If FileDownloaded Then + MsgBoxE($"File downloaded to [{f}]",, e) + Return True + Else + MsgBoxE("File does not downloaded", MsgBoxStyle.Critical, e) + End If + Else + MsgBoxE("File destination does not pointed" & vbCr & "Operation canceled",, e) + End If + Else + MsgBoxE("File URL does not found!", MsgBoxStyle.Critical, e) + End If + Else + MsgBoxE("URL is empty", MsgBoxStyle.Exclamation, e) + End If + Return False + Catch ex As Exception + Return ErrorsDescriber.Execute(e, ex, "Downloading video by URL error", False) + End Try + End Function + Friend Sub CheckForReparse() + Try + Dim p As Func(Of IUserData, Boolean) = Function(u) u.DataForReparseExists + With Settings.Users + If .Count > 0 AndAlso .Exists(Function(u) p.Invoke(u)) Then + If MsgBox("Some users contain not parsed data" & vbCr & + "Do you want to start trying to download?", + MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton1, + "Not parsed data found") = MsgBoxResult.Yes Then + Downloader.AddRange(.Where(p).SelectMany(Function(u) If(u.IsCollection, DirectCast(u, UserDataBind).Collections.Where(p), {u})), True) + End If + End If + End With + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "CheckForReparse") + End Try + End Sub + Friend Structure UserBan + Friend ReadOnly Name As String + Friend ReadOnly Reason As String + Friend ReadOnly Exists As Boolean + Friend Sub New(ByVal Value As String) + If Not Value.IsEmptyString Then + Dim v$() = Value.Split("|") + If v.ListExists Then + Name = v(0) + If v.Length > 1 Then Reason = v(1) + Exists = True + End If + End If + End Sub + Friend Sub New(ByVal _Name As String, ByVal _Reason As String) + Name = _Name + Reason = _Reason + Exists = True + End Sub + Public Shared Widening Operator CType(ByVal Value As String) As UserBan + Return New UserBan(Value) + End Operator + Public Shared Widening Operator CType(ByVal b As UserBan) As String + Return b.ToString + End Operator + Public Overrides Function ToString() As String + Return $"{Name}|{Reason}" + End Function + Friend Function Info() As String + If Not Reason.IsEmptyString Then + Return $"[{Name}] ({Reason})" + Else + Return Name + End If + End Function + Public Overrides Function Equals(ByVal Obj As Object) As Boolean + If Not IsNothing(Obj) Then + If TypeOf Obj Is UserBan Then + Return Name = DirectCast(Obj, UserBan).Name + Else + Return Name = New UserBan(CStr(Obj)).Name + End If + End If + Return False + End Function + End Structure + Friend Function UserBanned(ByVal UserNames() As String) As String() + If UserNames.ListExists Then + Dim i% + Dim Found As New List(Of UserBan) + For Each user In UserNames + i = Settings.BlackList.FindIndex(Function(u) u.Name = user) + If i >= 0 Then Found.Add(Settings.BlackList(i)) + Next + If Found.Count = 0 Then + Return New String() {} + Else + Dim m As New MMessage With { + .Title = "Banned user found", + .Buttons = {"Remove from ban and add", "Leave in ban and add", "Skip"}, + .Style = MsgBoxStyle.Exclamation, + .Exists = True + } + If Found.Count = 1 Then + m.Text = $"This user is banned:{vbNewLine}User: {Found(0).Name}" + If Not Found(0).Reason.IsEmptyString Then m.Text.StringAppendLine($"Reason: {Found(0).Reason}") + Else + m.Text = $"These users was banned:{vbNewLine.StringDup(2)}{Found.Select(Function(u) u.Info).ListToString(, vbNewLine)}" + End If + Dim r% = MsgBoxE(m) + If r = 2 Then + Return Found.Select(Function(u) u.Name).ToArray + Else + If r = 0 Then + Settings.BlackList.ListDisposeRemove(Found, False) + Settings.UpdateBlackList() + End If + End If + End If + End If + Return New String() {} + End Function + Friend Function UserBanned(ByVal UserName As String) As Boolean + Return UserBanned({UserName}).ListExists + End Function +End Module \ No newline at end of file diff --git a/SCrawler/My Project/Application.Designer.vb b/SCrawler/My Project/Application.Designer.vb new file mode 100644 index 0000000..54a4c3f --- /dev/null +++ b/SCrawler/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'NOTE: This file is auto-generated; do not modify it directly. To make changes, + ' or if you encounter build errors in this file, go to the Project Designer + ' (go to Project Properties or double-click the My Project node in + ' Solution Explorer), and make changes on the Application tab. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = true + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = false + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.SCrawler.MainFrame + End Sub + End Class +End Namespace diff --git a/SCrawler/My Project/Application.myapp b/SCrawler/My Project/Application.myapp new file mode 100644 index 0000000..dcc4556 --- /dev/null +++ b/SCrawler/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + true + MainFrame + true + 0 + true + 0 + false + \ No newline at end of file diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..151eda4 --- /dev/null +++ b/SCrawler/My Project/AssemblyInfo.vb @@ -0,0 +1,37 @@ +Imports System.Resources +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + + diff --git a/SCrawler/My Project/Resources.Designer.vb b/SCrawler/My Project/Resources.Designer.vb new file mode 100644 index 0000000..6478cdd --- /dev/null +++ b/SCrawler/My Project/Resources.Designer.vb @@ -0,0 +1,243 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("SCrawler.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property DBPic_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("DBPic_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property Delete() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("Delete", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property Folder_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("Folder_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property GlobeBlue_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("GlobeBlue_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property InfoPic_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("InfoPic_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property NextPIC2() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("NextPIC2", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property PencilPic_01_16() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("PencilPic_01_16", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property PicturePic_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("PicturePic_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property Pin_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("Pin_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property PlusPIC() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("PlusPIC", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property PrevPIC2() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("PrevPIC2", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + ''' + Friend ReadOnly Property Rainbow() As System.Drawing.Icon + Get + Dim obj As Object = ResourceManager.GetObject("Rainbow", resourceCulture) + Return CType(obj,System.Drawing.Icon) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + ''' + Friend ReadOnly Property RedditIcon() As System.Drawing.Icon + Get + Dim obj As Object = ResourceManager.GetObject("RedditIcon", resourceCulture) + Return CType(obj,System.Drawing.Icon) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property RedditPic512() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("RedditPic512", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property Refresh() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("Refresh", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property StarPic_24() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("StarPic_24", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property StartPic_01_Green_16() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("StartPic_01_Green_16", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + ''' + Friend ReadOnly Property TwitterIcon() As System.Drawing.Icon + Get + Dim obj As Object = ResourceManager.GetObject("TwitterIcon", resourceCulture) + Return CType(obj,System.Drawing.Icon) + End Get + End Property + End Module +End Namespace diff --git a/SCrawler/My Project/Resources.resx b/SCrawler/My Project/Resources.resx new file mode 100644 index 0000000..4a9250b --- /dev/null +++ b/SCrawler/My Project/Resources.resx @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Content\Pictures\GlobeBlue_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\StarPic_24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\PrevPIC2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\PicturePic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\NextPIC2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\Folder_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\PencilPic_01_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\PlusPIC.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\InfoPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\Refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\DBPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Icons\RedditIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Icons\Rainbow.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\Pin_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\StartPic_01_Green_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\RedditPic512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Icons\TwitterIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/SCrawler/My Project/Settings.Designer.vb b/SCrawler/My Project/Settings.Designer.vb new file mode 100644 index 0000000..fcfd812 --- /dev/null +++ b/SCrawler/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.SCrawler.My.MySettings + Get + Return Global.SCrawler.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/SCrawler/My Project/Settings.settings b/SCrawler/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/SCrawler/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/SCrawler/My Project/app.manifest b/SCrawler/My Project/app.manifest new file mode 100644 index 0000000..9ce67d2 --- /dev/null +++ b/SCrawler/My Project/app.manifest @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SCrawler/RedditIcon.ico b/SCrawler/RedditIcon.ico new file mode 100644 index 0000000..c9ee6a3 Binary files /dev/null and b/SCrawler/RedditIcon.ico differ diff --git a/SCrawler/SCrawler.vbproj b/SCrawler/SCrawler.vbproj new file mode 100644 index 0000000..f2b28a6 --- /dev/null +++ b/SCrawler/SCrawler.vbproj @@ -0,0 +1,307 @@ + + + + + Debug + AnyCPU + {4A016FAD-9F07-4957-8BB2-AE86C88BA342} + WinExe + SCrawler.My.MyApplication + SCrawler + SCrawler + 512 + WindowsForms + v4.6.1 + true + true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + AnyCPU + true + full + true + true + bin\Debug\ + + + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + false + + + AnyCPU + pdbonly + false + true + true + bin\Release\ + + + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + false + + + On + + + Binary + + + Off + + + On + + + Content\Icons\Rainbow.ico + + + true + true + true + bin\x86\Debug\ + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + full + x86 + + + true + bin\x86\Release\ + true + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + pdbonly + x86 + + + true + true + true + bin\x64\Debug\ + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + full + x64 + + + true + bin\x64\Release\ + true + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + pdbonly + x64 + + + My Project\app.manifest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ChannelViewForm.vb + + + Form + + + DownloadedInfoForm.vb + + + Form + + + CollectionEditorForm.vb + + + Form + + + GlobalSettingsForm.vb + + + Form + + + LabelsForm.vb + + + Form + + + RedditEditorForm.vb + + + Form + + + TwitterEditorForm.vb + + + Form + + + UserCreatorForm.vb + + + Form + + + + + Form + + + MainFrame.vb + Form + + + + + True + Application.myapp + True + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + + VideosDownloaderForm.vb + + + Form + + + + + ChannelViewForm.vb + + + DownloadedInfoForm.vb + + + CollectionEditorForm.vb + + + GlobalSettingsForm.vb + + + LabelsForm.vb + + + RedditEditorForm.vb + + + TwitterEditorForm.vb + + + UserCreatorForm.vb + + + MainFrame.vb + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + VideosDownloaderForm.vb + + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + + {8405896b-2685-4916-bc93-1fb514c323a9} + PersonalUtilities + + + + + PreserveNewest + + + + + + False + Microsoft .NET Framework 4.6.1 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + \ No newline at end of file diff --git a/SCrawler/SettingsCLS.vb b/SCrawler/SettingsCLS.vb new file mode 100644 index 0000000..81fffb6 --- /dev/null +++ b/SCrawler/SettingsCLS.vb @@ -0,0 +1,243 @@ +Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.XML.Base +Imports SCrawler.API +Imports SCrawler.API.Base +Friend Class SettingsCLS : Implements IDisposable + Friend ReadOnly Design As XmlFile + Private ReadOnly MyXML As XmlFile + Private ReadOnly MySites As Dictionary(Of Sites, SiteSettings) + Friend ReadOnly Property Users As List(Of IUserData) + Friend ReadOnly Property UsersList As List(Of UserInfo) + Friend Property Channels As Reddit.ChannelsCollection + Friend ReadOnly Property Labels As LabelsKeeper + Friend ReadOnly Property BlackList As List(Of UserBan) + Private ReadOnly BlackListFile As SFile = $"{SettingsFolderName}\BlackList.txt" + Private ReadOnly UsersSettingsFile As SFile = $"{SettingsFolderName}\Users.xml" + Friend Sub New() + Design = New XmlFile("Settings\Design.xml") + Design.DefaultsLoading(False) + MyXML = New XmlFile(Nothing) With {.AutoUpdateFile = True} + Users = New List(Of IUserData) + UsersList = New List(Of UserInfo) + BlackList = New List(Of UserBan) + GlobalPath = New XMLValue(Of SFile)("GlobalPath", New SFile($"{SFile.GetPath(Application.StartupPath).PathWithSeparator}Data\"), MyXML,, + XMLValue(Of SFile).ToFilePath) + MySites = New Dictionary(Of Sites, SiteSettings) From { + {Sites.Reddit, New SiteSettings(Sites.Reddit, MyXML, GlobalPath.Value)}, + {Sites.Twitter, New SiteSettings(Sites.Twitter, MyXML, GlobalPath.Value)} + } + MySites(Sites.Reddit).Responser.Decoders.Add(SymbolsConverter.Converters.Unicode) + MaxLargeImageHeigh = New XMLValue(Of Integer)("MaxLargeImageHeigh", 150, MyXML) + MaxSmallImageHeigh = New XMLValue(Of Integer)("MaxSmallImageHeigh", 15, MyXML) + ViewMode = New XMLValue(Of Integer)("ViewMode", ViewModes.IconLarge, MyXML) + ShowingMode = New XMLValue(Of Integer)("ShowingMode", ShowingModes.All, MyXML) + SeparateVideoFolder = New XMLValue(Of Boolean)("SeparateVideoFolder", True, MyXML) + CollectionsPath = New XMLValue(Of String)("CollectionsPath", "Collections", MyXML) + DefaultTemporary = New XMLValue(Of Boolean)("DefaultTemporary", False, MyXML) + LatestSavingPath = New XMLValue(Of SFile)("LatestSavingPath", Nothing, MyXML,, XMLValue(Of SFile).ToFilePath) + LatestSelectedLabels = New XMLValue(Of String)("LatestSelectedLabels",, MyXML) + LatestSelectedChannel = New XMLValue(Of String)("LatestSelectedChannel",, MyXML) + ChannelsHideExistsUser = New XMLValue(Of Boolean)("ChannelsHideExistsUser", True, MyXML) + + InfoViewMode = New XMLValue(Of Integer)("InfoViewMode", DownloadedInfoForm.ViewModes.Session, MyXML) + + ChannelsImagesRows = New XMLValue(Of Integer)("ChannelsImagesRows", 2, MyXML) + ChannelsImagesColumns = New XMLValue(Of Integer)("ChannelsImagesColumns", 5, MyXML) + + CheckUpdatesAtStart = New XMLValue(Of Boolean)("CheckUpdatesAtStart", True, MyXML) + ShowNewVersionNotification = New XMLValue(Of Boolean)("ShowNewVersionNotification", True, MyXML) + LatestVersion = New XMLValue(Of String)("LatestVersion", String.Empty, MyXML) + + MyXML.DefaultsLoading(False) + If MyXML.ChangesDetected Then MyXML.UpdateData() + Labels = New LabelsKeeper + If Not LatestSelectedLabels.IsEmptyString Then Labels.CurrentSelection.ListAddList(LatestSelectedLabels.Value.StringToList(Of String, List(Of String))("|")) + If BlackListFile.Exists Then + BlackList.ListAddList(IO.File.ReadAllLines(BlackListFile), LAP.NotContainsOnly) + If BlackList.Count > 0 Then BlackList.RemoveAll(Function(b) Not b.Exists) + End If + End Sub + Friend Sub LoadUsers() + Try + Users.Clear() + If UsersSettingsFile.Exists Then + Using x As New XmlFile(UsersSettingsFile, ProtectionLevels.All, False) With {.AllowSameNames = True} + x.LoadData() + x.DefaultsLoading(False) + If x.Count > 0 Then x.ForEach(Sub(xx) UsersList.Add(xx)) + End Using + Dim PNC As Func(Of UserInfo, Boolean) = Function(u) Not u.IncludedInCollection + If UsersList.Count > 0 Then + Dim cUsers As List(Of UserInfo) = UsersList.Where(Function(u) u.IncludedInCollection).ToList + If cUsers.ListExists Then + Dim d As New Dictionary(Of SFile, List(Of UserInfo)) + cUsers = cUsers.ListForEachCopy(Of List(Of UserInfo))(Function(ByVal f As UserInfo, ByVal f_indx As Integer) As UserInfo + If Not d.ContainsKey(f.File.CutPath(2).Path) Then + d.Add(f.File.CutPath(2).Path, New List(Of UserInfo) From {f}) + Else + d(f.File.CutPath(2).Path).Add(f) + End If + Return f + End Function, True) + Dim v% + If d.Count > 0 Then + For Each kv In d + Users.Add(New UserDataBind(kv.Value(0).CollectionName)) + CollectionHandler(DirectCast(Users(Users.Count - 1), UserDataBind)) + For v = 0 To kv.Value.Count - 1 : DirectCast(Users(Users.Count - 1), UserDataBind).Add(kv.Value(v), False) : Next + Next + d.Clear() + End If + End If + + If UsersList.LongCount(PNC) > 0 Then UsersList.Where(PNC).ToList.ForEach(Sub(u) Users.Add(UserDataBase.GetInstance(u, False))) + End If + If Users.Count > 0 Then + Dim t As New List(Of Task) + For Each user As IUserData In Users : t.Add(Task.Run(AddressOf user.LoadUserInformation)) : Next + Task.WaitAll(t.ToArray) + t.Clear() + Dim du As List(Of UserInfo) = (From u As IUserData In Users + Where Not u.IsCollection AndAlso Not u.FileExists + Select DirectCast(u, UserDataBase).User).ToList + If Not du Is Nothing AndAlso du.Count > 0 Then du.ForEach(Sub(u) UsersList.Remove(u)) : du.Clear() + Users.ListDisposeRemoveAll(Function(ByVal u As IUserData) As Boolean + If u.IsCollection Then + With DirectCast(u, UserDataBind) + If .Count > 0 Then + For i% = .Count - 1 To 0 Step -1 + If Not .Item(i).FileExists Then + .Item(i).Delete() + .Collections.RemoveAt(i) + End If + Next + End If + Return Not .FileExists + End With + Else + Return Not u.FileExists + End If + End Function) + End If + End If + If Users.Count > 0 Then + Labels.ToList.ListAddList(Users.SelectMany(Function(u) u.Labels), LAP.NotContainsOnly) + If Labels.NewLabelsExists Then Labels.Update() : Labels.NewLabels.Clear() + End If + Catch ex As Exception + End Try + End Sub + Friend Overloads Sub UpdateUsersList(ByVal u As UserInfo) + Dim i% = UsersList.IndexOf(u) + If i >= 0 Then + UsersList(i) = u + Else + UsersList.Add(u) + End If + UpdateUsersList() + End Sub + Friend Overloads Sub UpdateUsersList() + If UsersList.Count > 0 Then + Using x As New XmlFile With {.AllowSameNames = True, .Name = "Users"} + x.DefaultsLoading(False) + UsersList.ForEach(Sub(u) x.Add(u.GetContainer())) + x.Save(UsersSettingsFile) + End Using + End If + End Sub + Friend Sub UpdateBlackList() + If BlackList.Count > 0 Then + TextSaver.SaveTextToFile(BlackList.ListToString(, vbNewLine), BlackListFile, True, False, EDP.None) + Else + If BlackListFile.Exists Then BlackListFile.Delete() + End If + End Sub + Friend Overloads Function UserExists(ByVal s As Sites, ByVal UserID As String) As Boolean + Dim UserFinderBase As Predicate(Of IUserData) = Function(user) user.Site = s And user.Name = UserID + Dim UserFinder As Predicate(Of IUserData) = Function(ByVal user As IUserData) As Boolean + If user.IsCollection Then + With DirectCast(user, UserDataBind) + Return .Count > 0 AndAlso .Collections.Exists(UserFinderBase) + End With + Else + Return UserFinderBase.Invoke(user) + End If + End Function + Return Users.Count > 0 AndAlso Users.Exists(UserFinder) + End Function + Friend Overloads Function UserExists(ByVal _User As IUserData) As Boolean + Return UserExists(_User.Site, _User.Name) + End Function + Friend Overloads Function UserExists(ByVal _User As UserInfo) As Boolean + Return UserExists(_User.Site, _User.Name) + End Function + Friend ReadOnly Property Site(ByVal s As Sites) As SiteSettings + Get + Return MySites(s) + End Get + End Property + Friend ReadOnly Property GlobalPath As XMLValue(Of SFile) + Friend ReadOnly Property MaxLargeImageHeigh As XMLValue(Of Integer) + Friend ReadOnly Property MaxSmallImageHeigh As XMLValue(Of Integer) + Friend ReadOnly Property ViewMode As XMLValue(Of Integer) + Friend ReadOnly Property ViewModeIsPicture As Boolean + Get + Select Case ViewMode.Value + Case View.LargeIcon, View.SmallIcon : Return True + Case Else : Return False + End Select + End Get + End Property + Friend ReadOnly Property ShowingMode As XMLValue(Of Integer) + Friend ReadOnly Property SeparateVideoFolder As XMLValue(Of Boolean) + Friend ReadOnly Property CollectionsPath As XMLValue(Of String) + Friend ReadOnly Property CollectionsPathF As SFile + Get + If GlobalPath.IsEmptyString Then + Throw New ArgumentNullException("GlobalPath", "GlobalPath does not set") + Else + Return SFile.GetPath($"{GlobalPath.Value.PathWithSeparator}{CollectionsPath.Value}") + End If + End Get + End Property + Friend ReadOnly Property DefaultTemporary As XMLValue(Of Boolean) + Friend ReadOnly Property LatestSavingPath As XMLValue(Of SFile) + Friend ReadOnly Property LatestSelectedLabels As XMLValue(Of String) + Friend ReadOnly Property LatestSelectedChannel As XMLValue(Of String) + Friend ReadOnly Property InfoViewMode As XMLValue(Of Integer) + Friend ReadOnly Property ChannelsImagesRows As XMLValue(Of Integer) + Friend ReadOnly Property ChannelsImagesColumns As XMLValue(Of Integer) + Friend ReadOnly Property ChannelsHideExistsUser As XMLValue(Of Boolean) + Friend ReadOnly Property CheckUpdatesAtStart As XMLValue(Of Boolean) + Friend ReadOnly Property ShowNewVersionNotification As XMLValue(Of Boolean) + Friend ReadOnly Property LatestVersion As XMLValue(Of String) +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + If Not Channels Is Nothing Then + Channels.Dispose() + If Reddit.ChannelsCollection.ChannelsPathCache.Exists(SFO.Path, False) Then _ + Reddit.ChannelsCollection.ChannelsPathCache.Delete(SFO.Path, False, False, EDP.None) + End If + For Each kv In MySites : kv.Value.Dispose() : Next + MySites.Clear() + Users.ListClearDispose + UsersList.Clear() + Design.Dispose() + MyXML.Dispose() + End If + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region +End Class \ No newline at end of file diff --git a/SCrawler/TDownloader.vb b/SCrawler/TDownloader.vb new file mode 100644 index 0000000..d144d77 --- /dev/null +++ b/SCrawler/TDownloader.vb @@ -0,0 +1,191 @@ +Imports System.Threading +Imports EOptions = PersonalUtilities.Forms.Toolbars.MyProgress.EnableOptions +Imports SCrawler.API +Imports SCrawler.API.Base +Friend Class TDownloader : Implements IDisposable + Friend Event OnJobsChange(ByVal JobsCount As Integer) + Friend Event OnDownloadCountChange() + Friend Event OnDownloading(ByVal Value As Boolean) + Private TokenSource As CancellationTokenSource + Private ReadOnly Items As List(Of IUserData) + Friend ReadOnly Property Downloaded As List(Of IUserData) + Private ReadOnly NProv As IFormatProvider + Private _Working As Boolean = False + Friend ReadOnly Property Working As Boolean + Get + Return _Working + End Get + End Property + Private DThread As Thread + Friend ReadOnly Property Count As Integer + Get + Return Items.Count + End Get + End Property + Friend Sub New() + Items = New List(Of IUserData) + Downloaded = New List(Of IUserData) + NProv = New ANumbers(ANumbers.Modes.USA) With { + .FormatMode = ANumbers.Formats.Number, + .GroupSize = 3, + .GroupSeparator = ANumbers.DefaultGroupSeparator, + .DecimalDigits = 0 + } + End Sub + Friend Sub [Start]() + If Not _Working AndAlso Count > 0 AndAlso Not If(DThread?.IsAlive, False) Then + DThread = New Thread(New ThreadStart(AddressOf StartDownloading)) + DThread.SetApartmentState(ApartmentState.MTA) + DThread.Start() + End If + End Sub + Private Sub StartDownloading() + Dim Token As CancellationToken + RaiseEvent OnDownloading(True) + Try + _Working = True + TokenSource = New CancellationTokenSource + Token = TokenSource.Token + MainProgress.TotalCount = 0 + MainProgress.CurrentCounter = 0 + Do While Count > 0 + Token.ThrowIfCancellationRequested() + UpdateJobsLabel() + DownloadData(Token) + Token.ThrowIfCancellationRequested() + Thread.Sleep(500) + Loop + MainProgress.InformationTemporary = "All data downloaded" + Catch oex As OperationCanceledException When Token.IsCancellationRequested + MainProgress.InformationTemporary = "Downloading canceled" + Catch ex As Exception + MainProgress.InformationTemporary = "Downloading error" + ErrorsDescriber.Execute(EDP.SendInLog, ex, "TDownloader.Start") + Finally + _Working = False + TokenSource = Nothing + UpdateJobsLabel() + RaiseEvent OnDownloading(False) + End Try + End Sub + Friend Sub [Stop]() + If _Working Then TokenSource.Cancel() + End Sub + Private Sub UpdateJobsLabel() + RaiseEvent OnJobsChange(Count) + End Sub + Private _CurrentDownloadingTasks As Integer = 0 + Private Sub DownloadData(ByVal Token As CancellationToken) + Try + If Items.Count > 0 Then + Const nf As ANumbers.Formats = ANumbers.Formats.Number + Dim t As New List(Of Task) + Dim i% = -1 + For Each _Item As IUserData In Items + i += 1 + If i > 4 Then Exit For + Token.ThrowIfCancellationRequested() + t.Add(Task.Run(Sub() _Item.DownloadData(Token))) + Next + If t.Count > 0 Then + _CurrentDownloadingTasks = t.Count + With MainProgress + .Enabled(EOptions.All) = True + .Information = $"Downloading {_CurrentDownloadingTasks.NumToString(nf, NProv)}/{Items.Count.NumToString(nf, NProv)} profiles' data" + .InformationTemporary = .Information + End With + Token.ThrowIfCancellationRequested() + Task.WaitAll(t.ToArray) + Dim dcc As Boolean = False + If Count > 0 And Count >= t.Count Then + For i = t.Count - 1 To 0 Step -1 + With Items(i) + If Not .IsCollection AndAlso .DownloadedTotal(False) > 0 Then + If Not Downloaded.Contains(.Self) Then Downloaded.Add(GetUserFromMainCollection(.Self)) + dcc = True + End If + Items.RemoveAt(i) + End With + Next + End If + If dcc Then Downloaded.RemoveAll(Function(u) u Is Nothing) + If dcc And Downloaded.Count > 0 Then RaiseEvent OnDownloadCountChange() + t.Clear() + End If + End If + Catch aoex As ArgumentOutOfRangeException + ErrorsDescriber.Execute(EDP.SendInLog, aoex, $"TDownloader.DownloadData: index out of range ({Count})") + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "TDownloader.DownloadData") + Finally + MainProgress.Enabled(EOptions.ProgressBar) = False + End Try + End Sub + Private Function GetUserFromMainCollection(ByVal User As IUserData) As IUserData + Dim uSimple As Predicate(Of IUserData) = Function(u) u.Equals(DirectCast(User, UserDataBase)) + Dim uCol As Predicate(Of IUserData) = Function(ByVal u As IUserData) As Boolean + If u.IsCollection Then + Return DirectCast(u, UserDataBind).Collections.Exists(uSimple) + Else + Return False + End If + End Function + Dim uu As Predicate(Of IUserData) + If User.IncludedInCollection Then uu = uCol Else uu = uSimple + Dim i% = Settings.Users.FindIndex(uu) + If i >= 0 Then + If Settings.Users(i).IsCollection Then + With DirectCast(Settings.Users(i), UserDataBind) + i = .Collections.FindIndex(uSimple) + If i >= 0 Then Return .Collections(i) + End With + Else + Return Settings.Users(i) + End If + End If + Return Nothing + End Function + Friend Sub Add(ByVal Item As IUserData) + If Not Items.Contains(Item) Then + If Item.IsCollection Then Item.DownloadData(Nothing) Else Items.Add(Item) + UpdateJobsLabel() + If Not _Working Then Start() + End If + End Sub + Friend Sub AddRange(ByVal _Items As IEnumerable(Of IUserData), Optional ByVal ReparseOnly As Boolean = False) + If _Items.ListExists Then + For i% = 0 To _Items.Count - 1 + 'If i = 5 Then UpdateJobsLabel() : Start() + If ReparseOnly Then _Items(i).DownloadReparseOnly = True + If _Items(i).IsCollection Then _Items(i).DownloadData(Nothing) Else Items.Add(_Items(i)) + Next + UpdateJobsLabel() + Start() + End If + End Sub + Friend Sub UserRemove(ByVal _Item As IUserData) + If Downloaded.Count > 0 AndAlso Downloaded.Contains(_Item) Then Downloaded.Remove(_Item) : RaiseEvent OnDownloadCountChange() + End Sub +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + [Stop]() + Items.Clear() + Downloaded.Clear() + End If + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region +End Class \ No newline at end of file diff --git a/SCrawler/UserImage.vb b/SCrawler/UserImage.vb new file mode 100644 index 0000000..31bdd3f --- /dev/null +++ b/SCrawler/UserImage.vb @@ -0,0 +1,82 @@ +Imports PersonalUtilities.Tools +Friend Class UserImage : Inherits ImageRenderer + Friend Const ImagePrefix As String = "UserPicture" + Friend Const ImagePostfix_Large As String = "_Large" + Friend Const ImagePostfix_Small As String = "_Small" + Private _LargeAddress As SFile + Private _SmallAddress As SFile + Friend Sub New(ByVal _ImgOriginal As SFile, ByVal Destination As SFile, Optional ByVal GenerateLargeSmallPictures As Boolean = True) + MyBase.New(_ImgOriginal) + Dim f As SFile = Destination + f.Path = f.PathWithSeparator & "Pictures" + f.Name = ImagePrefix + f.Extension = "jpg" + Address = f + _LargeAddress = Address + _LargeAddress.Name &= ImagePostfix_Large + _SmallAddress = Address + _SmallAddress.Name &= ImagePostfix_Small + If GenerateLargeSmallPictures Then + GetImage(Settings.MaxSmallImageHeigh.Value, True) + GetImage(Settings.MaxLargeImageHeigh.Value, False) + End If + End Sub + Friend Sub New(ByVal _ImgOriginal As SFile, ByVal _ImgLarge As SFile, ByVal _ImgSmall As SFile, ByVal Destination As SFile) + Me.New(_ImgOriginal, Destination, False) + Dim i As New ImageRenderer(_ImgLarge) + ResizedImages.Add(i.Size, i) + i = New ImageRenderer(_ImgSmall) + ResizedImages.Add(i.Size, i) + _LargeAddress = _ImgLarge + _SmallAddress = _ImgSmall + End Sub + ''' + Friend ReadOnly Property SmallSize As Size + Get + Return GetImage(Settings.MaxSmallImageHeigh.Value, True).Size + End Get + End Property + ''' + Friend ReadOnly Property Small As ImageRenderer + Get + Return GetImage(Settings.MaxSmallImageHeigh.Value, True) + End Get + End Property + ''' + Friend ReadOnly Property LargeSize As Size + Get + Return GetImage(Settings.MaxLargeImageHeigh.Value, False).Size + End Get + End Property + ''' + Friend ReadOnly Property Large As ImageRenderer + Get + Return GetImage(Settings.MaxLargeImageHeigh.Value, False) + End Get + End Property + ''' + ''' + Private Shadows Function GetImage(ByVal h As Integer, ByVal IsSmall As Boolean) As ImageRenderer + With ResizedImages + If .Count > 0 Then + Dim ki% = .Keys.ToList.FindIndex(Function(s) s.Height = h) + If ki >= 0 Then Return .Item(.Keys(ki)) + End If + FitToHeight(h) + If .Count = 0 Then + Throw New ArgumentOutOfRangeException("ResizedImages", "No resized images found") + Else + With .Item(.Keys(.Keys.Count - 1)) + .Address = IIf(IsSmall, _SmallAddress, _LargeAddress) + .Save() + End With + Return .Item(.Keys(.Keys.Count - 1)) + End If + End With + End Function + Public Overrides Sub Save() + MyBase.Save() + Small.Save(_SmallAddress) + Large.Save(_LargeAddress) + End Sub +End Class \ No newline at end of file diff --git a/SCrawler/VideosDownloaderForm.Designer.vb b/SCrawler/VideosDownloaderForm.Designer.vb new file mode 100644 index 0000000..dbd8770 --- /dev/null +++ b/SCrawler/VideosDownloaderForm.Designer.vb @@ -0,0 +1,158 @@ + +Partial Friend Class VideosDownloaderForm : Inherits System.Windows.Forms.Form + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim SEP_2 As System.Windows.Forms.ToolStripSeparator + Me.ToolbarTOP = New System.Windows.Forms.ToolStrip() + Me.BTT_ADD = New System.Windows.Forms.ToolStripButton() + Me.BTT_ADD_LIST = New System.Windows.Forms.ToolStripButton() + Me.BTT_DELETE = New System.Windows.Forms.ToolStripButton() + Me.BTT_DOWN = New System.Windows.Forms.ToolStripButton() + Me.BTT_OPEN_PATH = New System.Windows.Forms.ToolStripButton() + Me.ToolbarBOTTOM = New System.Windows.Forms.StatusStrip() + Me.PR_V = New System.Windows.Forms.ToolStripProgressBar() + Me.LBL_STATUS = New System.Windows.Forms.ToolStripStatusLabel() + Me.LIST_VIDEOS = New System.Windows.Forms.ListBox() + SEP_1 = New System.Windows.Forms.ToolStripSeparator() + SEP_2 = New System.Windows.Forms.ToolStripSeparator() + Me.ToolbarTOP.SuspendLayout() + Me.ToolbarBOTTOM.SuspendLayout() + Me.SuspendLayout() + ' + 'SEP_1 + ' + SEP_1.Name = "SEP_1" + SEP_1.Size = New System.Drawing.Size(6, 25) + ' + 'SEP_2 + ' + SEP_2.Name = "SEP_2" + SEP_2.Size = New System.Drawing.Size(6, 25) + ' + 'ToolbarTOP + ' + Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden + Me.ToolbarTOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_ADD, Me.BTT_ADD_LIST, Me.BTT_DELETE, SEP_1, Me.BTT_DOWN, SEP_2, Me.BTT_OPEN_PATH}) + Me.ToolbarTOP.Location = New System.Drawing.Point(0, 0) + Me.ToolbarTOP.Name = "ToolbarTOP" + Me.ToolbarTOP.Size = New System.Drawing.Size(524, 25) + Me.ToolbarTOP.TabIndex = 0 + ' + 'BTT_ADD + ' + Me.BTT_ADD.AutoToolTip = False + Me.BTT_ADD.Image = Global.SCrawler.My.Resources.Resources.PlusPIC + Me.BTT_ADD.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_ADD.Name = "BTT_ADD" + Me.BTT_ADD.Size = New System.Drawing.Size(75, 22) + Me.BTT_ADD.Text = "Add (Ins)" + ' + 'BTT_ADD_LIST + ' + Me.BTT_ADD_LIST.AutoToolTip = False + Me.BTT_ADD_LIST.Image = Global.SCrawler.My.Resources.Resources.PlusPIC + Me.BTT_ADD_LIST.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_ADD_LIST.Name = "BTT_ADD_LIST" + Me.BTT_ADD_LIST.Size = New System.Drawing.Size(67, 22) + Me.BTT_ADD_LIST.Text = "Add list" + ' + 'BTT_DELETE + ' + Me.BTT_DELETE.AutoToolTip = False + Me.BTT_DELETE.Image = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_DELETE.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DELETE.Name = "BTT_DELETE" + Me.BTT_DELETE.Size = New System.Drawing.Size(83, 22) + Me.BTT_DELETE.Text = "Delete (F8)" + ' + 'BTT_DOWN + ' + Me.BTT_DOWN.AutoToolTip = False + Me.BTT_DOWN.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_DOWN.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWN.Name = "BTT_DOWN" + Me.BTT_DOWN.Size = New System.Drawing.Size(104, 22) + Me.BTT_DOWN.Text = "Download (F5)" + ' + 'BTT_OPEN_PATH + ' + Me.BTT_OPEN_PATH.AutoToolTip = False + Me.BTT_OPEN_PATH.Image = Global.SCrawler.My.Resources.Resources.Folder_32 + Me.BTT_OPEN_PATH.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_OPEN_PATH.Name = "BTT_OPEN_PATH" + Me.BTT_OPEN_PATH.Size = New System.Drawing.Size(120, 22) + Me.BTT_OPEN_PATH.Text = "Open saving path" + ' + 'ToolbarBOTTOM + ' + Me.ToolbarBOTTOM.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.PR_V, Me.LBL_STATUS}) + Me.ToolbarBOTTOM.Location = New System.Drawing.Point(0, 339) + Me.ToolbarBOTTOM.Name = "ToolbarBOTTOM" + Me.ToolbarBOTTOM.Size = New System.Drawing.Size(524, 22) + Me.ToolbarBOTTOM.TabIndex = 1 + ' + 'PR_V + ' + Me.PR_V.Name = "PR_V" + Me.PR_V.Size = New System.Drawing.Size(200, 16) + Me.PR_V.Visible = False + ' + 'LBL_STATUS + ' + Me.LBL_STATUS.Name = "LBL_STATUS" + Me.LBL_STATUS.Size = New System.Drawing.Size(0, 17) + ' + 'LIST_VIDEOS + ' + Me.LIST_VIDEOS.Dock = System.Windows.Forms.DockStyle.Fill + Me.LIST_VIDEOS.FormattingEnabled = True + Me.LIST_VIDEOS.Location = New System.Drawing.Point(0, 25) + Me.LIST_VIDEOS.Name = "LIST_VIDEOS" + Me.LIST_VIDEOS.Size = New System.Drawing.Size(524, 314) + Me.LIST_VIDEOS.TabIndex = 2 + ' + 'VideosDownloaderForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(524, 361) + Me.Controls.Add(Me.LIST_VIDEOS) + Me.Controls.Add(Me.ToolbarBOTTOM) + Me.Controls.Add(Me.ToolbarTOP) + Me.KeyPreview = True + Me.MinimumSize = New System.Drawing.Size(540, 400) + Me.Name = "VideosDownloaderForm" + Me.ShowIcon = False + Me.Text = "Download Videos" + Me.ToolbarTOP.ResumeLayout(False) + Me.ToolbarTOP.PerformLayout() + Me.ToolbarBOTTOM.ResumeLayout(False) + Me.ToolbarBOTTOM.PerformLayout() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Private WithEvents ToolbarTOP As ToolStrip + Private WithEvents BTT_ADD As ToolStripButton + Private WithEvents BTT_ADD_LIST As ToolStripButton + Private WithEvents BTT_DELETE As ToolStripButton + Private WithEvents ToolbarBOTTOM As StatusStrip + Private WithEvents PR_V As ToolStripProgressBar + Private WithEvents LBL_STATUS As ToolStripStatusLabel + Private WithEvents LIST_VIDEOS As ListBox + Private WithEvents BTT_DOWN As ToolStripButton + Private WithEvents BTT_OPEN_PATH As ToolStripButton +End Class \ No newline at end of file diff --git a/SCrawler/VideosDownloaderForm.resx b/SCrawler/VideosDownloaderForm.resx new file mode 100644 index 0000000..d0894be --- /dev/null +++ b/SCrawler/VideosDownloaderForm.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + False + + + 17, 17 + + + 124, 17 + + \ No newline at end of file diff --git a/SCrawler/VideosDownloaderForm.vb b/SCrawler/VideosDownloaderForm.vb new file mode 100644 index 0000000..47f57d7 --- /dev/null +++ b/SCrawler/VideosDownloaderForm.vb @@ -0,0 +1,127 @@ +Imports System.ComponentModel +Imports PersonalUtilities.Forms +Friend Class VideosDownloaderForm + Private MyView As FormsView + Private ReadOnly MyPR As Toolbars.MyProgress + Private ReadOnly UrlList As List(Of String) + Private ReadOnly DownloadingUrlsFile As SFile = $"{SettingsFolderName}\VideosUrls.txt" + Friend Sub New() + InitializeComponent() + UrlList = New List(Of String) + MyPR = New Toolbars.MyProgress(ToolbarBOTTOM, PR_V, LBL_STATUS, "Downloading video") + If DownloadingUrlsFile.Exists Then + UrlList.ListAddList(DownloadingUrlsFile.GetText.StringToList(Of String, List(Of String))(Environment.NewLine), LAP.NotContainsOnly) + End If + End Sub + Private Sub VideosDownloaderForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + MyView = New FormsView(Me) + MyView.ImportFromXML(Settings.Design) + MyView.SetMeSize() + RefillList() + Catch ex As Exception + End Try + End Sub + Private Sub VideosDownloaderForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + e.Cancel = True + Hide() + End Sub + Private Sub VideosDownloaderForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + If Not MyView Is Nothing Then MyView.Dispose(Settings.Design) + If UrlList.Count > 0 Then + TextSaver.SaveTextToFile(UrlList.ListToString(, Environment.NewLine), DownloadingUrlsFile, True,, EDP.SendInLog) + End If + UrlList.Clear() + End Sub + Private Sub VideosDownloaderForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + Dim b As Boolean = True + Select Case e.KeyCode + Case Keys.Insert : AddVideo() + Case Keys.F5 : DownloadVideos() + Case Keys.F8 : BTT_DELETE_Click(Nothing, EventArgs.Empty) + Case Else : b = False + End Select + If b Then e.Handled = True + End Sub + Private Sub RefillList() + Try + With LIST_VIDEOS + .Items.Clear() + If UrlList.Count > 0 Then UrlList.ForEach(Sub(u) .Items.Add(u)) + If .Items.Count > 0 And _LatestSelected >= 0 And _LatestSelected <= .Items.Count - 1 Then .SelectedIndex = _LatestSelected + End With + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on list refill") + End Try + End Sub + Private Sub BTT_ADD_Click(sender As Object, e As EventArgs) Handles BTT_ADD.Click + AddVideo() + End Sub + Private Sub AddVideo() + Dim URL$ = GetNewVideoURL() + If Not URL.IsEmptyString Then + If Not UrlList.Contains(URL) Then + UrlList.Add(URL) + RefillList() + Else + MsgBoxE("This URL already added to list") + End If + End If + End Sub + Private Sub BTT_ADD_LIST_Click(sender As Object, e As EventArgs) Handles BTT_ADD_LIST.Click + Dim l$ = InputBoxE("Enter URLs (new line as delimiter):", "URLs list", GetCurrentBuffer(),,,,,, True) + If Not l.IsEmptyString Then + Dim ub% = UrlList.Count + UrlList.ListAddList(l.StringToList(Of String, List(Of String))(Environment.NewLine)) + If Not UrlList.Count = ub Then RefillList() + End If + End Sub + Private Sub BTT_DELETE_Click(sender As Object, e As EventArgs) Handles BTT_DELETE.Click + If _LatestSelected >= 0 And _LatestSelected <= UrlList.Count - 1 Then + If MsgBoxE({$"Do you really want to delete video URL:{vbCr}{UrlList(_LatestSelected)}", "Deleting URL..."}, + MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo).DialogResult = MsgBoxResult.Yes Then + UrlList.RemoveAt(_LatestSelected) + RefillList() + End If + Else + MsgBoxE("URL does not selected", MsgBoxStyle.Exclamation) + End If + End Sub + Private Sub BTT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_DOWN.Click + DownloadVideos() + End Sub + Private Sub DownloadVideos() + If UrlList.Count > 0 Then + MyPR.TotalCount = UrlList.Count + MyPR.Enabled = True + Dim IsFirst As Boolean = True + For i% = UrlList.Count - 1 To 0 Step -1 + If DownloadVideoByURL(UrlList(i), IsFirst, True) Then UrlList.RemoveAt(i) + MyPR.Perform() + IsFirst = False + Next + MyPR.Done() + RefillList() + MyPR.Enabled = False + Else + MsgBoxE("No one video added", MsgBoxStyle.Exclamation) + End If + End Sub + Private _LatestSelected As Integer = -1 + Private Sub LIST_VIDEOS_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_VIDEOS.SelectedIndexChanged + _LatestSelected = LIST_VIDEOS.SelectedIndex + End Sub + Private Sub BTT_OPEN_PATH_Click(sender As Object, e As EventArgs) Handles BTT_OPEN_PATH.Click + With Settings.LatestSavingPath + If Not .Value.IsEmptyString Then + If .Value.Exists(SFO.Path, False) Then + .Value.Open(SFO.Path, EDP.ShowMainMsg) + Else + MsgBoxE($"Path [{ .Value}] does not exists!", MsgBoxStyle.Exclamation) + End If + Else + MsgBoxE("Saving path does not set!", MsgBoxStyle.Exclamation) + End If + End With + End Sub +End Class \ No newline at end of file