285 lines
18 KiB
XML
285 lines
18 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<Project Sdk="Microsoft.NET.Sdk">
|
|
|
|
<PropertyGroup>
|
|
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
|
|
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
|
|
<OutputType>WinExe</OutputType>
|
|
<UseWinUI>true</UseWinUI>
|
|
<EnableMsixTooling>true</EnableMsixTooling>
|
|
<Nullable>enable</Nullable>
|
|
<LangVersion>latest</LangVersion>
|
|
<ImplicitUsings>enable</ImplicitUsings>
|
|
<RootNamespace>MBN_STOCK_WEBVIEW.LegacyParityApp</RootNamespace>
|
|
<AssemblyName>MBN_STOCK_WEBVIEW.LegacyParityApp</AssemblyName>
|
|
<UseRidGraph>true</UseRidGraph>
|
|
<Platforms>x64</Platforms>
|
|
<PlatformTarget>x64</PlatformTarget>
|
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
|
<RuntimeIdentifiers>win-x64</RuntimeIdentifiers>
|
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
|
<ApplicationIcon>..\..\Assets\AppIcon.ico</ApplicationIcon>
|
|
<PublishTrimmed>false</PublishTrimmed>
|
|
<PublishReadyToRun>false</PublishReadyToRun>
|
|
<ApplicationDisplayVersion>0.1.0</ApplicationDisplayVersion>
|
|
<ApplicationVersion>1</ApplicationVersion>
|
|
<Version>0.1.0</Version>
|
|
<!--
|
|
Keep the legacy runtime assets outside this repository while reproducing the
|
|
original executable-folder layout. A fresh source checkout builds in safe
|
|
source-only DryRun mode when the sibling runtime tree is absent. Supplying an
|
|
explicit root or creating a Release MSIX makes the assets required unless the
|
|
caller explicitly selects Auto mode:
|
|
/p:LegacyRuntimeSourceRoot="D:\path\to\MBN_STOCK_N\bin\Debug"
|
|
/p:LegacyRuntimeAssetsMode=Auto
|
|
-->
|
|
<LegacyRuntimeSourceRootWasSpecified
|
|
Condition="'$(LegacyRuntimeSourceRoot)' != ''">true</LegacyRuntimeSourceRootWasSpecified>
|
|
<LegacyRuntimeSourceRoot Condition="'$(LegacyRuntimeSourceRoot)' == ''">$(MSBuildProjectDirectory)\..\..\..\MBN_STOCK_N\MBN_STOCK_N\bin\Debug</LegacyRuntimeSourceRoot>
|
|
<LegacyRuntimeSourceRoot>$([System.IO.Path]::GetFullPath('$(LegacyRuntimeSourceRoot)'))</LegacyRuntimeSourceRoot>
|
|
<LegacyRuntimeAssetsMode
|
|
Condition="'$(LegacyRuntimeAssetsMode)' == '' and
|
|
('$(LegacyRuntimeSourceRootWasSpecified)' == 'true' or
|
|
('$(Configuration)' == 'Release' and
|
|
('$(GenerateAppxPackageOnBuild)' == 'true' or
|
|
'$(PublishAppxPackage)' == 'true')))">Required</LegacyRuntimeAssetsMode>
|
|
<LegacyRuntimeAssetsMode
|
|
Condition="'$(LegacyRuntimeAssetsMode)' == ''">Auto</LegacyRuntimeAssetsMode>
|
|
<LegacyRuntimeAssetsEnabled
|
|
Condition="Exists('$(LegacyRuntimeSourceRoot)')">true</LegacyRuntimeAssetsEnabled>
|
|
<LegacyRuntimeAssetsEnabled
|
|
Condition="'$(LegacyRuntimeAssetsEnabled)' == ''">false</LegacyRuntimeAssetsEnabled>
|
|
<!--
|
|
Never share an executable directory with a previous full-runtime build.
|
|
Otherwise omitted Cuts/Res (including the local DB INI) could remain stale
|
|
and be consumed by a nominal source-only launch.
|
|
-->
|
|
<BaseOutputPath
|
|
Condition="'$(LegacyRuntimeAssetsEnabled)' != 'true'">bin\SourceOnly\</BaseOutputPath>
|
|
<IntermediateOutputPath
|
|
Condition="'$(LegacyRuntimeAssetsEnabled)' != 'true'">obj\SourceOnly\$(Platform)\$(Configuration)\</IntermediateOutputPath>
|
|
<DefineConstants
|
|
Condition="'$(LegacyRuntimeAssetsEnabled)' != 'true'">$(DefineConstants);SOURCE_ONLY_RUNTIME</DefineConstants>
|
|
<LegacyRuntimeAssetsValidationEnabled
|
|
Condition="'$(LegacyRuntimeAssetsMode)' == 'Required' or
|
|
'$(LegacyRuntimeAssetsEnabled)' == 'true'">true</LegacyRuntimeAssetsValidationEnabled>
|
|
<LegacyRuntimeAssetsValidationEnabled
|
|
Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == ''">false</LegacyRuntimeAssetsValidationEnabled>
|
|
<LegacyCutsSourceRoot>$(LegacyRuntimeSourceRoot)\Cuts</LegacyCutsSourceRoot>
|
|
<LegacyResSourceRoot>$(LegacyRuntimeSourceRoot)\Res</LegacyResSourceRoot>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- Closed runtime contract: every active alias and non-external scene asset must exist. -->
|
|
<LegacyRequiredScene Include="5001;N5001;5006;5011;5016;50160;5023;5024;5025;5026;5029;8018;8032;5032;5037;5074;5076;5077;5078;5079;5080;5081;5082;5083;5084;5085;5086;50860;5087;5088;6001;6067;8001;8002;8003;8035;8061;8040;8046;8051;8056;8067;5068;5070;5072" />
|
|
<LegacyRequiredBuiltInAsset Include="images\주유기merge.png;images\35752913_l.jpg;Images\그림_빨강.png;Images\그림_검정.png;Images\그림_파랑.png;Images\프리마켓.png;Images\애프터마켓.png;Images\KRX.png;Images\NXT.png" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup Condition="'$(LegacyRuntimeAssetsEnabled)' == 'true'">
|
|
<!-- Explicit allowlist: these legacy Res assets contain UI/menu data only. -->
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\a.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\aa.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\dot.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\Find_16x16.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\Find_32x32.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\green.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\Grow.bmp" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\logo.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\MmoneyCoder.ico" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\MoveDown_16x16.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\MoveUp_16x16.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\P.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\pie.bmp" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\Preview.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\pro#00083.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\profit.bmp" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\red.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\sample_1.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\sell.bmp" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\setup.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\t.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\VRIPNG.png" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\기타.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\업종.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\업종_코스닥.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\업종_코스피.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\종목.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\종목_0111.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\종목비교.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\지수.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\지수_0318.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\지수_250401.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\해외.ini" />
|
|
<LegacyPackagedResAsset Include="$(LegacyResSourceRoot)\환율.ini" />
|
|
|
|
<!--
|
|
Same-origin GraphE previews are a second, closed projection of four public
|
|
bitmap assets. Never map the complete Res directory into WebView2: an
|
|
operator-selected legacy directory can contain credential-bearing
|
|
MmoneyCoder.ini.
|
|
-->
|
|
<LegacyFinancialPreviewAsset Include="$(LegacyResSourceRoot)\pie.bmp" />
|
|
<LegacyFinancialPreviewAsset Include="$(LegacyResSourceRoot)\Grow.bmp" />
|
|
<LegacyFinancialPreviewAsset Include="$(LegacyResSourceRoot)\sell.bmp" />
|
|
<LegacyFinancialPreviewAsset Include="$(LegacyResSourceRoot)\profit.bmp" />
|
|
<!-- Official legacy wordmark, projected into the trusted Web root without a remote dependency. -->
|
|
<LegacyBrandAsset Include="$(LegacyResSourceRoot)\logo.png" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<Compile Include="..\..\LegacySceneRuntimeFactory.cs"
|
|
Link="Runtime\LegacySceneRuntimeFactory.cs" />
|
|
<Content Include="..\..\Assets\LockScreenLogo.scale-200.png" Link="Assets\LockScreenLogo.scale-200.png" />
|
|
<Content Include="..\..\Assets\AppIcon.ico" Link="Assets\AppIcon.ico">
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
|
</Content>
|
|
<Content Include="..\..\Assets\SplashScreen.scale-200.png" Link="Assets\SplashScreen.scale-200.png" />
|
|
<Content Include="..\..\Assets\StartupHero.png" Link="Assets\StartupHero.png" />
|
|
<Content Include="..\..\Assets\Square150x150Logo.scale-200.png" Link="Assets\Square150x150Logo.scale-200.png" />
|
|
<Content Include="..\..\Assets\Square44x44Logo.scale-200.png" Link="Assets\Square44x44Logo.scale-200.png" />
|
|
<Content Include="..\..\Assets\Square44x44Logo.targetsize-16_altform-unplated.png" Link="Assets\Square44x44Logo.targetsize-16_altform-unplated.png" />
|
|
<Content Include="..\..\Assets\Square44x44Logo.targetsize-24_altform-unplated.png" Link="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
|
|
<Content Include="..\..\Assets\Square44x44Logo.targetsize-32_altform-unplated.png" Link="Assets\Square44x44Logo.targetsize-32_altform-unplated.png" />
|
|
<Content Include="..\..\Assets\Square44x44Logo.targetsize-48_altform-unplated.png" Link="Assets\Square44x44Logo.targetsize-48_altform-unplated.png" />
|
|
<Content Include="..\..\Assets\Square44x44Logo.targetsize-256_altform-unplated.png" Link="Assets\Square44x44Logo.targetsize-256_altform-unplated.png" />
|
|
<Content Include="..\..\Assets\StoreLogo.png" Link="Assets\StoreLogo.png" />
|
|
<Content Include="..\..\Assets\Wide310x150Logo.scale-200.png" Link="Assets\Wide310x150Logo.scale-200.png" />
|
|
<Content Include="Web\**\*">
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
|
</Content>
|
|
<Content Include="$(LegacyCutsSourceRoot)\**\*"
|
|
Condition="'$(LegacyRuntimeAssetsEnabled)' == 'true'">
|
|
<Link>Cuts\%(RecursiveDir)%(Filename)%(Extension)</Link>
|
|
<TargetPath>Cuts\%(RecursiveDir)%(Filename)%(Extension)</TargetPath>
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
|
</Content>
|
|
<Content Include="@(LegacyPackagedResAsset)"
|
|
Condition="'$(LegacyRuntimeAssetsEnabled)' == 'true'">
|
|
<Link>Res\%(Filename)%(Extension)</Link>
|
|
<TargetPath>Res\%(Filename)%(Extension)</TargetPath>
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
|
</Content>
|
|
<Content Include="@(LegacyFinancialPreviewAsset)"
|
|
Condition="'$(LegacyRuntimeAssetsEnabled)' == 'true'">
|
|
<Link>Web\Previews\%(Filename)%(Extension)</Link>
|
|
<TargetPath>Web\Previews\%(Filename)%(Extension)</TargetPath>
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
|
</Content>
|
|
<Content Include="@(LegacyBrandAsset)"
|
|
Condition="'$(LegacyRuntimeAssetsEnabled)' == 'true'">
|
|
<Link>Web\Brand\%(Filename)%(Extension)</Link>
|
|
<TargetPath>Web\Brand\%(Filename)%(Extension)</TargetPath>
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
|
</Content>
|
|
<!--
|
|
The active legacy DB INI contains credentials. It is available beside the
|
|
executable for local F5/unpackaged development only and is never MSIX Content.
|
|
Historical copies, backups, archives and afiedt.buf.txt are not included at all.
|
|
-->
|
|
<Manifest Include="$(ApplicationManifest)" />
|
|
</ItemGroup>
|
|
|
|
<Target Name="ValidateLegacyRuntimeAssets" BeforeTargets="PrepareForBuild">
|
|
<Error Condition="'$(LegacyRuntimeAssetsMode)' != 'Auto' and
|
|
'$(LegacyRuntimeAssetsMode)' != 'Required'"
|
|
Text="LegacyRuntimeAssetsMode must be Auto or Required." />
|
|
<Message Condition="'$(LegacyRuntimeAssetsMode)' == 'Auto' and
|
|
'$(LegacyRuntimeAssetsEnabled)' != 'true'"
|
|
Importance="high"
|
|
Text="Legacy runtime assets were not found. Building the safe source-only DryRun app. Full runtime use requires a Required build with the approved external root." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyRuntimeSourceRoot)')"
|
|
Text="Legacy runtime source root was not found: $(LegacyRuntimeSourceRoot). Set /p:LegacyRuntimeSourceRoot to the read-only MBN_STOCK_N bin\Debug directory, or use /p:LegacyRuntimeAssetsMode=Auto for a source-only DryRun build." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyCutsSourceRoot)')"
|
|
Text="Legacy Cuts source directory was not found: $(LegacyCutsSourceRoot)." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyResSourceRoot)')"
|
|
Text="Legacy Res source directory was not found: $(LegacyResSourceRoot)." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
(!Exists('$(LegacyResSourceRoot)\pie.bmp') or
|
|
!Exists('$(LegacyResSourceRoot)\Grow.bmp') or
|
|
!Exists('$(LegacyResSourceRoot)\sell.bmp') or
|
|
!Exists('$(LegacyResSourceRoot)\profit.bmp'))"
|
|
Text="The four required GraphE preview bitmaps are missing from $(LegacyResSourceRoot)." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyResSourceRoot)\logo.png')"
|
|
Text="The required legacy brand wordmark is missing: Res\logo.png." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyCutsSourceRoot)\%(LegacyRequiredScene.Identity).t2s')"
|
|
Text="A required active legacy scene file is missing: Cuts\%(LegacyRequiredScene.Identity).t2s." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyCutsSourceRoot)\%(LegacyRequiredBuiltInAsset.Identity)')"
|
|
Text="A required built-in legacy scene asset is missing: Cuts\%(LegacyRequiredBuiltInAsset.Identity)." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyResSourceRoot)\종목.ini')"
|
|
Text="The required legacy stock menu file Res\종목.ini is missing from $(LegacyRuntimeSourceRoot)." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyResSourceRoot)\업종_코스피.ini')"
|
|
Text="The required legacy KOSPI industry menu file Res\업종_코스피.ini is missing from $(LegacyRuntimeSourceRoot)." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyResSourceRoot)\업종_코스닥.ini')"
|
|
Text="The required legacy KOSDAQ industry menu file Res\업종_코스닥.ini is missing from $(LegacyRuntimeSourceRoot)." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyResSourceRoot)\해외.ini')"
|
|
Text="The required legacy overseas menu file Res\해외.ini is missing from $(LegacyRuntimeSourceRoot)." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyResSourceRoot)\환율.ini')"
|
|
Text="The required legacy exchange menu file Res\환율.ini is missing from $(LegacyRuntimeSourceRoot)." />
|
|
<Error Condition="'$(LegacyRuntimeAssetsValidationEnabled)' == 'true' and
|
|
!Exists('$(LegacyResSourceRoot)\지수.ini')"
|
|
Text="The required legacy index menu file Res\지수.ini is missing from $(LegacyRuntimeSourceRoot)." />
|
|
</Target>
|
|
|
|
<!--
|
|
Database credentials are never build inputs. Full Debug, publish and MSIX
|
|
builds use the same user-only LocalAppData overlay as a clean handoff PC.
|
|
-->
|
|
<Target Name="ScrubLegacyDatabaseIniFromBuildOutput"
|
|
BeforeTargets="PrepareForBuild">
|
|
<Delete Files="$(TargetDir)Res\MmoneyCoder.ini"
|
|
Condition="Exists('$(TargetDir)Res\MmoneyCoder.ini')" />
|
|
</Target>
|
|
|
|
<Target Name="RejectLegacyDatabaseIniFromPackagePayload"
|
|
BeforeTargets="_ComputeAppxPackagePayload">
|
|
<ItemGroup>
|
|
<_ForbiddenLegacyDatabasePackagePayload Include="@(PackagingOutputs)"
|
|
Condition="'%(PackagingOutputs.Filename)%(PackagingOutputs.Extension)' == 'MmoneyCoder.ini' or
|
|
'%(PackagingOutputs.TargetPath)' == 'Res\MmoneyCoder.ini' or
|
|
'%(PackagingOutputs.TargetPath)' == 'Res/MmoneyCoder.ini'" />
|
|
</ItemGroup>
|
|
<Error Condition="'@(_ForbiddenLegacyDatabasePackagePayload)' != ''"
|
|
Text="Credential-bearing MmoneyCoder.ini must never enter an MSIX payload or package recipe at any target path." />
|
|
</Target>
|
|
|
|
<ItemGroup>
|
|
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.8.260317003" />
|
|
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3967.48" />
|
|
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.7705" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup Condition="'$(DisableMsixProjectCapabilityAddedByProject)'!='true' and '$(EnableMsixTooling)'=='true'">
|
|
<ProjectCapability Include="Msix" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\MBN_STOCK_WEBVIEW.LegacyApplication\MBN_STOCK_WEBVIEW.LegacyApplication.csproj" />
|
|
<ProjectReference Include="..\MBN_STOCK_WEBVIEW.LegacyBridge\MBN_STOCK_WEBVIEW.LegacyBridge.csproj" />
|
|
<ProjectReference Include="..\MBN_STOCK_WEBVIEW.Core\MBN_STOCK_WEBVIEW.Core.csproj" />
|
|
<ProjectReference Include="..\MBN_STOCK_WEBVIEW.Infrastructure\MBN_STOCK_WEBVIEW.Infrastructure.csproj" />
|
|
<ProjectReference Include="..\MBN_STOCK_WEBVIEW.Playout\MBN_STOCK_WEBVIEW.Playout.csproj" />
|
|
</ItemGroup>
|
|
|
|
<PropertyGroup Condition="'$(DisableHasPackageAndPublishMenuAddedByProject)'!='true' and '$(EnableMsixTooling)'=='true'">
|
|
<HasPackageAndPublishMenu>true</HasPackageAndPublishMenu>
|
|
</PropertyGroup>
|
|
|
|
</Project>
|