Repository: microsoft/BuildCast
Branch: master
Commit: 311844a26c4a
Files: 109
Total size: 1.6 MB
Directory structure:
gitextract__mzsbjjj/
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── design/
│ └── BuildCast.xd
└── src/
├── BuildCast/
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── Assets/
│ │ ├── BuildCastIcon.ai
│ │ └── build2016windowsdevfeed.xml
│ ├── BuildCast.csproj
│ ├── Controls/
│ │ ├── CustomMTC.xaml
│ │ ├── CustomMTC.xaml.cs
│ │ ├── CustomMediaPlayer.xaml
│ │ ├── CustomMediaPlayer.xaml.cs
│ │ ├── RemoteControl.xaml
│ │ ├── RemoteControl.xaml.cs
│ │ ├── TimeControl.cs
│ │ └── Timeline.cs
│ ├── DataModel/
│ │ ├── Episode.cs
│ │ ├── EpisodePlaybackState.cs
│ │ ├── EpisodeWithState.cs
│ │ ├── Favorite.cs
│ │ ├── Feed.cs
│ │ ├── FeedStore.cs
│ │ ├── InkNote.cs
│ │ ├── InkNoteData.cs
│ │ ├── LocalStorageContext.cs
│ │ └── NowPlayingState.cs
│ ├── GlobalSuppressions.cs
│ ├── Helpers/
│ │ ├── AsyncHelpers.cs
│ │ ├── BackgroundDownloadHelper.cs
│ │ ├── BufferingVisualManager.cs
│ │ ├── DateTimeHelper.cs
│ │ ├── EnumToBooleanConverter.cs
│ │ ├── EpisodeCommands.cs
│ │ ├── Json.cs
│ │ ├── LinqExtensions.cs
│ │ ├── NavigationAnimationHelpers.cs
│ │ ├── RelayCommand.cs
│ │ ├── SettingsStorageExtensions.cs
│ │ ├── TitleBarHelper.cs
│ │ ├── UIHelpers.cs
│ │ ├── ValueSetHelper.cs
│ │ └── VisualHelpers.cs
│ ├── Microsoft.BuildCast.ruleset
│ ├── Migrations/
│ │ ├── 20170927020747_initial.Designer.cs
│ │ ├── 20170927020747_initial.cs
│ │ └── LocalStorageContextModelSnapshot.cs
│ ├── Package.appxmanifest
│ ├── Properties/
│ │ ├── AssemblyInfo.cs
│ │ └── Default.rd.xml
│ ├── Services/
│ │ ├── ElementThemeExtended.cs
│ │ ├── IAvailableSystemsObserver.cs
│ │ ├── IFullscreenPage.cs
│ │ ├── IPlayerService.cs
│ │ ├── IRemoteConnection.cs
│ │ ├── IRemotePlayerService.cs
│ │ ├── IRemoteSystemDescription.cs
│ │ ├── Navigation/
│ │ │ ├── FrameAdapter.cs
│ │ │ ├── IFrameAdapter.cs
│ │ │ ├── INavigableTo.cs
│ │ │ ├── INavigationCommand.cs
│ │ │ ├── INavigationService.cs
│ │ │ ├── IPageWithViewModel.cs
│ │ │ └── NavigationService.cs
│ │ ├── PlayerService.cs
│ │ ├── RemotePlayService.cs
│ │ ├── ThemeSelectorService.cs
│ │ └── ViewModeService.cs
│ ├── Strings/
│ │ └── en-us/
│ │ └── Resources.resw
│ ├── Styles/
│ │ ├── Common.xaml
│ │ └── Settings.xaml
│ ├── Themes/
│ │ ├── Branded.xaml
│ │ ├── BrandedXbox.xaml
│ │ ├── Generic.xaml
│ │ └── Stock.xaml
│ ├── ViewModels/
│ │ ├── DownloadsViewModel.cs
│ │ ├── EpisodeDetailsViewModel.cs
│ │ ├── FavoritesViewModel.cs
│ │ ├── FeedDetailsViewModel.cs
│ │ ├── HomeViewModel.cs
│ │ ├── InkNoteViewModel.cs
│ │ ├── NotesViewModel.cs
│ │ ├── PlayerViewModel.cs
│ │ └── SettingsViewModel.cs
│ └── Views/
│ ├── Downloads.xaml
│ ├── Downloads.xaml.cs
│ ├── EpisodeDetails.xaml
│ ├── EpisodeDetails.xaml.cs
│ ├── Favorites.xaml
│ ├── Favorites.xaml.cs
│ ├── FeedDetails.xaml
│ ├── FeedDetails.xaml.cs
│ ├── Home.xaml
│ ├── Home.xaml.cs
│ ├── InkNote.xaml
│ ├── InkNote.xaml.cs
│ ├── NavigationRoot.xaml
│ ├── NavigationRoot.xaml.cs
│ ├── NoteDataTemplateSelector.cs
│ ├── Notes.xaml
│ ├── Notes.xaml.cs
│ ├── Player.xaml
│ ├── Player.xaml.cs
│ ├── PopupPlayer.xaml
│ ├── PopupPlayer.xaml.cs
│ ├── SettingsPage.xaml
│ └── SettingsPage.xaml.cs
└── BuildCast.sln
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.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
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# 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
# TODO: 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
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# 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
# 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
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# 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
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# 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/
# JetBrains Rider
.idea/
*.sln.iml
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) Microsoft Corporation. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE
================================================
FILE: README.md
================================================
---
topic: sample
languages:
- csharp
products:
- windows
- windows-uwp
---
# BuildCast Video Player UWP Sample
BuildCast is an end-to-end sample built to showcase the [Microsoft Fluent Design System](https://fluent.microsoft.com/) as well as other capabilities of the Universal Windows Platform. It permits browsing, downloading and playback of select video podcasts including a sampling of the most popular ones from Channel 9 as well as some popular Windows tech enthusiast feeds. It has other features such as ink notes, bookmarks and remote playback. This sample was initially shown and discussed at the 2017 Build conference during the [Build Amazing Apps with Fluent Design](https://channel9.msdn.com/Events/Build/2017/B8034) talk.
# Features
At a high level this sample demonstrates usage of:
- Fluent design system (Acrylic material, Reveal highlight, Connected animations, ParallaxView, an Adobe XD UX Prototype etc)
- XAML controls and features (NavigationView, swipe commanding, context menu with icons and SVG assets, LoadedImageService, conditional XAML etc)
- Media playback including picture-in-picture and fullscreen views
- Inking and smart ink
- Project Rome and AppServices
- Background download service, Entity Framework and SQLite
- Windows composition APIs (InteractionTracker, implicit animations, scene lighting)
- Notifications with progress bar
- Share contract
## Run the sample
### Prepare your environment
This sample requires Visual Studio 2017 with Update 5 and the Windows 10 Software Development Kit (SDK) version 16299, Windows 10 OS - Fall Creators Update.
* [Get a copy of Visual Studio 2017 Update 4 with support for building Universal Windows apps]( https://www.visualstudio.com/downloads/) [includes SDK 16299]
* [Get the latest Windows 10 Fall Creator's Update](https://www.microsoft.com/en-us/windows) [10.0.16299.0 or later]
* [Get the Windows 10 Insider SDK 16299](https://developer.microsoft.com/en-US/windows/downloads/windows-10-sdk) as a standalone download.
Additionally, to receive the latest updates to Windows and the development tools, and to help shape their development, join the [Windows Insider Program](https://insider.windows.com/ "Become a Windows Insider").
### Run
After opening the Visual Studio solution, set your startup project as **BuildCast**, the architecture to AMD64 or x86, and press F5 to run.
## Code at a glance
The table below shows the platform features used in the application and where abouts to find them in the sample.
### Release Notes Update 1 October 2017
- Add the Adobe XD UX prototype file
- Add back Spectrum Analyzer visualization to now playing
- On startup, app will check for cached media changes at filesystem level and update database state to match this
- Improved commanding on favorites, downloads, notes
- Design tweaks
- Known issues where there will be code changes have all been moved to issues on github
- Bug fixes
### Known Issues
- Download progress reported via toasts / action center will not update when the app quits, even though the download will proceed using background transfer service. This is due to a known platform gap
- Deploying / running BuildCast on a XBOX will result in the app crashing due to a platform bug that is being investigated. [More details here](https://developercommunity.visualstudio.com/content/problem/130393/net-uwp-applications-with-a-targetplatformminversi.html).
- A number of warnings have not been addressed
- Things that didn't make it from the Build talk:
- TreeView control: did not ship in the final Fall Creator's update
- 360 video playback: this will come in a future update to the app
### App details
### Frameworks
| Framework | Usage | Code file |
| :-------------- | :-------------- | --------------: |
| [Entity framework](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/overview) | ORM to store objects in SQLite | [LocalStorageContext.cs](src/BuildCast/DataModel/LocalStorageContext.cs) |
| [SQLite in UWP](https://blogs.windows.com/buildingapps/2017/02/06/using-sqlite-databases-uwp-apps/) | Primary mechanism for persistence | N/A |
| [.NET Standard 2.0](https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-standard-2-0/) | Provides System.Tuple | [NowPlayingState.cs](src/BuildCast/DataModel/NowPlayingState.cs) |
### App features
| App feature | Description | Code file |
| :-------------- | :-------------- | --------------: |
| [Adobe XD](www.adobe.com/products/xd.html) UX Prototype|
| [BuildCast.xd](design/BuildCast.xd) |
| [Acrylic material](https://docs.microsoft.com/en-us/windows/uwp/style/acrylic) | Acrylic material usage
| [Branded.xaml](src/BuildCast/Themes/Branded.xaml) |
| [Reveal highlight](https://docs.microsoft.com/en-us/windows/uwp/style/reveal) | Reveal highlight usage
| [CustomMTC.xaml](src/BuildCast/Controls/CustomMTC.xaml) |
| [NavigationView](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/navigationview) | NavigationView usage
| [NavigationRoot.xaml](src/BuildCast/Views/NavigationRoot.xaml) |
| [Connected animations](https://docs.microsoft.com/en-us/windows/uwp/style/connected-animation) | Used in connected transitions between pages | [FeedDetails.xaml.cs](src/BuildCast/Views/FeedDetails.xaml.cs) |
| [Inking](https://docs.microsoft.com/en-us/windows/uwp/input-and-devices/pen-and-stylus-interactions) | Ink annotation on video frame
| [InkNote.xaml.cs](src/BuildCast/Views/InkNote.xaml.cs) |
| [Smart Ink](https://docs.microsoft.com/en-us/windows/uwp/input-and-devices/pen-and-stylus-interactions) | Recognize and convert images to glyphs and emoji
| [InkNote.xaml.cs](src/BuildCast/Views/InkNote.xaml.cs) |
| Emoji picker | Select emoji
| [InkNote.xaml.cs](src/BuildCast/Views/InkNote.xaml.cs) |
| [Context menus with icons](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/menus) | Context menus with icons
| [FeedDetails.xaml](src/BuildCast/Views/FeedDetails.xaml) |
| [Swipe commanding](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/collection-commanding) | Swipe controls on lists
| [FeedDetails.xaml](src/BuildCast/Views/FeedDetails.xaml) |
| [Mnemonics/Access Keys](https://docs.microsoft.com/en-us/windows/uwp/input-and-devices/access-keys) | Mnemonics usage
| [EpisodeDetails.xaml](src/BuildCast/Views/EpisodeDetails.xaml) |
| [Command bar](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/app-bars) | Command bar usage
| [Player.xaml](src/BuildCast/Views/Player.xaml) |
| [Coordinated animations](https://docs.microsoft.com/en-us/windows/uwp/style/connected-animation) | Used in connected transitions between pages | [FeedDetails.xaml.cs](src/BuildCast/Views/FeedDetails.xaml.cs) |
| [Conditional XAML](https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/conditional-xaml) | NavigationView loads based on OS version support | [NavigationRoot.xaml](src/BuildCast/Views/NavigationRoot.xaml) |
| [SVG](https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.Controls.Image) | BuildCast logo on homepage | [Home.xaml](src/BuildCast/Views/Home.xaml) |
| [Adaptive state triggers](https://blogs.msdn.microsoft.com/cdndevs/2015/06/26/uwp-new-features-of-visual-state-manager-part-1/) | UI optimizations for assorted screen sizes
| [Home.xaml](src/BuildCast/Views/Home.xaml) |
| [ParallaxView](https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.Controls.Parallaxview) | Home screen parallax layout
| [Home.xaml](src/BuildCast/Views/Home.xaml) |
| [Lighting](https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Composition.Effects.SceneLightingEffect) | Buffering animation | [BufferingVisualManager.cs](src/BuildCast/Helpers/BufferingVisualManager.cs) |
| [Interaction tracker](https://docs.microsoft.com/en-us/uwp/api/windows.ui.composition.interactions.interactiontracker) | Interaction tracker
| [Timeline.cs](src/BuildCast/Controls/Timeline.cs) |
| [Layout animations](https://docs.microsoft.com/en-us/windows/uwp/composition/using-the-visual-layer-with-xaml) | Layout animations | [Home.xaml.cs](src/BuildCast/Views/Home.xaml.cs) |
| [LoadedImageSurface](https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.media.loadedimagesurface) | Composition Surface for Images | [CustomMediaPlayer.xaml.cs](src/BuildCast/Controls/CustomMediaPlayer.xaml.cs) |
|[Composition expression language](https://docs.microsoft.com/en-us/windows/uwp/composition/composition-animation) | Timeline animations | [Timeline.cs](src/BuildCast/Controls/Timeline.cs) |
| [Implicit animations](https://docs.microsoft.com/en-us/windows/uwp/composition/using-the-visual-layer-with-xaml) | Poster frame fade out when video starts playing | [VisualHelpers.cs](src/BuildCast/Helpers/VisualHelpers.cs) |
| [Compact overlay mode](https://blogs.msdn.microsoft.com/universal-windows-app-model/2017/02/11/compactoverlay-mode-aka-picture-in-picture/) | Picture-in-picture support
| [ViewModeService.cs](src/BuildCast/Services/ViewModeService.cs) |
| Spectrum Analyzer | Realtime visualization of audio spectra for currently playing clip
| [player.xaml.cs](src/BuildCast/Views/Player.xaml.cs) |
| [Full screen mode](https://docs.microsoft.com/en-us/uwp/api/Windows.UI.ViewManagement.ApplicationView#Methods_) | Full screen mode for video
| [ViewModeService.cs](src/BuildCast/Services/ViewModeService.cs) |
| [Share contract](https://docs.microsoft.com/en-us/windows/uwp/app-to-app/share-data) | Share the annotated frame
| [InkNote.xaml.cs](src/BuildCast/Views/InkNote.xaml.cs) |
| [Background transfer service](https://docs.microsoft.com/en-us/uwp/api/windows.networking.backgroundtransfer) | Video download for offline viewing | [BackgroundDownloadHelper.cs](src/BuildCast/Helpers/BackgroundDownloadHelper.cs) |
| [BTS toast completion notifications](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-adaptive-interactive-toasts) | Toast display upon background download completion
| [BackgroundDownloadHelper.cs](src/BuildCast/Helpers/BackgroundDownloadHelper.cs) |
| [Toast progress bars](https://blogs.msdn.microsoft.com/tiles_and_toasts/2017/02/01/progress-ui-and-data-binding-inside-toast-notifications-windows-10-creators-update/) | Visual download progress indicator
| [BackgroundDownloadHelper.cs](src/BuildCast/Helpers/BackgroundDownloadHelper.cs) | | [CodeFileName.extension](Folder/Folder/CodeFileName.extension#L25) |
| [App services](https://docs.microsoft.com/en-us/windows/uwp/launch-resume/how-to-create-and-consume-an-app-service) | Support Rome based remote control | [RemotePlayService.cs](src/BuildCast/Services/RemotePlayService.cs) |
| [Media Composition API](https://docs.microsoft.com/en-us/uwp/api/Windows.Graphics.Imaging.BitmapEncoder) | Extract frame for Ink annotations from local file | [PlayerService.cs](src/BuildCast/Services/PlayerService.cs) |
| [Template studio](https://blogs.windows.com/buildingapps/2017/05/16/announcing-windows-template-studio/) | Theming, settings model
| |
# Contributing
While we expect to at a later date, this project is not currently accepting contributions. For now, if you have any feedback or questions, please open an Issue on GitHub for the team.
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments
Copyright © Microsoft Corporation. All rights reserved.
This program/project is and its use is subject to the [MIT License](LICENSE)
================================================
FILE: SECURITY.md
================================================
## Security
Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.
## Reporting Security Issues
**Please do not report security vulnerabilities through public GitHub issues.**
Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).
If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).
You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc).
Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
* Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
* Full paths of source file(s) related to the manifestation of the issue
* The location of the affected source code (tag/branch/commit or direct URL)
* Any special configuration required to reproduce the issue
* Step-by-step instructions to reproduce the issue
* Proof-of-concept or exploit code (if possible)
* Impact of the issue, including how an attacker might exploit the issue
This information will help us triage your report more quickly.
If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.
## Preferred Languages
We prefer all communications to be in English.
## Policy
Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).
================================================
FILE: src/BuildCast/App.xaml
================================================
================================================
FILE: src/BuildCast/App.xaml.cs
================================================
// ******************************************************************
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
// ******************************************************************
using System;
using System.Linq;
using System.Threading.Tasks;
using Autofac;
using BuildCast.DataModel;
using BuildCast.Helpers;
using BuildCast.Services;
using BuildCast.Services.Navigation;
using BuildCast.ViewModels;
using BuildCast.Views;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
using Windows.Foundation.Collections;
using Windows.System.Profile;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Hosting;
using Windows.UI.Xaml.Navigation;
namespace BuildCast
{
///
/// Provides application-specific behavior to supplement the default Application class.
///
public sealed partial class App : Application
{
private IContainer _container;
private BackgroundTaskDeferral appServiceDeferral;
private NavigationRoot rootPage;
///
/// Initializes a new instance of the class.
/// executed, and as such is the logical equivalent of main() or WinMain().
///
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
LocalStorageContext.CheckMigrations();
this.RequiresPointerMode = ApplicationRequiresPointerMode.WhenRequested;
}
public static AppServiceConnection Connection { get; set; }
public NavigationRoot GetNavigationRoot()
{
if (Window.Current.Content is NavigationRoot)
{
return Window.Current.Content as NavigationRoot;
}
else if (Window.Current.Content is Frame)
{
return ((Frame)Window.Current.Content).Content as NavigationRoot;
}
throw new Exception("Window content is unknown type");
}
public Frame GetFrame()
{
var root = GetNavigationRoot();
return root.AppFrame;
}
///
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
///
/// Details about the launch request and process.
protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
//XBOX support
if (AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Xbox")
{
ApplicationView.GetForCurrentView().SetDesiredBoundsMode(ApplicationViewBoundsMode.UseCoreWindow);
bool result = ApplicationViewScaling.TrySetDisableLayoutScaling(true);
}
await InitializeAsync();
InitWindow(skipWindowCreation: args.PrelaunchActivated);
// Tasks after activation
await StartupAsync();
await Window.Current.Dispatcher.RunIdleAsync(async (s) =>
await BackgroundDownloadHelper.AttachToDownloads());
}
protected override void OnWindowCreated(WindowCreatedEventArgs args)
{
base.OnWindowCreated(args);
}
protected async override void OnActivated(IActivatedEventArgs args)
{
await InitializeAsync();
InitWindow(skipWindowCreation: false);
if (args.Kind == ActivationKind.Protocol)
{
Window.Current.Activate();
// Tasks after activation
await StartupAsync();
}
}
protected async override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
var instance = args?.TaskInstance;
await BackgroundDownloadHelper.CheckCompletionResult(instance);
base.OnBackgroundActivated(args);
if (args.TaskInstance.TriggerDetails is AppServiceTriggerDetails details && _container != null)
{
var remotePlayerService = _container.Resolve();
remotePlayerService.RemoteActivation(args.TaskInstance.GetDeferral(), details.AppServiceConnection);
appServiceDeferral = args.TaskInstance.GetDeferral();
Connection = details.AppServiceConnection;
Connection.RequestReceived += OnRequestReceived;
Connection.ServiceClosed += AppServiceConnection_ServiceClosed;
}
}
private void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
var deferral = args.GetDeferral();
Console.WriteLine(args.Request.Message);
deferral.Complete();
appServiceDeferral.Complete();
}
private void OnAppServicesCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
appServiceDeferral.Complete();
}
private void AppServiceConnection_ServiceClosed(AppServiceConnection sender, AppServiceClosedEventArgs args)
{
appServiceDeferral.Complete();
}
private void InitWindow(bool skipWindowCreation)
{
var builder = new ContainerBuilder();
rootPage = Window.Current.Content as NavigationRoot;
bool initApp = rootPage == null && !skipWindowCreation;
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (initApp)
{
// Create a Frame to act as the navigation context and navigate to the first page
rootPage = new NavigationRoot();
FrameAdapter adapter = new FrameAdapter(rootPage.AppFrame);
builder.RegisterInstance(adapter)
.AsImplementedInterfaces();
builder.RegisterType();
// The feed details view model needs to be a singleton in order to better accomodate Connected Animation
builder.RegisterType()
.SingleInstance();
builder.RegisterType();
builder.RegisterType();
builder.RegisterType();
builder.RegisterType();
builder.RegisterType();
builder.RegisterType();
builder.RegisterType();
builder.RegisterType()
.AsImplementedInterfaces()
.SingleInstance();
builder.RegisterType()
.AsImplementedInterfaces();
builder.RegisterInstance(PlayerService.Current)
.AsImplementedInterfaces()
.SingleInstance();
_container = builder.Build();
rootPage.InitializeNavigationService(_container.Resolve());
adapter.NavigationFailed += OnNavigationFailed;
// Place the frame in the current Window
Window.Current.Content = rootPage;
Window.Current.Activate();
}
}
private async Task InitializeAsync()
{
await ThemeSelectorService.InitializeAsync();
await Task.CompletedTask;
}
private async Task StartupAsync()
{
BuildCast.Services.ThemeSelectorService.SetRequestedTheme();
await FeedStore.CheckDownloadsPresent();
await Task.CompletedTask;
}
private async System.Threading.Tasks.Task FixFeedItemThumbnail(Feed feed, Episode feedItem)
{
var feedItems = await feed.GetEpisodes();
var matchedItem = feedItems.FirstOrDefault(uri => uri.Key == feedItem.Key);
if (matchedItem != null)
{
feedItem = matchedItem;
}
return feedItem;
}
private void ParseProtocolData(ValueSet playbackData, out Feed feed, out Episode feedItem, out TimeSpan timespan)
{
var values = playbackData.GetValueSet("feed");
feed = Feed.BuildFeedFromValueSet(values);
values = playbackData.GetValueSet("feeditem");
feedItem = Episode.BuildFromValueSet(values);
timespan = playbackData.GetTimeSpan("ElapsedTime");
}
///
/// Invoked when Navigation to a certain page fails
///
/// The Frame which failed navigation
/// Details about the navigation failure
private void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}
///
/// Invoked when application execution is being suspended. Application state is saved
/// without knowing whether the application will be terminated or resumed with the contents
/// of memory still intact.
///
/// The source of the suspend request.
/// Details about the suspend request.
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
deferral.Complete();
}
}
}
================================================
FILE: src/BuildCast/Assets/BuildCastIcon.ai
================================================
%PDF-1.5
%
1 0 obj
<>/OCGs[5 0 R 21 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<>stream
Adobe Illustrator CC 2017 (Windows)
2017-10-06T13:36:49-07:00
2017-10-06T13:40:17-07:00
2017-10-06T13:40:17-07:00
256
256
JPEG
/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//2Q==
1
False
False
32.000000
32.000000
Pixels
Default Swatch Group
0
Document
application/pdf
BuildCastIcon
proof:pdf
uuid:18d859fb-8be1-4c4d-bb5e-99b9731ed62b
uuid:73685081-2781-4ec9-9bdf-6b0c098d612f
Adobe PDF library 15.00
endstream
endobj
3 0 obj
<>
endobj
7 0 obj
<>/Resources<>/Properties<>>>/Thumb 26 0 R/TrimBox[0.0 0.0 32.0 32.0]/Type/Page>>
endobj
23 0 obj
<>stream
HlTKnTAܿS[b p*43ye]sjχp~O|?_~^_<>WZtѣ<<<:N*3V9؊rrqDs"KGy8NUV]:Q ZT]۔0/&/1Dao&jI,'2F0.3"
y3&l5rMֈmmLqJOT{ c?C@#CJ(8ɇBXD6)=<eFHl_B
"PBzV
m3}(b#v ^x
iW=%$@">92hn4ZP;4<;i`Wy\V/qtNڠh߹{ǑSf($-ފA4v同)FXD.e@:c^3WuymEh[`?# 2
endstream
endobj
26 0 obj
<>stream
8;Xp,*>JPW(]\SI%<2~>
endstream
endobj
27 0 obj
[/Indexed/DeviceRGB 255 28 0 R]
endobj
28 0 obj
<>stream
8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn
6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O(
l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
21 0 obj
<>
endobj
29 0 obj
[/View/Design]
endobj
30 0 obj
<>>>
endobj
25 0 obj
<>
endobj
24 0 obj
<>
endobj
31 0 obj
<>
endobj
32 0 obj
<>stream
%!PS-Adobe-3.0
%%Creator: Adobe Illustrator(R) 17.0
%%AI8_CreatorVersion: 21.1.0
%%For: (James Clarke) ()
%%Title: (BuildCastIcon.ai)
%%CreationDate: 10/6/2017 1:40 PM
%%Canvassize: 16383
%%BoundingBox: 2 -1 32 30
%%HiResBoundingBox: 2 -0.089002939723287 31.9395093917847 30
%%DocumentProcessColors:
%AI5_FileFormat 13.0
%AI12_BuildNumber: 326
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%RGBProcessColor: 0 0 0 ([Registration])
%AI3_Cropmarks: 0 0 32 32
%AI3_TemplateBox: 16.5 15.5 16.5 15.5
%AI3_TileBox: -272.960000991821 -368 304.9599609375 400
%AI3_DocumentPreview: None
%AI5_ArtSize: 14400 14400
%AI5_RulerUnits: 6
%AI9_ColorModel: 1
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 1
%AI17_Begin_Content_if_version_gt:17 1
%AI9_OpenToView: -45 62.75 8 2012 1504 18 0 0 153 233 0 0 0 1 1 0 1 1 0 1
%AI17_Alternate_Content
%AI9_OpenToView: -45 62.75 8 2012 1504 18 0 0 153 233 0 0 0 1 1 0 1 1 0 1
%AI17_End_Versioned_Content
%AI5_OpenViewLayers: 7
%%PageOrigin:-358 -652
%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments
endstream
endobj
33 0 obj
<>stream
%%BoundingBox: 2 -1 32 30
%%HiResBoundingBox: 2 -0.089002939723287 31.9395093917847 30
%AI7_Thumbnail: 128 128 8
%%BeginData: 2039 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF
%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF
%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF
%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF
%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF
%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF
%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFFFFFFFF
%%EndData
endstream
endobj
34 0 obj
<>stream
%AI12_CompressedDataxݽv*90zg-8IIDls&m1ffO:7jT*i-|H:Lh鯵,59"?{h,Oz4f*f_Ֆ7<&Yiߏ5Qk_R4⓫'딚a{O6Q4tUn
ˤ)a3!6/0SҤ9u,?~(QlB<I[FLsLgEddvyО|Kdɜ9>#Q_4#ݕɇ}IEOA7eS}T$Ð:R0#
jxЛ fu('@ZlF}[!q MP_
nȔJsIw6!f|y}|,ƒ܇E~UeCc#8EE)\2 ^̆iS @vzp0$AО2qL#dҬeKck-LH#"pz<.&CA
M ^>vי,zћy0KEx#AywB_ЕlC]om)K!)Kjy,(2:P~zcMf)Ó x2ĆO!Bh`zD۟֔/\0C%%_ҸiSu^/P';#WÈu77~[IߣDEfn;T'`{wx<7(^LCUPCrOh8>?h\ty]g?M'ݖ"1%C4VCP"쪵l]D4V"AHƢ,}
NAe{)X~P-[&;X`h2)⇟S<ݓIɷxGIo
šM7bBal讉#a4_ȥE0ҙ+!+_x81hV3lY>ͲjwV_ ]3,C NFҁ+f_ Ëf?IEkѳ;Yw`._>`~Zy1Je]?ЙW75\tה ~=Mxu.B{}h *w[vP4.rA1kv{YꫭPP?Əoqd?z) amw7パK>H :ꃫKޠ%uФ5'&꒘K3Ihl(&jnH)7RPmzgЬ\(A86$5vC
|HO|.V$m#q]jn#ao&?2A:AwzRJxMrO?橶OLRq0Wk0Dz+[cTS~?cgLDv8q{0+5BEs'F_8dِ!{fc!ƨ-/`@Ad&4&5~)q1蒍Pl[x@R&)-֠)wB^m6o_jP2a
uw5+`q\F]2yC9X8iVtgNԡ!fsIe;ܴQ{kcswe[Cɸ;<ҥuԺwC^9Bͬ0՚r:Bc
ߡ atа9FIRmMq1'DJ;%
Hkç5z6;;tȾ@NFOgMn+
ToƒlLT.:j,Vf@[Pw4T""ڎ?dI{w`ɡ@iQEYӈ}<^2YIR
l5[^w1IӻB0-¨bgQu%DLy)/` 4'tI^Iȩ7#I^MwU7ڈl
er?tuQ$tUqp!G٣#B2`&D\6,Ϧ}C$zӚqj:wR{|ڕG:"^Gdt7PK=rBLy)Jhf{L|JzɉufCMp!ntMi^w v M/;2QIXՄ)ux*uu%E Z^9 }^\UCaVܠo;x&a͊^
K8ȹ!a5u+qͶTP_yX]Wb6e=Z
ȥ9Vhz`RcUe,e/Ibi8XT-="CD'fl/UfO
,Pj~뒡e$O$Um&7w|E/#.jMlf/:#mʹQj
LW:4f=S Md#EU4Qm%a{'K=NA
KnsKCZZ7&-Mh:SLȀGʿÁ<}n!@HB\` (*6Kx<xEsί*@Å
|˶d C{pҢʻ*Uy}0B>Q&mMyih$t
XE2q@v"Pbr0^N![}9_8G0kנluMMs+ <#uI% @f=0k,[į6Er'9TRQ{rRV9j#
6O (#/"́2cUXod^AN
wPNZl2YgBv],<- B#t$4~6B)~Jv
秽sѸ;:Jh(,uh VbL g
gr-8<4RrLxٰĒGalWu~&a,#CtS K۾=es ]D\TԗwAC]8(v8RfJ)t&=x7,s3#IkBd4&H+-5y`)U ɿC?ȷEgעd}n\sʺwK5m95p2l=z5mKSyO*kM~ɐ|5z]mR{eR6פHCT19`I"p06åNo-7qq{/Qh(wBfZQ/}4M\C&{jOv\Kfrg#ɒ'y6 SyƂ'e 8ѩ2JϝOdP۲gN6l1RКзweW(R#pu(xN0̧^O" l?%iRk#>繛E=zo|$JLeB``ktOm|u;Sj7c^tzڻSFM7p@\͡~$@Tb[!<1K@ZyE2 Vmu=%ֶ
JVj6&m>APW!c{?R?4j웏
jg\s>LB 7A?
>!>> C L
E[
uB3k*X^W; w/`э2
Qhj7j]/"nY1hb3S,-WBZQT}_yZS<pͽ^oPeN9TԺ8hsI=:m()2Ry6<$rHΔR0Q]rY7^p1㮞z5%>%Y !rez/eLٱ4;s7=Pbڍ6e9Þ,Dǐ+ވ&)HĈF(
VxJ&}cvjC~44 *aԻ
)*xXv\vtkޓGf`p9x;EL<hc2L#Ǧb(89,hE)e2lr}`0WV]N&q.zkS4'Pi0PąE-kl4xrU{%vͿSIrM3N)Gw=\zمF0+%vslW|nZ)&;M>< ۗy^pEl{Wb=wU[4ӟ(_ 'Ru ~mgpޓ$Os1/KKačNat/am/fl!x2<12W`dywUώslm6Y<7)?Tﯪ;6YԹt۽昣z)-\;g7#0v:9-zy Oa7Ԙ˃[#Qw}YGEs/(X-Fg_bdY(wW@~j>
I$;$S7k)$pSnhI
eY˱aokl{n|.۠*`T%%A}.PKtx&tkBnu{y}::A'oHkd@0`m@MfsP'zUtru kӺt+ԍ
S;BQgcF-&7Ma0]ƆA@jUP=oZujU|$\fR
*҆(9Cȼw'q'{ `Ey=S1gP7w>?W
6֥]Ꟗܠ6ۍ3!E2NPqm+=}"bc3aIZyZ>l3'P7֤Ʋi<>4]W2_2ss
`Fˇ?_Y CmlmPϸ@}L02IhtkC4f
yrJԚx|¯]Ww], T 0svtr *Jh^T]eG3Գ_\wzDLOW^k.PﯙJj,NT jǀ`f^y'M؍Ԭs=a6<~٣+ w)7XQbAG{*z7PTJÄ65U[N+PM.ƇʯKVla?fӕ@#㣰]Ej2i@zR|MMv2O/`M\"l.
`c%ƒ~It}F>ڟ?4tj8?6oO?/&W
CXs:r}
`ΗۭKlm}=Rol_Ǻ[ԧruHshpSi۵V*߱= m%Ű+^>0_0-'>m[6^_N[#no@Z!̭F.5:ٲ=]]ԧ)z;,5\Le{B:e,1ǒaC:oWyƫ=xƿ#Ur r5":cQ6EMEBUYaT!pL\:7ӼgHqu%iEA-WJXDjlt^Y-p
T/*S}?kB0E;fBc5{VlvWOC A[Ogw
\" ka M]s]-`L\WZ|:C']Sz:]bBE#ʲRNORWC盢iem^yܝiKSS>UtaO)\dp[T7vY3}MBo+;tԐ J(0=Ի>vs_d2fAR
a~O*b\kvJKĐbS*u㡆es`voG{ڠ/:ZM
AG
g/z/gĵ5ykv;tbCO6OshwlDxyRɍ0ɇ6IS0qWnmk5TF'B+l⯪_o440PY63ӏ?Z>XLp! _\!w4#R(jB FR/?Te3Xи"gTt'^+*8#{'69Ǟ$8{;{+drթUYwL9F3/"W IaM ; tQh6ou]YLJlsuFW(j̸&9h49ŭ7+nNͪ+w\al?cFRH{UXR#=M 0C6>,`6ǁFn'1uj:Xt "H6%mnh6SS9."'5qkTFU*/.xE{xIazQanն@54<hжY섯)BU[(cJŝ{o'' |H{4t2w;uGZb9ׂxu7VSX߄s8,ҺcO!hj8$:8'vGvw$X4#!7^H|Άb0Vs sѣ5y?:ы9]rϣV+;5bG4ѹĚK3Gf1Ex4J{ qz\ &1#⧰>m=LYq[vJuc<:|y}×3OE9#ُMǢ)@l\#9ƽK@Uk>R=ޘ{rIJ_z^=hbyqX7ϔT>R3p 16M(hnՉJS $,! ?!f5
@7mfP/=^T,g]g6ɂB/YULzOS
1(+=<@蠧(ػ^gf[xJ9X5+AәߵABL1R2 V*$daZ'~װoeά̂007"yh8lj]\