commit a6377ab5837ebf142b0ec45b94387ad644984f96 Author: Josef Marek Date: Mon Sep 7 09:45:32 2026 +0200 Baseline: současný stav projektu Rozpisky První commit — WPF aplikace pro generování výkresových rohových razítek (.NET 10, SkiaSharp, ACadSharp, ClosedXML) včetně xUnit testů, DXF šablony, log a dokumentace. Build výstupy (bin/, obj/, .vs/) jsou ignorovány. Co-Authored-By: Claude Opus 5 diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..f574d8c --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,68 @@ +{ + "permissions": { + "allow": [ + "Bash(cd \"D:/Přesunuté/300_Programování/00_NET/00_Csharp/01_ExeApps/Rozpisky\" && echo \"=== v projektu ===\" && find . -type f \\\\\\( -iname \"*.xls\" -o -iname \"*.xlsx\" -o -iname \"*.xlsm\" -o -iname \"*.csv\" \\\\\\) -not -path '*/.vs/*' 2>/dev/null; echo \"=== o úroveň výš \\(01_ExeApps\\) ===\" && find .. -maxdepth 2 -type f \\\\\\( -iname \"*.xls\" -o -iname \"*.xlsx\" -o -iname \"*.xlsm\" \\\\\\) 2>/dev/null | head -40)", + "Bash(python --version)", + "Bash(py --version)", + "Bash(python -c \"import openpyxl; print\\('openpyxl ok'\\)\")", + "Bash(python -)", + "Bash(PYTHONIOENCODING=utf-8 PYTHONUTF8=1 python -)", + "Bash(grep -nE '^#{1,4} ' SZ_SM011_P10_Manual_v6.md)", + "Bash(grep -nE '^#{2,3} ' ROZHRANI.md)", + "Bash(pip install *)", + "Bash(python -c ' *)", + "Bash(dotnet build *)", + "Bash(dotnet run *)", + "Bash(dotnet build-server *)", + "Bash(rm -rf __verify)", + "PowerShell(Get-Process Rozpisky -ErrorAction SilentlyContinue)", + "Bash(start \"\" \"bin/Debug/net9.0-windows/Rozpisky.exe\")", + "Bash(python -c \"import openpyxl; wb=openpyxl.load_workbook\\('Rozpisky 1.0.8.xlsx', data_only=True\\); print\\([ws.title for ws in wb.worksheets]\\)\")", + "PowerShell(dotnet build \"C:\\\\Users\\\\marek\\\\_Osobn�\\\\C sharp\\\\Rozpisky\\\\Rozpisky\\\\Rozpisky.csproj\" -nologo -v q 2>&1)", + "Bash(awk 'prev==\" 2\"{print $0} {prev=$0}' Rozpiska.dxf)", + "Bash(awk ' *)", + "PowerShell(dotnet build \"C:\\\\Users\\\\marek\\\\_Osobn�\\\\C sharp\\\\Rozpisky\\\\Rozpisky\\\\Rozpisky.csproj\" -nologo 2>&1)", + "Bash(grep -nE \"[SP]K?[0-9X]{2,}.*_.*X|_X{2,}_|kód|Kód\" SZ_SM011_P10_Manual_v6.md)", + "PowerShell(dotnet run --project \"C:\\\\Users\\\\marek\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-marek--Osobn--C-sharp-Rozpisky\\\\ae89cc85-57aa-4d51-a1bc-065fe7454d9d\\\\scratchpad\\\\kodtest\\\\kodtest.csproj\" -v q --nologo 2>&1)", + "mcp__visualize__read_me", + "mcp__visualize__show_widget", + "PowerShell(dotnet run --project \"C:\\\\Users\\\\marek\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-marek--Osobn--C-sharp-Rozpisky\\\\ae89cc85-57aa-4d51-a1bc-065fe7454d9d\\\\scratchpad\\\\icongen\\\\icongen.csproj\" -v q --nologo 2>&1)", + "Bash(mkdir -p \"/c/Users/marek/AppData/Local/Temp/claude/C--Users-marek--Osobn--C-sharp-Rozpisky/ae89cc85-57aa-4d51-a1bc-065fe7454d9d/scratchpad/fragtest\" *)", + "PowerShell(dotnet run --project \"C:\\\\Users\\\\marek\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-marek--Osobn--C-sharp-Rozpisky\\\\ae89cc85-57aa-4d51-a1bc-065fe7454d9d\\\\scratchpad\\\\fragtest\\\\fragtest.csproj\" -c Debug 2>&1)", + "Bash(cp \"Loga/logo1.dxf\" \"Rozpisky/loga/eu_op_doprava.dxf\")", + "Bash(cp \"Loga/logo2.dxf\" \"Rozpisky/loga/md_sfdi.dxf\")", + "Bash(cp \"Loga/logo3.dxf\" \"Rozpisky/loga/sprava_zeleznic.dxf\")", + "Bash(cp \"Loga/logo4.dxf\" \"Rozpisky/loga/exprojekt.dxf\")", + "Bash(rm -rf \"Loga\")", + "PowerShell(dotnet build \"D:\\\\P�esunut�\\\\300_Programov�n�\\\\00_NET\\\\00_Csharp\\\\01_ExeApps\\\\Rozpisky\\\\Rozpisky\\\\Rozpisky.csproj\" -nologo -clp:ErrorsOnly)", + "Bash(xargs wc -l)", + "Bash(find \"/mnt/d/Přesunuté/300_Programování/00_NET/00_Csharp/01_ExeApps/Rozpisky\" -name \"*.cs\" -type f | grep -i cad)", + "Bash(Get-ChildItem -Path \"D:\\\\Přesunuté\\\\300_Programování\\\\00_NET\\\\00_Csharp\\\\01_ExeApps\\\\Rozpisky\" -Recurse -Directory)", + "Bash(Select-Object -ExpandProperty FullName)", + "Bash(Get-ChildItem -Path \"D:\\\\Přesunuté\\\\300_Programování\\\\00_NET\\\\00_Csharp\\\\01_ExeApps\\\\Rozpisky\" -Recurse -File -Filter \"*.csproj\")", + "Bash(Select-Object FullName)", + "Bash(find \"D:\\\\\\\\Přesunuté\\\\\\\\300_Programování\\\\\\\\00_NET\\\\\\\\00_Csharp\\\\\\\\01_ExeApps\\\\\\\\Rozpisky\" -type f -name \"*.csproj\")", + "Bash(find \"D:\\\\\\\\Přesunuté\\\\\\\\300_Programování\\\\\\\\00_NET\\\\\\\\00_Csharp\\\\\\\\01_ExeApps\\\\\\\\Rozpisky\" -type f \\\\\\( -name \"*.xaml\" -o -name \"*.xaml.cs\" -o -name \"*.cs\" \\\\\\))", + "Bash(find \"D:\\\\\\\\Přesunuté\\\\\\\\300_Programování\\\\\\\\00_NET\\\\\\\\00_Csharp\\\\\\\\01_ExeApps\\\\\\\\Rozpisky\\\\\\\\Rozpisky\" -type f -name \"*.cs\" ! -path \"*/obj/*\")", + "Bash(find \"D:\\\\\\\\Přesunuté\\\\\\\\300_Programování\\\\\\\\00_NET\\\\\\\\00_Csharp\\\\\\\\01_ExeApps\\\\\\\\Rozpisky\\\\\\\\Rozpisky\" -name \"NahledWindow.xaml.cs\")", + "Bash(find \"D:\\\\\\\\Přesunuté\\\\\\\\300_Programování\\\\\\\\00_NET\\\\\\\\00_Csharp\\\\\\\\01_ExeApps\\\\\\\\Rozpisky\\\\\\\\Rozpisky\\\\\\\\Views\" -name \"*.xaml.cs\")", + "Bash(grep -v \"^.*\\\\\\\\.g\\\\\\\\.cs$\")", + "PowerShell(dotnet build \"D:\\\\P�esunut�\\\\300_Programov�n�\\\\00_NET\\\\00_Csharp\\\\01_ExeApps\\\\Rozpisky\" --nologo -v q)", + "PowerShell(Start-Sleep -Seconds 4; Add-Type -AssemblyName System.Windows.Forms; Add-Type -AssemblyName System.Drawing; $b = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds; $bmp = New-Object System.Drawing.Bitmap $b.Width, $b.Height; $g = [System.Drawing.Graphics]::FromImage\\($bmp\\); $g.CopyFromScreen\\($b.Location, [System.Drawing.Point]::Empty, $b.Size\\); $path = \"C:\\\\Users\\\\jomar\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\D--P-esunut--300-Programov-n--00-NET-00-Csharp-01-ExeApps-Rozpisky\\\\558d2d58-c486-4dcd-a406-0270aa5c30ac\\\\scratchpad\\\\rozpisky-main.png\"; $bmp.Save\\($path, [System.Drawing.Imaging.ImageFormat]::Png\\); $g.Dispose\\(\\); $bmp.Dispose\\(\\); $path)", + "PowerShell(Stop-Process -Name Rozpisky -Force -ErrorAction SilentlyContinue)", + "Bash(cp /d/Přesunuté/300_Programování/00_NET/XX_Podklady/WPF-DarkTheme-Kit/Themes/Colors.Dark.xaml /d/Přesunuté/300_Programování/00_NET/00_Csharp/01_ExeApps/Rozpisky/Rozpisky/Themes/Colors.Dark.xaml)", + "Bash(cp /d/Přesunuté/300_Programování/00_NET/XX_Podklady/WPF-DarkTheme-Kit/Themes/Metrics.xaml /d/Přesunuté/300_Programování/00_NET/00_Csharp/01_ExeApps/Rozpisky/Rozpisky/Themes/Metrics.xaml)", + "Bash(sed 's/AppTheme\\\\.Theming/Rozpisky.Theming/' /d/Přesunuté/300_Programování/00_NET/XX_Podklady/WPF-DarkTheme-Kit/Themes/Controls.xaml)", + "Bash(sed 's/AppTheme\\\\.Theming/Rozpisky.Theming/' /d/Přesunuté/300_Programování/00_NET/XX_Podklady/WPF-DarkTheme-Kit/Theming/Icon.cs)", + "Bash(sed 's/AppTheme\\\\.Theming/Rozpisky.Theming/' /d/Přesunuté/300_Programování/00_NET/XX_Podklady/WPF-DarkTheme-Kit/Theming/GridTheme.cs)", + "Bash(rm \"/d/Přesunuté/300_Programování/00_NET/00_Csharp/01_ExeApps/Rozpisky/Rozpisky/Behaviors/FillHandle.cs\")", + "PowerShell($exe = Get-ChildItem \"D:\\\\Přesunuté\\\\300_Programování\\\\00_NET\\\\00_Csharp\\\\01_ExeApps\\\\Rozpisky\\\\Rozpisky\\\\bin\\\\Debug\\\\net9.0-windows\" -Filter Rozpisky.exe | Select-Object -First 1; $p = Start-Process $exe.FullName -PassThru; Start-Sleep -Seconds 8; if \\($p.HasExited\\) { \"APP EXITED, code: $\\($p.ExitCode\\)\" } else { \"APP RUNNING \\(MainWindow title: $\\($p.MainWindowTitle\\)\\)\"; Stop-Process -Id $p.Id -Force -Confirm:$false })", + "PowerShell($exe = Get-ChildItem \"D:\\\\Přesunuté\\\\300_Programování\\\\00_NET\\\\00_Csharp\\\\01_ExeApps\\\\Rozpisky\\\\Rozpisky\\\\bin\\\\Debug\\\\net9.0-windows\" -Filter Rozpisky.exe | Select-Object -First 1; $p = Start-Process $exe.FullName -PassThru; Start-Sleep -Seconds 8; if \\($p.HasExited\\) { \"APP EXITED, code: $\\($p.ExitCode\\)\" } else { \"APP RUNNING \\(title: $\\($p.MainWindowTitle\\)\\)\"; Stop-Process -Id $p.Id -Force -Confirm:$false })", + "PowerShell($src = \"D:\\\\Přesunuté\\\\300_Programování\\\\00_NET\\\\XX_Podklady\\\\WPF-DarkTheme-Kit\"; $zip = \"D:\\\\Přesunuté\\\\300_Programování\\\\00_NET\\\\XX_Podklady\\\\WPF-DarkTheme-Kit.zip\"; if \\(Test-Path $zip\\) { Remove-Item $zip -Force }; Compress-Archive -Path $src -DestinationPath $zip -Force; $item = Get-Item $zip; \"ZIP: $\\($item.FullName\\)\"; \"Velikost: {0:N0} B\" -f $item.Length; Add-Type -AssemblyName System.IO.Compression.FileSystem; $z = [System.IO.Compression.ZipFile]::OpenRead\\($zip\\); $z.Entries | Select-Object -ExpandProperty FullName; $z.Dispose\\(\\))", + "PowerShell($src = \"D:\\\\Přesunuté\\\\300_Programování\\\\00_NET\\\\XX_Podklady\\\\WPF-DarkTheme-Kit\"; $zip = \"D:\\\\Přesunuté\\\\300_Programování\\\\00_NET\\\\XX_Podklady\\\\WPF-DarkTheme-Kit.zip\"; $staging = Join-Path $env:TEMP \"wdtk_stage\"; if \\(Test-Path $staging\\) { Remove-Item $staging -Recurse -Force }; New-Item -ItemType Directory -Path $staging | Out-Null; Copy-Item $src -Destination $staging -Recurse; Remove-Item \\(Join-Path $staging \"WPF-DarkTheme-Kit\\\\.claude\"\\) -Recurse -Force -ErrorAction SilentlyContinue; if \\(Test-Path $zip\\) { Remove-Item $zip -Force }; Compress-Archive -Path \\(Join-Path $staging \"WPF-DarkTheme-Kit\"\\) -DestinationPath $zip -Force; Remove-Item $staging -Recurse -Force; $item = Get-Item $zip; \"ZIP: $\\($item.FullName\\)\"; \"Velikost: {0:N0} B\" -f $item.Length; Add-Type -AssemblyName System.IO.Compression.FileSystem; $z = [System.IO.Compression.ZipFile]::OpenRead\\($zip\\); $z.Entries | Select-Object -ExpandProperty FullName; $z.Dispose\\(\\))", + "PowerShell(dotnet build Rozpisky\\\\Rozpisky.csproj -clp:ErrorsOnly -v q 2>&1)", + "Bash(xargs grep -l \"RelayCommand\\\\|class.*Command\")", + "Bash(xargs grep -l \"class RelayCommand\")" + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7dd509e --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# Build výstupy +bin/ +obj/ + +# Visual Studio +.vs/ +*.user +*.suo + +# Dočasné / pracovní +_render_ukazka/ +__verify/ +*.bak diff --git a/PODKLAD_CAD_Layout_Tisk.md b/PODKLAD_CAD_Layout_Tisk.md new file mode 100644 index 0000000..278c343 --- /dev/null +++ b/PODKLAD_CAD_Layout_Tisk.md @@ -0,0 +1,224 @@ +# Podklad: Práce s CADem, rozvržení a tisk + +> Výcuc funkcionality (bez kódu) pro převod VBA verze 1.0.8 do C#. +> Zaměřeno **čistě na práci s CADem, rozvržení (layouty) a tisk** – bez rozpisek. +> Popisuje funkcionalitu + použité ActiveX/COM API, které se bude převádět. + +--- + +## 1. Připojení na CAD (`clsCadLink`) + +Centrální objekt pro veškerou komunikaci s CADem. Vše ostatní jde přes něj (`cad.Doc.*`). + +**Funkcionalita:** +- **Late-binding** přes `GetObject(, ProgID)` – připojuje se POUZE na **již běžící** CAD, nic nespouští. +- Zkouší v pořadí: `AutoCAD.Application` → `ZWCAD.Application` → `BricscadApp.AcadApplication`. První, který běží, vyhraje. +- Po napojení na aplikaci si vezme `mApp.ActiveDocument`. Když CAD běží, ale není otevřený výkres → chyba. +- Drží: `App` (aplikace), `Doc` (aktivní dokument), `Engine` (který ProgID se chytil), `LastError`, `IsConnected`. + +**Pomocné metody nad dokumentem (volitelné, používá je generování):** +- `CheckLayer(name)` → existuje hladina? (`Doc.Layers(name)`) +- `AddLayer(name, color, lineWeight)` → `Doc.Layers.Add` +- `CheckBlock(name)` → existuje definice bloku? (`Doc.Blocks(name)`) +- `AddBlock(path)` → vloží blok ze souboru do ModelSpace (`InsertBlock`) jen kvůli načtení definice a hned referenci smaže. + +**Pro C#:** V .NET přes COM Interop (`Marshal.GetActiveObject("AutoCAD.Application")`) nebo silně typované `Autodesk.AutoCAD.Interop` (`AcadApplication`, `AcadDocument`). Pozor – `GetActiveObject` je v moderním .NET potřeba volat ručně přes `Marshal`. Pořadí ProgID zachovej jako fallback řetězec. + +--- + +## 2. Datové nosiče (čtení dat z Excelu, bez CADu) + +### `Layout` (data jednoho rozvržení) +Načítá řádek z listu **SEZNAM** + pojmenovanou buňku `stavba`. Drží metadata jednoho výkresu: +- `JmenoZakazka` (z named range `stavba`), `JmenoObjekt`, `JmenoRozvrzeni` (= název layoutu, sl. 28), `NazevPrilohy`, `MeritkoPrilohy` (sl. 23), `PocetPapiru`, `Ctb` (název CTB stylu, sl. 30). +- `InicializaceDat(radek)` načte tyto hodnoty z konkrétního řádku. +- Spojování hodnot oddělovačem (název + dílčí část) přes pomocnou funkci. + +### `NastaveniTiskarny` (držák tiskových hodnot) +Defaultní hodnoty tisku převedené z ActiveX konstant na **číselné literály** (kvůli late-bindingu): +- `Tiskarna` = `"DWG to PDF.pc5"`, `StyleSheet` = `"zwcad.ctb"` +- `PaperUnits = 1` (mm), `PlotRotation = 0`, `PlotType = 5` (Layout), `StandardScale = 16` (ac1_1, tj. 1:1 – pozor, AcPlotScale je enum, hodnota 1 by byla ac1_128in_1ft = 1:1536), `PlotViewportFirst = True`, `PlotOrigin = (0,0)`. +- `NastavRozmerPapiru(sirka, vyska)` → sestaví `CanonicalMediaName` jako `"420x297"` (z reálných rozměrů rámečku). + +**Pro C#:** Tohle jsou jednoduché DTO/POCO třídy. V C# můžeš vrátit silně typované enumy (`AcPlotType.acLayout` atd.) místo magických čísel, ale zachovej mapování: + +| Konstanta | Hodnota | Význam | +|---|---|---| +| PaperUnits mm | 1 | acMillimeters | +| Rotation 0° | 0 | ac0degrees | +| PlotType Layout | 5 | acLayout | +| PlotType Window | 4 | acWindow | +| Scale 1:1 | 1 | ac1_1 | +| Scale ToFit | 0 | acScaleToFit | + +--- + +## 3. Konfigurace tiskárny a papíru (`modPlotConfig`) + +**Funkcionalita:** +- **Cache do skrytého listu `_Plot`** (xlSheetVeryHidden): ukládá poslední zvolenou tiskárnu (`ConfigName`, B1) a papír (`MediaName`, B2). Při portu nahradíš nějakým config souborem / settings. +- **`TiskarnyZCad(cad)`** → seznam dostupných tiskáren: `cad.Doc.ActiveLayout.GetPlotDeviceNames`. +- **`PapiryZCad(cad, device)`** → seznam papírů pro danou tiskárnu. Trik: vytvoří dočasnou plot konfiguraci `Doc.PlotConfigurations.Add("__tmpQ", True)`, nastaví `configName = device`, zavolá `RefreshPlotDeviceInfo`, načte `GetCanonicalMediaNames` a dočasnou konfiguraci zase smaže. +- **`OveritKonfiguraci(...)`** → před tiskem ověří, že uložená tiskárna i papír reálně existují v aktuálním CADu (stejnou technikou). Vrací popis chyby. +- **`ZobrazPlotConfig`** → modální formulář pro výběr (UI – nahradíš WinForms/WPF dialogem). + +**Klíčové API:** `Layout.GetPlotDeviceNames`, `PlotConfigurations.Add/Item/Delete`, `PlotConfiguration.configName`, `.RefreshPlotDeviceInfo`, `.GetCanonicalMediaNames`. + +--- + +## 4. Aktualizace / úprava rozvržení (`modAktualizace`) — JÁDRO + +Hlavní procedura `TestAktualizace`. Podle vybraného rozsahu řádků na listu SEZNAM upraví odpovídající layouty ve výkresu. + +**Tok funkcionality:** +1. **Ochranné podmínky:** musí běžet na listu SEZNAM, výběr musí začínat řádkem ≥ 2. +2. Načte pole `Layout` objektů z vybraných řádků. +3. Připojí se na CAD (`clsCadLink`). +4. **Sestaví seznam všech layoutů** ve výkresu (`Doc.Layouts`), pro každý `Name` a `TabOrder`, a **seřadí podle TabOrder** (bubble sort). Pozn.: `Layouts.Count - 1` = počet rozvržení bez modelového prostoru. +5. **Kontroly počtu:** rozsah nesmí být větší než počet layoutů ani než počet zbývajících layoutů od aktivního. +6. **Aktivní layout nesmí být "Model"** – jinak vyzve uživatele aby aktivoval rozvržení. Začíná se od `ActiveLayout.TabOrder`. +7. **Dvoufázové přejmenování (kvůli konfliktům jmen):** nejdřív přejmenuje cílové layouty na **dočasné náhodné názvy** (`GenerateSecureAlphaNumeric(15) & i`), aby se předešlo kolizi při finálním přejmenování. +8. **Hlavní smyčka** přes layouty podle TabOrder (s progress formulářem + možnost zrušit): + - Přejmenuje layout na cílový `JmenoRozvrzeni` (chráněno error handlerem). + - **Automatické vyhodnocení měřítka** (pokud zapnuto named range `MERITKOAUTOMATICKY`) – viz níže. + - **Projde všechny entity v `Layout.Block`** a hledá blokové reference (`blk.ObjectName = "AcDbBlockReference"`): + - **Blok `vykres_hlavicka`** → pokud `HasAttributes`, projde `GetAttributes` a podle `TagString` zapíše hodnoty: `STAVBA`, `OBJEKT`, `PRILOHA`, `MERITKO` (formátuje jako `"M 1:500"` jen když obsahuje `"1:"`). Po změně `TextString` zavolá `AttList(k).Update`. + - **Blok `ramecek`** → pokud je dynamický (`IsDynamicBlock`), `GetBoundingBox Poc, Kon` → z rozměrů spočítá **počet papírů**: `delka = RoundUp(Kon(0)/210)`, `vyska = RoundUp(Kon(1)/297)`, `PocetPapiru = delka*vyska`, a nastaví formát papíru (`NastavRozmerPapiru`). + - **Nastavení tiskárny na layout** (pokud zapnuto named range `NASTAVENITISKARNY = 1`): zapíše do layoutu `ConfigName, CanonicalMediaName, PaperUnits, PlotOrigin, PlotRotation, PlotType, StandardScale, PlotViewportsFirst, StyleSheet`. Pokud je vyplněn vlastní CTB, použije `Ctb & ".ctb"`. +9. **Zápis zpět do Excelu:** počet papírů (sl. 24) a měřítka (sl. 23) zpět do listu SEZNAM. + +### Vyhodnocení měřítka z výřezů (`VyhodnotMeritka`) +- Projde entity layoutu a hledá **viewporty** (`ObjectName = "AcDbViewport"`) v hladině **`!!NOPRINT`**. +- Z `viewport.CustomScale` spočítá jmenovatel měřítka: `jmenovatel = Round((1/CustomScale) * jednotkyFaktor)`. +- `jednotkyFaktor` podle systémové proměnné `INSUNITS` (`Doc.GetVariable("INSUNITS")`): 4 = mm (1), 6 = m (1000). +- Sesbírá unikátní měřítka, seřadí vzestupně, vrátí např. `"1:500, 1:1000"`. +- **Pozor (zjištěno při portu):** blok layoutu obsahuje kromě nakreslených výřezů i neviditelný + pseudoviewport „pohledu na papír“ (DXF VIEWPORT id 1; vzniká při aktivaci layoutu a kopíruje se + s layoutem, může ležet i v hladině `!!NOPRINT` a kdekoliv v pořadí bloku). Jeho `CustomScale` + je aktuální zoom → falešná měřítka (u výkresů v metrech typicky 1:1000). Jednoznačná identifikace: + aktivovat layout, vypnout `MSpace` a přečíst `Doc.ActivePViewport.Handle` – to je on (ověřeno na + AutoCADu). Nouzová heuristika bez aktivace: pseudoviewport má `StandardScale = 2` (`acVp1_1`) + trvale zamrzlé; skutečné výřezy s měřítkem ze seznamu mají `1` (`acVpCustomScale`) – heuristika + by ale zahodila i skutečný výřez nastavený přes enum na 1:1. + +**Pro C# – nejdůležitější API této části:** +- `Doc.Layouts` (kolekce), `Layout.Name`, `.TabOrder`, `.Block` (iterace entit). +- Entita: `.ObjectName` (`"AcDbBlockReference"`, `"AcDbViewport"`), `.Name`, `.IsDynamicBlock`, `.HasAttributes`, `.GetAttributes()`, `.GetBoundingBox(out min, out max)`, `.Layer`, `.CustomScale`. +- Atribut: `.TagString`, `.TextString`, `.Update()`. +- Layout plot props: `.ConfigName, .CanonicalMediaName, .PaperUnits, .PlotOrigin, .PlotRotation, .PlotType, .StandardScale, .PlotViewportsFirst, .StyleSheet`. +- `Doc.GetVariable("INSUNITS")`. +- **Pozor na late-bound rozdíl:** ve verzi 1.0.7 (ZWCAD) se typ poznával přes `TypeName(x)="IZcadBlockReference"`. Tady se to dělá robustněji přes `x.ObjectName`. V C# se silně typovaným interopem můžeš použít `is AcadBlockReference` / `is AcadPViewport`, ale `ObjectName` je univerzálnější napříč enginy. + +--- + +## 5. Tisk rozvržení do PDF (`modTiskPriloh`) + +`TiskPrilohyDoPdf` – hromadný tisk vybraných layoutů do PDF souborů. + +**Tok:** +1. Ochranné podmínky (list SEZNAM, řádek ≥ 2), připojení CAD. +2. **Připraví cílovou složku** exportu. +3. Sestaví seznam názvů layoutů k tisku (sl. 28), prázdné přeskočí. +4. **Zazálohuje a přenastaví systémové proměnné** výkresu: + - `BACKGROUNDPLOT` → 0 (tisk na popředí = čeká se na dokončení – důležité pro spolehlivost!). + - `PLOTTRANSPARENCYOVERRIDE` → 2 (ignorovat průhlednost). + - `LTSCALE` – ukládá originál, volitelně přenastaví dle named range `LTSCALE` a hodnoty z buňky (sl. 29) per řádek (s validací: prázdné/nečíselné/≤0 → 1). +5. **Smyčka tisku** (progress + cancel): + - Cesta PDF = `složka & nazev & ".pdf"`. + - **Kontrola, zda PDF není otevřené** (`IsFileOpen`) → dialog Abort/Retry/Ignore. + - Najde layout `Doc.Layouts(nazev)`, neexistuje → přeskočí. + - Nastaví LTSCALE. + - **Aktivuje layout** (`Doc.ActiveLayout = Layout`) a **vytiskne** (`Doc.Plot.PlotToFile cesta`). + - Error handling per soubor, počítá vytisknuto/přeskočeno. +6. **Obnoví** původní systémové proměnné. + +**Klíčové API:** `Doc.GetVariable/SetVariable`, `Doc.Layouts(name)`, `Doc.ActiveLayout = layout`, `Doc.Plot.PlotToFile(path)`. + +--- + +## 6. Tisk bloku oknem (`modPrint`) + +Dvě varianty tisku jednotlivého bloku podle jeho bounding boxu (window plot): +- **`VytiskniRozpisku`** → `Doc.Plot.PlotToDevice` (na zařízení). +- **`VytiskniRozpiskuDoSouboru`** → `Doc.Plot.PlotToFile(cesta)` (do souboru, nastaví `BACKGROUNDPLOT=0`). + +**Postup nastavení layoutu pro window-plot:** +1. `blk.GetBoundingBox(min, max)` → rohy okna. +2. Na `ActiveLayout`: `ConfigName`, `RefreshPlotDeviceInfo`, `CanonicalMediaName`, `PlotRotation = 0`, `PlotType = 4` (acWindow), `SetWindowToPlot(ll, ur)`, `CenterPlot = True`, `UseStandardScale = True`, `StandardScale = 0` (acScaleToFit), `PlotWithPlotStyles = True`, `StyleSheet = ""`, `PlotViewportBorders = False`, `PlotHidden = False`. +3. Tisk. + +**Pro C#:** `SetWindowToPlot` bere dvě 2-prvková `double[]` pole (lower-left, upper-right). Pozor na předávání polí přes COM (varianty). + +--- + +## 7. Čtení dat / atributů z CADu + +### Vyhledání bloků v ModelSpace (`modRozpisky.NajdiRozpisky`) +Obecný vzor procházení výkresu (použitelný i mimo rozpisky): +- `cad.Doc.ModelSpace` → iterace `For Each ent In ms`. +- Filtr: `ent.ObjectName = "AcDbBlockReference"` a porovnání názvu. +- **Název bloku včetně dynamických:** zkusí `EffectiveName`, fallback `Name` (`NazevBloku`). +- Čte `insertionPoint` (pole `[x,y,z]`), filtruje X > 0, sbírá do kolekce. +- **Seřazení podle X** (index sort) vzestupně. +- Progress každých 50 entit + možnost zrušit (vyhozením vlastní chyby `vbObjectError + 100`). + +### Výpis atributů (`modVypisAtributu`) +Diagnostika – pro daný blok: +- `blk.insertionPoint`. +- `blk.HasAttributes` → `blk.GetAttributes` (proměnné/vyplnitelné) → `TagString` + `TextString`. +- `blk.GetConstantAttributes` (konstantní, jen pro info). + +**Klíčové API:** `Doc.ModelSpace` (iterovatelná kolekce), `entity.ObjectName`, `.EffectiveName/.Name`, `.InsertionPoint`, `.HasAttributes`, `.GetAttributes()`, `.GetConstantAttributes()`. + +--- + +## 8. Pomocné funkce (`Funkce`) — bez CADu + +- `TurnOffStuff` / `TurnOnStuff` – vypnutí/zapnutí přepočtu, událostí, překreslování Excelu (zrychlení). V C# přes Excel interop nebo to vynecháš. +- `VratZnakNeboX` – ořez/doplnění textu na pevnou délku. +- `GetValueFromTable` – vyhledávání v Excel ListObject tabulce dle klíče (jako VLOOKUP). +- **`IsFileOpen`** – zjistí, zda je soubor zamčený jiným procesem (otevře `Binary Access Read Lock Read`, chyba 70 = otevřeno). V C# → `try` na `FileStream` s `FileShare.None`. +- **`VybratCestuKeSlozce`** – dialog výběru složky. V C# → `FolderBrowserDialog`/`OpenFolderDialog`. + +--- + +## 9. Poznámky pro převod do C# + +1. **Late-binding → typed interop:** VBA tu používá `As Object` + late-binding kvůli podpoře více CADů (AutoCAD/ZWCAD/BricsCAD). V C# zvážit: buď `dynamic` (zachová multi-engine flexibilitu), nebo `Autodesk.AutoCAD.Interop` (typová bezpečnost, ale váže tě na AutoCAD). Detekce typu entit přes `.ObjectName` (string) funguje univerzálně napříč enginy – doporučuji ponechat. +2. **Magická čísla** plot konstant (viz tabulka v sekci 2) – v C# nahraď enumy z interopu, ale ověř hodnoty proti cílovému CADu (komentář v `NastaveniTiskarny` na to upozorňuje). +3. **Pole přes COM:** `GetBoundingBox`, `GetAttributes`, `InsertionPoint`, `PlotOrigin`, `SetWindowToPlot` pracují s `object`/`Variant` poli `double[]`. V C# je třeba je správně boxovat/castovat (`(double[])`, `out object`). +4. **Systémové proměnné** se čtou/zapisují přes `Doc.GetVariable/SetVariable` – stejné názvy (`BACKGROUNDPLOT`, `PLOTTRANSPARENCYOVERRIDE`, `LTSCALE`, `INSUNITS`). Vždy zazálohovat a obnovit. +5. **`BACKGROUNDPLOT = 0`** je nutný pro synchronní tisk (jinak `PlotToFile` nečeká na dokončení a soubory mohou být nedokončené). +6. **Plot konfigurace** se vytváří/maže jako dočasné objekty (`__tmpQ`) – v C# obal do `try/finally`, ať se vždy uklidí. +7. **Iterace `Layout.Block`** vrací modelspace/paperspace entity daného layoutu – v typed interopu `AcadLayout.Block` je `AcadBlock`. +8. Zdroj dat (list SEZNAM, named ranges `stavba`, `MERITKOAUTOMATICKY`, `NASTAVENITISKARNY`, `LTSCALE`) je dnes Excel – při portu rozhodni, odkud je vezme nová appka (DB/JSON/UI). +9. **Celočíselné systémové proměnné přes `SetVariable` posílat jako `short` (VT_I2):** VBA `Integer` + je 16bitový, .NET `int` se přes COM marshaluje jako VT_I4 – a AutoCAD na + `SetVariable("PLOTTRANSPARENCYOVERRIDE", 2)` s VT_I4 **spadl nativně** (fatal error bez výjimky, + bez error.log; lokalizováno breadcrumb logem `tisk_diag.log`, 2026-07-05). V C# proto `(short)0`, + `(short)2` apod.; `LTSCALE` je RTREAL → `double` je správně. Navíc: zápis PLOTTRANSPARENCYOVERRIDE + se přeskočí, když už cílovou hodnotu má, selhání téhle kosmetické proměnné tisk nezastaví (vlastní + try/catch) a při obnově se vrací jen proměnné, které se skutečně změnily + (`CadTiskService.VytiskniRozvrzeni`). **Stejná třída problému: `Doc.Layouts.Item(neexistující + jméno)`** – místo chytatelné výjimky nativní pád aplikace (2026-07-05). Layout se proto hledá + výčtem kolekce `Layouts` a porovnáním `Name` (`CadTiskService.NajdiLayout`); obecně na COM + rozhraní CADu **nestavět control flow na vyhazujících voláních** – tam, kde jde výsledek zjistit + výčtem/porovnáním, udělat to tak. +10. **Odchylka od VBA – rozměr rámečku:** originál (§4, bod `ramecek`) čte rozměr přes `GetBoundingBox`. C# port to **záměrně nedělá** – bounding box je nespolehlivý (závisí na tom, co je v bloku zrovna vykreslené/viditelné). Blok `ramecek` je dynamický se dvěma viditelnostmi (`Benefit`/`Libovolný`); port čte rozměr přímo z dynamických parametrů `GetDynamicBlockProperties()` – dvojice `VzdálenostBx`/`VzdálenostBy` pro viditelnost `Benefit`, `VzdálenostLx`/`VzdálenostLy` pro `Libovolný`. Aktivní viditelnost se pozná podle toho, která vlastnost má aktuální hodnotu rovnou `"Benefit"`/`"Libovolný"` (viz `CadLayoutService.NajdiViditelnost`), ne podle názvu vlastnosti viditelnosti samotné (ten nemusí být `Visibility1`). + +--- + +## 10. Mapa souborů (kde co hledat) + +| Soubor | Odpovídá za | +|---|---| +| `clsCadLink.cls` | Připojení k CADu, helpery pro hladiny a bloky | +| `Layout.cls` | Data jednoho rozvržení (čtení ze SEZNAM) | +| `NastaveniTiskarny.cls` | Default hodnoty tisku (DTO) | +| `modPlotConfig.bas` | Seznam tiskáren/papírů, ověření, cache `_Plot` | +| `modAktualizace.bas` | **Jádro** – úprava layoutů, atributů, měřítka, počtu papírů | +| `modTiskPriloh.bas` | Hromadný tisk layoutů do PDF | +| `modPrint.bas` | Window-plot jednoho bloku (na device / do souboru) | +| `modRozpisky.bas` | Vyhledávání bloků v ModelSpace | +| `modVypisAtributu.bas` | Diagnostický výpis atributů bloku | +| `Funkce.bas` | Sdílené pomocné funkce (Excel/IO, bez CADu) | diff --git a/ROZHRANI.md b/ROZHRANI.md new file mode 100644 index 0000000..c0a0160 --- /dev/null +++ b/ROZHRANI.md @@ -0,0 +1,408 @@ +# Rozpisky – rozhraní aplikace, datový model a budoucí funkcionality + +Tento dokument popisuje **standalone aplikaci Rozpisky** z pohledu uživatele a dat: jaké má +obrazovky, co se v nich vyplňuje, jaké akce nabízí a jak je vnitřně uspořádaný datový model. +Navazuje na [`ROZPISKY.md`](ROZPISKY.md), který popisuje **vykreslovací/exportní jádro** +(kreslicí rozhraní `IProfileRenderer`, čtečka DXF šablony `DxfTemplate`, exporty PNG/PDF/DXF). + +Aplikace je **standalone náhrada za původní excelový nástroj „Rozpisky 1.0.8"**. Z něj vychází +veškerá logika rozhraní i datový model. Tento dokument je proto současně i **přepisem původního +excelu** do podoby specifikace pro samostatnou aplikaci. + +> **Styl WPF se zde neřeší** – popisujeme rozhraní funkčně (obrazovky, pole, akce, tok dat). +> Vizuální styl bude dodán samostatně. + +--- + +## 1. Účel a vztah k `ROZPISKY.md` + +| Dokument | Co popisuje | +|---|---| +| [`ROZPISKY.md`](ROZPISKY.md) | **Jádro** – jak se kreslí a exportuje (DXF → obrazovka / PNG / PDF / DXF). | +| `ROZHRANI.md` (tento) | **Aplikace** – uživatelské rozhraní, datový model (projekt + seznam příloh), akce a roadmapa. | +| [`SZ_SM011_P10_Manual_v6.md`](SZ_SM011_P10_Manual_v6.md) | **Závazný manuál SŽ** (v06, 26. 1. 2026) – struktura dokumentace, **kódové označení** (kap. 3) a **popisové pole / pravidla vyplnění** (kap. 4). Autoritativní zdroj pro význam polí a kódu. | + +**Princip:** Uživatel jednou vyplní **údaje projektu** (společné všem výkresům) a postupně plní +**seznam příloh** (jeden řádek = jeden výkres = jedna rozpiska). Aplikace každý řádek spojí +s údaji projektu, naplní pole DXF šablony a umí jej zobrazit (náhled) a vyexportovat/vytisknout. + +**Standalone-first:** aplikace nevyžaduje AutoCAD. Vstup je **DXF šablona + data**, výstup +**PNG / PDF / DXF** (engine z `ROZPISKY.md`). Integrace s AutoCADem (interop do `.dwg`, rozvržení, +CTB, tisk plotterem) je vedena **jen jako budoucí rozšíření** – viz [sekce 8](#8-roadmapa-budoucích-funkcionalit). + +--- + +## 2. Slovník pojmů + +| Pojem | Význam | +|---|---| +| **Rozpiska** | Rohové razítko výkresu – tabulka s údaji o projektu, příloze, autorech a revizích. | +| **Příloha** | Jeden výkres / list dokumentace. V seznamu = jeden řádek. | +| **Seznam příloh** | Tabulka všech příloh projektu (původní list `SEZNAM`). | +| **Rozvržení (layout)** | Pojmenované rozvržení výkresu (v AutoCADu paper-space layout). Jméno se generuje z identifikace přílohy. | +| **Orientační schéma** | Malé schéma v rozpisce naznačující polohu listu v rámci stavby (buňky `K1`–`K47`). | +| **Placeholder loga** | Vyhrazené místo v šabloně pro logo (objednatele/zhotovitele). Leží na netisknutelné hladině. | +| **Číselník** | Předvyplněný seznam hodnot (organizace, firmy, jména, profese, …) pro výběr v polích. | +| **Projektové pole** | Hodnota společná celému projektu (z údajů projektu). | +| **Řádkové pole** | Hodnota specifická pro jednu přílohu (ze seznamu příloh). | + +--- + +## 3. Datový model + +Model 1:1 odpovídá listům původního excelu. Entity: + +### 3.1 Projekt (původní list `ÚDAJE`) + +Údaje společné všem rozpiskám projektu. Část polí se **automaticky dohledává z číselníků** +(v excelu přes `VLOOKUP`). + +| Pole | Popis | Zdroj | +|---|---|---| +| `stavba` | Název stavby / akce | ruční | +| `HIP` | Hlavní inženýr projektu | ruční | +| `investor` | Objednatel zakázky | číselník Organizace | +| `investorAdresa` | Adresa objednatele | **auto** z č. Organizace | +| `slozkaSZ` | Složka SŽ (zástupce objednatele) | ruční / číselník | +| `slozkaSZAdresa` | Adresa složky SŽ | **auto** z č. Organizace | +| `skod` | S-kód (číslo smlouvy dle SoD) | ruční | +| `cisloZakazky` | Číslo zakázky | ruční | +| `stupenDokumentace` | Stupeň dokumentace (např. DOS) | číselník Verze dokumentace | +| `smluvniDatumZpracovani` | Smluvní datum zpracování | ruční (datum) | +| `zhotovitelSOD` | Zhotovitel díla dle SoD | číselník Firmy | +| `adresaSOD` | Adresa zhotovitele | **auto** z č. Firmy | +| `telSOD` | Telefon zhotovitele | **auto** z č. Firmy | +| `emailSOD` | E-mail zhotovitele | **auto** z č. Firmy | + +### 3.2 Příloha (řádek v seznamu, původní list `SEZNAM`) + +Sloupce A–AD; jeden řádek = jedna rozpiska. Souhrn: + +| Sl. | Obsah | Sl. | Obsah | +|---|---|---|---| +| A | Označení části | O | Kontroloval (R1) | +| B | Označení dílčí části / řady | P–U | R2–R4 + kdo revidoval | +| C | Název objektu / dílčí části | V | Zhotovitel části | +| D | Číslo objektu / komplexu | W | Měřítko | +| E | Číslo přílohy – typ | X | Formát × A4 | +| F | Číslo přílohy – dílčí | Y | Kraj | +| G | Číslo přílohy – pořadí | Z | Katastrální území | +| H | Název přílohy | AA | TUDU | +| I | Název dílčí části přílohy | AB | **Jméno rozvržení** (generováno) | +| J | Zkratka přílohy | AC | LTSCALE | +| K | Vypracoval | AD | CTB (styl tisku) | +| L | Odpovědný projektant | | | +| M | Specialista | | | +| N | Revize 1 (R1) | | | + +> **Jméno rozvržení** (`AB`) je **poloautomatické**, řízené zaškrtávacím polem **Příloha objektu** +> (první sloupec seznamu, výchozí = zaškrtnuto): +> - **zaškrtnuto** → jméno se generuje dle manuálu SŽ **kap. 2.7.7.9** (číslo objektu bez teček, +> mezer a pomlček; složky podobjekt / typ / dílčí / pořadí přílohy oddělené `_`): +> `SO131.45.01` + `D1` + `1` + `001` = `SO1314501_D1_1_001`; u podobjektu `SO1314501_01_D1_1_001`; +> u skupiny `SK11311_D1_1_001`. Needituje se; +> - **odškrtnuto** → uživatel zadá jméno ručně (při přepnutí se předvyplní vygenerovanou hodnotou). +> +> Slouží jako jméno layoutu / základ názvu exportovaného souboru. Řádky se shodným jménem rozvržení +> (kolize názvu exportu) se v seznamu zvýrazní. +> +> Samostatné zaškrtávací pole **Rozpiska** (výchozí = zaškrtnuto) řídí, zda název PDF při exportu +> dostane příponu `_rozpiska` (např. `SO1314501_D1_1_001_rozpiska.pdf`). Je nezávislé na polích +> **Příloha objektu** a **Desky objektu** – i rozpiska na spisové desky objektu může příponu dostat, +> pokud je pole zaškrtnuté. + +### 3.3 Revize (původní list `REVIZE`) + +Tabulka revizí: **REVIZE** (kód/číslo verze, např. `000`), **DATUM**, **POPIS**, **KONTROLOVAL**. +Na revize se odkazují řádkové revizní sloupce přílohy (R1–R4) a revizní pole v rozpisce. + +> **Revize jsou interní data projektu** – patří vždy ke **konkrétní zakázce**, ukládají se spolu +> s projektem (ne do externí číselníkové databáze, viz [3.4](#34-číselníky)). Pravidla vyplnění +> revizí popisuje manuál SŽ, kap. 4.3.4 (viz [3.7](#37-kódové-označení-přílohy-47-pozic-pole-k1k47)). + +### 3.4 Číselníky + +| Číselník | Sloupce | Použití | +|---|---|---| +| **Organizace** | název, adresa | objednatel + složka SŽ (auto adresy) | +| **Firmy / zhotovitelé** | firma, adresa, telefon, e-mail | zhotovitel díla i objektu (auto kontakty) | +| **Jména** | jméno | vypracoval / odpovědný / specialista / kontroloval | +| **Profese** | profese | profesní zařazení | +| **Verze dokumentace** | verze | stupeň dokumentace | +| **Části** | označení, název části | části/objekty v seznamu | + +> **Číselníky jsou sdílená data napříč projekty a žijí v samostatné databázi vedle `.exe`.** +> V původním Excelu šlo o samostatné listy s daty (označení dokumentace, data firem apod.). +> Ve standalone aplikaci se z nich stane **externí databázový soubor uložený vedle spustitelného +> souboru** (např. `cisleniky.db` / `.json` ve složce aplikace), aby ho šlo **průběžně doplňovat +> a sdílet** mezi projekty bez zásahu do aplikace. (Na rozdíl od revizí, které jsou interní +> k zakázce – viz [3.3](#33-revize-původní-list-revize).) + +### 3.5 Konfigurace + +| Položka | Popis | +|---|---| +| `CestaExportu` | Kořenová cesta pro export (např. `C:\temp`). | +| `SlozkaExportu` | Podsložka exportu. | +| `MERITKOAUTOMATICKY` | Automatické měřítko. | +| `LTSCALE` | Měřítko typů čar (per výkres). | +| CTB | Styl tisku (per výkres). | +| Nastavení tiskárny | Pro tiskové akce. | + +> Tato konfigurace **nejsou pole rozpisky** – řídí export/tisk a generování rozvržení. + +### 3.6 Mapování `pole aplikace ↔ DXF ATTDEF tag` + +Šablona [`Rozpiska.dxf`](Rozpiska.dxf) obsahuje **101 polí (`ATTDEF`)**. Tag pole = klíč do +`values` při vyplnění (viz `DxfTemplate.Replay(g, values)` v `ROZPISKY.md`). Mapování na zdroj dat: + +**Projektová pole (z údajů projektu):** + +| DXF tag | Zdroj | +|---|---| +| `NAZEV_AKCE` | `stavba` | +| `SO_HIP` | `HIP` | +| `OBJEDNATEL_NAZEV` | `investor` | +| `OBJEDNATEL_ADRESA` | `investorAdresa` | +| `OBJEDNATEL_ZASTUPCE_NAZEV` | `slozkaSZ` | +| `OBJEDNATEL_ZASTUPCE_ADRESA` | `slozkaSZAdresa` | +| `S_KOD` | `skod` | +| `ZAK_CISLO` | `cisloZakazky` | +| `STUP_DOK` | `stupenDokumentace` | +| `DATUM` | `smluvniDatumZpracovani` | +| `ZHOTOVITEL_DILA_NAZEV` | `zhotovitelSOD` | +| `ZHOTOVITEL_DILA_ADRESA` | `adresaSOD` | +| `ZHOTOVITEL_DILA_TELEFON` | `telSOD` | +| `ZHOTOVITEL_DILA_EMAIL` | `emailSOD` | + +**Řádková pole (z přílohy / seznamu).** Význam upřesněn dle grafické podoby popisového pole +(manuál SŽ, kap. 4.2.1 a 4.3.7): + +| DXF tag | Význam / zdroj | +|---|---| +| `CAST` | Označení části dokumentace (např. `D`) – SEZNAM A | +| `CAST_NAZEV` | Název části / profesní skupina (např. „Dokumentace objektů") | +| `OBJEKT_NAZEV` | Název objektu / dílčí části – SEZNAM C | +| `RADA` | **řada** objektu (např. `SO131`) – SEZNAM B | +| `USEK` | **úsek** – složka označení objektu (kap. 2.5 / 3.2.4) | +| `RAZENI` | **řazení** – složka označení objektu (kap. 2.5 / 3.2.4) | +| `PODOBJEKT` | **podobjekt** (např. `01`) – kap. 3.2.5 | +| `DILCI_CAST` | dílčí část / řada přílohy (např. `D130`) | +| `TYP` | typ přílohy (např. `D.1`) – SEZNAM E | +| `CISLO_PRILOHY` | číslo přílohy (3 cifry, např. `003`) – SEZNAM G | +| `PRILOHA` | Název přílohy – SEZNAM H | +| `PRILOHA_CAST` | Název dílčí části přílohy – SEZNAM I | +| `SO_VYPRACOVAL_PRILOHA` | Zpracovatel přílohy – SEZNAM K | +| `SO_ZODP_PROJEKTANT` | Odpovědný projektant – SEZNAM L | +| `SO_SPECIALISTA` | Specialista – SEZNAM M | +| `MERITKO` | Měřítko – SEZNAM W | +| `FORMATY` | Formáty (× A4) – SEZNAM X | +| `KRAJ` | Kraj – SEZNAM Y | +| `KATASTRALNI_UZEMI` | Katastrální území – SEZNAM Z | +| `TUDU` | TUDU – SEZNAM AA | +| `ZHOTOVITEL_OBJEKTU_NAZEV` | Zhotovitel části / objektu – SEZNAM V | +| `ZHOTOVITEL_OBJEKTU_ADRESA/TELEFON/EMAIL` | **auto** z č. Firmy podle `V` | + +> Čtveřice `RADA` / `USEK` / `RAZENI` / `PODOBJEKT` tvoří dohromady **označení objektu** +> (např. `SO131 .15 .12 .01`); přesné rozčlenění čísla objektu řeší manuál kap. 2.5 a 3.2.4. + +**Revizní pole (z přílohy R1–R4 + list `REVIZE`):** + +Až **4 revizní řádky** (sloupce *Revize / Datum / Popis / Kontroloval*, manuál kap. 4.3.4), +plněné z interní tabulky revizí ([3.3](#33-revize-původní-list-revize)): + +| DXF tag | Zdroj | +|---|---| +| `REVIZE1CISLO`..`4CISLO` | číslo / kód verze revize (např. `000`) | +| `REVIZE1DAT`..`4DAT` | datum revize | +| `REVIZE1`..`REVIZE4` | popis revize | +| `SO_KONTROLOVAL1`..`4` | kdo kontroloval | + +**Strojově čitelný kód:** `K1`–`K47` = **47 pozic kódového označení přílohy** (manuál kap. 3.1.5), +zobrazených znak po znaku v popisovém poli. **Negenerují se ručně – aplikace je sestaví** z ostatních +polí (S-kód, stupeň dokumentace, část, objekt, podobjekt, typ, příloha, revize) – viz +[3.7](#37-kódové-označení-přílohy-47-pozic-pole-k1k47). + +**Orientační schéma:** samostatné **grafické pole** (pole 2, manuál kap. 4.3.2) – schéma stavby +s barevným zvýrazněním polohy objektu; **není to `ATTDEF`**, ale obrazová oblast. + +**Loga:** `Rozpiska_logo1`–`Rozpiska_logo5` – **nejsou `ATTDEF`**, ale geometrické placeholdery +na netisknutelných hladinách (viz [sekce 6](#6-loga-a-orientační-schéma)). + +> **Pozn. k mapování:** Význam polí byl upřesněn dle **manuálu SŽ** (kap. 3 a 4) – původní excelová +> makra (VBA) se v `.xlsx` nedochovala, ale grafická podoba a pravidla vyplnění popisového pole jsou +> v manuálu závazné. Skupiny hladin `Rozpiska_pole_1`–`8` odpovídají různým stylům (velikost/zarovnání) +> textu polí – viz [sekce 7](#7-metadata-polí-zalamování-styl-víceřádkovost). + +### 3.7 Kódové označení přílohy (47 pozic, pole `K1`–`K47`) + +Strojově čitelný kód (manuál SŽ kap. 3) má **pevných 47 pozic** rozdělených do 6 skupin; v rozpisce +se zobrazuje znak po znaku v polích `K1`–`K47`. **Aplikace ho generuje** z ostatních polí, ručně se +neopravuje. Neobsazená alfanumerická pozice = `X`, oddělovač = `_`. + +| Skupina | Pozice | Význam | Zdroj polí | +|---|---|---|---| +| 1 | 1–11 | Identifikace stavby (S-kód / označení investora) | `S_KOD` | +| 2 | 13–16 | Stupeň dokumentace (4 znaky, např. `DPSX`) | `STUP_DOK` | +| 3 | 18–21 | Část / číselná řada (`D` + řada) | `CAST`, `RADA` | +| 4 | 23–34 | Objekt + podobjekt (`SO`/`PS` + číslo + podobjekt) | `RADA`,`USEK`,`RAZENI`,`PODOBJEKT` | +| 5 | 36–43 | Typ přílohy + číslo přílohy (`D1`…`_YYY`) | `TYP`, `CISLO_PRILOHY` | +| 6 | 45–47 | Verze / revize (`P`/`0`/`V` + pořadí) | `REVIZEnCISLO` | + +Příklad (manuál kap. 4.2.1): +`S123456789X _ DPSX _ D130 _ SO131_15_12 _ 01 _ D1 _ 2 _ 003 _ 000` +(v rozpisce bez mezer, každý znak v jedné buňce `K1`–`K47`). + +> Detailní pravidla pozic jsou v manuálu kap. 3.2.1–3.2.8; generátor kódu je proto vlastní +> funkční blok aplikace (vstup = strukturovaná pole přílohy, výstup = 47 znaků). + +--- + +## 4. Uživatelské rozhraní + +Popsáno funkčně (bez vizuálního stylu). + +### 4.1 Hlavní okno + +Sekce odpovídající původním listům excelu + panel akcí: + +- **Údaje projektu** – formulář (viz 4.2). +- **Seznam příloh** – mřížka (viz 4.3). Hlavní pracovní plocha. +- **Revize** – tabulka revizí projektu. +- **Číselníky** – správa hodnot (organizace, firmy, jména, profese, verze, části). +- **Nastavení** – cesty exportu, šablona, tisk/konfigurace. + +### 4.2 Formulář „Údaje projektu" + +Pole dle [sekce 3.1](#31-projekt-původní-list-údaje). Výběr objednatele / zhotovitele z číselníku +**automaticky doplní** adresu a kontakty (náhrada excelového `VLOOKUP`). + +### 4.3 Mřížka „Seznam příloh" + +- Tabulka (DataGrid), kde **jeden řádek = jedna rozpiska**; sloupce dle [sekce 3.2](#32-příloha-řádek-v-seznamu-původní-list-seznam). +- Vybraná pole nabízejí výběr z **číselníků** (jména, firmy, kraj, části…). +- **Editace dat probíhá přímo v mřížce.** +- Sloupec **Jméno rozvržení** je poloautomatický – viz [sekce 3.2](#32-příloha-řádek-v-seznamu-původní-list-seznam) + (řízeno polem **Příloha objektu**); duplicitní jména se zvýrazní. + +### 4.4 Náhled rozpisky + +- **Náhled se otevírá dvojklikem na řádek** seznamu → otevře se **samostatné okno** s náhledem + dané rozpisky. +- Náhled vykresluje engine z `ROZPISKY.md` (`IProfileRenderer` / `SkiaProfileRenderer`) – + živě, ve výkresových milimetrech. +- Okno umožní přepnout: **vyplněné hodnoty** (`Replay(g, values)`) ↔ **předpis / názvy polí** + (`Replay(g)`). +- Z okna náhledu lze danou rozpisku rovnou vyexportovat / vytisknout. + +--- + +## 5. Funkcionality / akce + +Přehled vychází z ribbonu původního excelu; sloupec „Standalone chování" popisuje ekvivalent +v samostatné aplikaci. + +| Akce (původně) | Standalone chování | Stav | +|---|---|---| +| **Uprav rozpisku** | Editace dat řádku v mřížce; **náhled dvojklikem na řádek** (samostatné okno, [4.4](#44-náhled-rozpisky)). Tlačítko „uprav" odpadá. | plán | +| **Uprav rozpisky** | Hromadné přegenerování / kontrola všech rozpisek (např. po změně údajů projektu). | plán | +| **Vytiskni rozpisku** | Export / tisk **jedné** rozpisky (PDF/PNG) přes `Exporters` (`PdfA4`, `PngA4`). | plán | +| **Vytiskni rozpisky** | **Dávkový** export/tisk všech rozpisek do `CestaExportu\SlozkaExportu`, název dle „Jména rozvržení". | plán | +| **Aktualizuj rozvržení** | Standalone ekvivalent: vygenerování/aktualizace výstupů (DXF/PDF) per rozvržení. (AutoCAD varianta → [roadmapa](#8-roadmapa-budoucích-funkcionalit).) | plán | +| **Vytiskni rozvržení** | Tisk rozvržení (přes vlastní engine / PrintDialog). (AutoCAD varianta → roadmapa.) | plán | +| **Tisk seznamu** | Tisk přehledu seznamu příloh. | plán | +| **Export seznamu (Otevřená verze)** | Export seznamu příloh do otevřeného `.xlsx`. | plán | +| **Navigace (Předchozí/Další)** | Navigace mezi sekcemi / řádky. | volitelné | +| **O programu** | Informace o aplikaci a verzi. | plán | + +--- + +## 6. Loga a orientační schéma + +- Šablona má **5 placeholderů na loga** (`Rozpiska_logo1`–`Rozpiska_logo5`). +- Placeholdery leží na **netisknutelných hladinách** (`!!NOPRINT`): jejich geometrie se **nevykresluje**, + ale aplikace o nich **musí vědět** (z dat šablony), aby do nich uměla posadit logo – viz + `RectForLayer` / `g.Image(...)` v `ROZPISKY.md`. +- Logo se přiřazuje podle role: **loga institucí financujících stavbu** (pole 1, manuál kap. 4.3.1 – + nepovinné), **objednatel/investor**, **zhotovitel díla**, **zhotovitel části/objektu** (manuál + kap. 4.3.5/4.3.6). Načítá se ze souboru (`File.ReadAllBytes("logo.png")`). +- **Orientační schéma** je **samostatné grafické pole** (pole 2, manuál kap. 4.3.2) – schéma stavby + s červeným zvýrazněním polohy dotčeného objektu (u liniových staveb klad listů). Nepovinné u malých + staveb. **Není to** pole `K1`–`K47` (to je strojový kód, viz [§ 3.7](#37-kódové-označení-přílohy-47-pozic-pole-k1k47)). +- Pole pro **otisk razítek** / razítko oprávněné osoby (pole 3, kap. 4.3.3) zůstává v elektronické + verzi obvykle prázdné. + +--- + +## 7. Metadata polí (zalamování, styl, víceřádkovost) + +Pole rozpisky nejsou jen „text na souřadnici". Aby výstup odpovídal šabloně, je třeba u každého +pole znát (viz požadavek v [`ROZPISKY.md`](ROZPISKY.md)): + +- **velikost textu** (výška) – daná stylem/atributem, +- **styl** atributu, +- **víceřádkovost** – zda byl atribut víceřádkový, +- **šířku** pole – pro **zalamování** dlouhého textu (adresy, dlouhé názvy), +- **zarovnání** (H/V). + +Skupiny hladin `Rozpiska_pole_1`–`8` zřejmě odpovídají různým stylům polí. Tato metadata se mají +číst ze šablony (z `ATTDEF`) a nést spolu s hodnotou. + +> **Dopad do jádra:** současná signatura `IProfileRenderer.Text(...)` v `ROZPISKY.md` nenese šířku +> ani příznak víceřádkovosti. Navrhuje se ji **rozšířit o šířku pole + zalamování** (resp. nést +> metadata pole z `DxfTemplate`), aby šlo dlouhé hodnoty správně zalomit. Tím se zároveň řeší +> rozpor mezi požadavkem na víceřádková pole a stávajícím omezením „jen jednořádkový `TEXT`". + +--- + +## 8. Roadmapa budoucích funkcionalit + +Orientační fázování (priorita shora dolů): + +**Fáze 1 – MVP (standalone):** +- Načtení DXF šablony a zjištění polí/placeholderů. +- Datový model: projekt + seznam příloh (v paměti). +- Mřížka seznamu, formulář údajů projektu. +- Náhled rozpisky dvojklikem na řádek. +- Export **jedné** rozpisky do PNG/PDF. + +**Fáze 2 – data a produktivita:** +- Číselníky + automatické doplnění adres/kontaktů (VLOOKUP). +- Revize. +- **Uložení/načtení projektu** (formát – viz [otevřené otázky](#9-otevřené-otázky)). +- Import z původního `.xlsx` (přemostění starých dat). +- **Dávkový export** všech rozpisek. + +**Fáze 3 – výstupy:** +- Tisk (PrintDialog) jednotlivě i dávkově. +- Tisk / export **seznamu příloh** (i „Otevřená verze" do `.xlsx`). +- Loga ze souborů, orientační schéma. + +**Fáze 4 – kvalita výstupu:** +- **Víceřádková pole a zalamování** (viz [sekce 7](#7-metadata-polí-zalamování-styl-víceřádkovost)). +- Podpora více DXF šablon. +- Nastavení (cesty, měřítko, CTB, tiskárna). + +**Budoucí blok – AutoCAD integrace (interop):** +- Vyplnění a tisk rozpisek **přímo ve výkresech `.dwg`**. +- Práce s **rozvrženími (layouty)**, **CTB** styly, **LTSCALE**, tisk plotterem. +- Výstup zpět do `.dwg`. +- *(Mimo standalone jádro – aktivuje se jen při dostupném AutoCADu.)* + +--- + +## 9. Otevřené otázky + +- **Formát uložení** – rozdělené úložiště: + - **Projekt** (údaje + seznam příloh + **revize**) = interní data jedné zakázky → formát k rozhodnutí + (JSON / SQLite / vlastní). + - **Číselníky** (organizace, firmy, jména, profese, verze, části) = **externí databáze vedle `.exe`**, + sdílená a doplňovatelná napříč projekty ([3.4](#34-číselníky)) → formát k rozhodnutí. +- **Generátor 47-pozičního kódu** – doimplementovat dle manuálu kap. 3.2.1–3.2.8 vč. okrajových případů + (sdružené objekty `SK`/`PK`, kap. 3.3; pracovní vs. definitivní verze). +- **Orientační schéma** – jak se obrázek schématu získá/přiřadí k příloze (vstup uživatele vs. generování). +- **WPF styl** – dodá uživatel samostatně; zde neřešen. +- **Import z původního `.xlsx`** – mapování listů `ÚDAJE`/`SEZNAM`/`REVIZE` + číselníků do modelu. +- **Více DXF šablon** – jedna pevná vs. volitelné šablony (základní pole / pole celé stavby / vložená + příloha, manuál kap. 4.2.1–4.2.3). +- **Lokalizace** – zatím čeština. diff --git a/ROZPISKY.md b/ROZPISKY.md new file mode 100644 index 0000000..7bc318f --- /dev/null +++ b/ROZPISKY.md @@ -0,0 +1,222 @@ +# Rozpisky – generátor výkresových rohových razítek (C# / .NET) + +Standalone WPF aplikace (náhrada původního excelového nástroje „Rozpisky 1.0.8"). Spravuje projekt, +seznam příloh, revize a číselníky, a z **DXF šablony rozpisky** generuje **náhled**, **PDF na A4**, +**hromadný DXF** (pole jako `TEXT`/`MTEXT` entity), **seznam příloh do XLSX** a přes připojený CAD +i **tisk rozvržení**. + +Celé kreslení stojí na jedné myšlence: existuje jedno **kreslicí rozhraní** +([`IProfileRenderer`](Rozpisky/Rendering/IProfileRenderer.cs) – „kam se kreslí") a několik jeho +implementací. Tatáž kresba teče na obrazovku (náhled), do PNG, do PDF i do DXF. Čtečka šablony +([`DxfTemplate`](Rozpisky/Dxf/DxfTemplate.cs)) jen čte DXF a „přehrává" ho do tohoto rozhraní. + +--- + +## 1. NuGet balíčky + +Cílový framework: **`net9.0-windows`**, `UseWPF=true`, platforma **AnyCPU**. Připojení na běžící CAD +a MS Excel jde přes COM (pozdní vazba přes `dynamic`) – bitness běhového procesu se řídí hostitelem, +zvláštní `PlatformTarget` se nenastavuje. + +| Balíček | Verze | K čemu | Klíčové API | +|---|---|---|---| +| **SkiaSharp** | `2.88.8` | 2D rasterizace + **PDF**. Kreslení geometrie/textu/obrázků; export PNG i PDF. | `SKCanvas`, `SKPaint`, `SKPath`, `SKBitmap`, `SKImage`, `SKTypeface`, `SKDocument.CreatePdf`, `SKFileWStream` | +| **SkiaSharp.Views.WPF** | `2.88.8` | WPF plátno pro živý náhled (zoom/posun). **Jen pro GUI** – headless export ho nepotřebuje. | `SKElement`, `OnPaintSurface(SKPaintSurfaceEventArgs)` | +| **ACadSharp** | `3.6.29` | Čtení i **zápis** DXF (novější verze, výplně HATCH, XRecord metadata atributů). Nahradilo dřívější netDxf. | `DxfReader.Read`, `DxfWriter.Write`, `CadDocument`, `ACadSharp.Entities.*`, `ACadSharp.Tables.TextStyle` | +| **ClosedXML** | `0.105.0` | Vyplnění mustru „Seznam příloh" (`SEZNAM.xlsx`) při exportu seznamu. | `XLWorkbook`, `IXLWorksheet`, `Cell(...).Value`, `SaveAs` | + +> **Pozn. k ACadSharp:** na rozdíl od netDxf vystaví font ze stylu i box-šířku víceřádkových atributů +> (XRecord, group 41), takže jde dlouhý text v poli správně zalomit. DXF se zapisuje **binárně** +> (`DxfWriter.Write(..., binary: true)`) – výrazně menší soubor. Převod XLSX → PDF (tisk seznamu) jde +> přes **nainstalovaný MS Excel** (COM), ne přes ACadSharp/ClosedXML. + +### Zápis DXF – co je potřeba vědět + +- **Tloušťka čáry** = `Layer.LineWeight` (enum, hodnota v 1/100 mm – standardní hodnoty: + `0,5,9,13,15,18,20,25,30,35,40,50,53,60,70,80,90,100,106,120,140,158,200,211`). +- **Diakritika** se do DXF ukládá jako Unicode escape `\U+XXXX` (např. `š` → `\U+0161`) – AutoCAD + i ostatní čtečky to čtou správně. +- Pole, která byla v šabloně `ATTDEF`, se při vyplnění zapisují jako obyčejné `TEXT`/`MTEXT` entity + (žádné atributy bloku). +- Objekty v netisknutelných hladinách (`PlotFlag=0`) se **nevykreslují**, ale ví se o nich kvůli + místům pro loga (viz [`DxfTemplate.PlaceholderHladiny`](Rozpisky/Dxf/DxfTemplate.cs)). + +--- + +## 2. Struktura kódu + +Aplikace je členěná dle vrstev (MVVM + služby): + +``` +Rozpisky/ +├─ Rendering/ ← kreslicí vrstva (nezávislá na cíli) +│ ├─ IProfileRenderer.cs ← kreslicí rozhraní + HAlign/VAlign + TextStyle +│ ├─ SkiaProfileRenderer.cs ← výstup přes SkiaSharp (obrazovka / PNG / PDF) +│ ├─ DxfProfileRenderer.cs ← výstup do DXF (ACadSharp) +│ ├─ BoundsRenderer.cs ← spočítá bbox kresby (fit / umístění na A4) +│ └─ TransformRenderer.cs ← dekorátor: měřítko + posun (fit fragmentů/loga) +├─ Dxf/ ← čtení šablony, mapování hodnot, kódy +│ ├─ DxfTemplate.cs ← načte DXF šablonu a přehraje ji do IProfileRenderer +│ ├─ RozpiskaRenderer.cs ← spojuje šablonu + hodnoty + exportéry (fasáda pro UI) +│ ├─ RozpiskaValues.cs ← „tag DXF → hodnota" z projektu/přílohy/číselníků (reflexí dle mapovani.json) +│ ├─ MapovaniStore.cs ← načtení mapování z mapovani.json (config vedle .exe) +│ ├─ KodPrilohy.cs ← 47-poziční strojový kód přílohy (manuál SŽ kap. 3) +│ ├─ Exporters.cs ← PngA4 / PdfA4 / RenderView (kreslí libovolný Action) +│ └─ LogaResolver.cs ← dohledání DXF log/schémat k příloze +├─ Cad/ ← připojení na běžící CAD (COM) + aktualizace/tisk rozvržení +├─ Xlsx/ ← export seznamu příloh (ClosedXML) + XLSX→PDF (Excel COM) +├─ Data/ ← persistence: .rzp projekt, číselníky, atomický zápis configů +├─ Models/ ← datový model (Projekt, Priloha, Revize, Ciselniky, Nastaveni…) +├─ ViewModels/ ← MainViewModel (stav, akce, dirty-flag, export) +├─ Views/ + Themes/ + Theming/ + Behaviors/ ← WPF UI (dark theme, grid chování) +├─ App.xaml(.cs) ← vstupní bod + globální záchytná síť výjimek (error.log) +└─ MainWindow.xaml(.cs) ← hlavní okno +``` + +Vedle .exe se dodávají editovatelné soubory: `Rozpiska.dxf` (šablona), `SEZNAM.xlsx` (mustr seznamu), +`ciselniky.json`, `mapovani.json`, `cad.json`, `layout.json`, `loga/` a manuál SŽ (PDF). + +--- + +## 3. Kreslicí rozhraní + +Vše se kreslí ve **výkresových milimetrech**, osa **Y nahoru** (jako v CAD/DXF). + +```csharp +public enum HAlign { Left, Center, Right } +public enum VAlign { Baseline, Bottom, Middle, Top } + +public readonly record struct TextStyle(string? FontFamily = null, bool Bold = false, + bool Italic = false, string? FontFile = null); + +public interface IProfileRenderer +{ + void Layer(string name, int rgb, double lineWeightMm = 0.25); // barva 0xRRGGBB, tloušťka ByLayer + void Line(double x1, double y1, double x2, double y2); + void Polyline(IReadOnlyList<(double X, double Y)> pts, bool closed = false); + void Circle(double cx, double cy, double r); + void Text(double x, double y, string text, double heightMm, + HAlign h = HAlign.Left, VAlign v = VAlign.Baseline, double rotationDeg = 0, + TextStyle style = default, double widthFactor = 1, double maxWidthMm = 0); + void Fill(IReadOnlyList> loops); // HATCH výplně (even-odd) +} +``` + +- `rgb` je barva `0xRRGGBB` rozbalená z DXF (ByLayer i index/true-color). Bílá se kreslí černě + (bílá na bílém papíře by zmizela). +- `widthFactor` = horizontální měřítko písma (DXF width factor). `maxWidthMm` = šířka pro zalomení + víceřádkového textu (0 = jen explicitní zlomy). + +Implementace: + +- **`SkiaProfileRenderer`** – kreslí na `SKCanvas`. Dostane funkci `Map(mmX, mmY) → bod plátna` + a `pxPerMm`. Text vzpřímeně (rotace opačně, plátno má Y dolů), fonty ze stylu/souboru s fallbackem. + Je `IDisposable` (uvolní typefaces) – používat přes `using`. +- **`DxfProfileRenderer`** – pro každou hladinu založí `Layer` (barva + tloušťka), entity přidává do + `Document`. Výsledek zapíše `DxfWriter.Write(path, renderer.Document, binary: true)`. +- **`BoundsRenderer`** – nic nekreslí, jen sčítá min/max souřadnic (fit / vystředění na A4). +- **`TransformRenderer`** – dekorátor: na souřadnice aplikuje uniformní měřítko + posun. Slouží + k umístění vkládaného DXF fragmentu (logo / schéma) do vymezeného rámečku. + +--- + +## 4. Čtečka šablony a fasáda pro UI + +Nízkoúrovňová čtečka [`DxfTemplate`](Rozpisky/Dxf/DxfTemplate.cs): + +```csharp +var tpl = new DxfTemplate("Rozpiska.dxf"); +tpl.Replay(g); // NÁHLED: pole se vykreslí jako jejich názvy (tagy) +tpl.Replay(g, values); // VYPLNĚNÍ: pole = hodnota; nevyplněné = prázdné +tpl.Replay(g, values, includeNoPrint); // + volitelně A4 rámeček !!NOPRINT (pro DXF export/tisk) +``` + +`Replay` přehraje statickou geometrii (`Line`/`Polyline`), popisky (`Text`/`MText`) a pole +(`ATTDEF` z model space) do rozhraní. `SheetFrame` vrací A4 rámeček šablony (referenční obdélník pro +vystředění), `Placeholders` vrací rámečky pro loga/schéma podle vyhrazených hladin, `Bounds` bbox +kresby (pro fit vkládaného fragmentu). + +Fasáda pro UI [`RozpiskaRenderer`](Rozpisky/Dxf/RozpiskaRenderer.cs) spojuje šablonu, mapování hodnot +a exportéry na jedno místo (šablona se cachuje): + +```csharp +var r = new RozpiskaRenderer(Nastaveni.SablonaDxf); +Action draw = r.BuildDraw(projekt, priloha, revize, ciselniky, + vyplnene: true, loga, ramecekA4: false); +r.ExportPdf(projekt, priloha, revize, ciselniky, "rozpiska.pdf", loga); // A4 PDF vč. log +r.ExportPng(projekt, priloha, revize, ciselniky, "nahled.png", loga); // A4 PNG +``` + +Hodnoty polí sestavuje [`RozpiskaValues`](Rozpisky/Dxf/RozpiskaValues.cs): mapování „pole programu → +DXF atribut" **není v kódu**, čte se z `mapovani.json` a hodnoty se dotahují reflexí. K tomu se +algoritmicky doplní 47-poziční strojový kód (`K1`–`K47`, viz +[`KodPrilohy`](Rozpisky/Dxf/KodPrilohy.cs)). + +--- + +## 5. Export na A4 (`Exporters`) + +[`Exporters`](Rozpisky/Dxf/Exporters.cs) vykreslí **libovolný** `Action`: + +```csharp +Exporters.PngA4(draw, "rozpiska.png", dpi: 200, frame: sheetFrame); // A4 raster +Exporters.PdfA4(draw, "rozpiska.pdf", frame: sheetFrame); // A4 vektor (PDF, 1:1) +Exporters.RenderView(canvas, wpx, hpx, draw, frame, zoom, panX, panY); // živý náhled na SKElement +``` + +Princip A4: referenční obdélník (`frame` = A4 rámeček šablony, jinak `BoundsRenderer`) se mapuje +**1:1** a vystředí na papír; zmenší se jen tehdy, když se do tisknutelné plochy nevejde. PDF se kreslí +přes `SKDocument.CreatePdf` (1 mm = 72/25,4 bodu; text vektorový, tloušťky v reálných mm). + +--- + +## 6. Demo data (`DemoData`) + +[`DemoData`](Rozpisky/Data/DemoData.cs) naplní úvodní stav při startu: +`SeedProjekt(vm)` (ukázkový projekt + přílohy), `SeedCiselniky(c)` a `SeedKraje(c)` (výchozí +číselníky, pokud `ciselniky.json` chybí). + +--- + +## 7. Toky exportu (přehled) + +| Akce | Vstup | Výstup | Přes | +|---|---|---|---| +| Náhled rozpisky | příloha | okno se SKElement | `RozpiskaRenderer.BuildDraw` → `Exporters.RenderView` | +| Export do PDF (výběr/vše) | přílohy | `Rozpisky\*.pdf` | `RozpiskaRenderer.ExportPdf` (per-item, chyby se sbírají) | +| Export do DXF (hromadně) | přílohy | `__ Otevřená\_rozpisky.dxf` | dlaždicová mřížka do `DxfProfileRenderer` → `DxfWriter.Write` | +| Export seznamu | objekt | `SEZNAM_.xlsx` vedle .rzp | `SeznamExporter` (ClosedXML mustr) | +| Tisk seznamu | dřív exportovaný XLSX | `Přílohy\*.pdf` | `ExcelToPdf` (MS Excel COM) | +| Aktualizace/tisk rozvržení | přílohy | přejmenování/tisk v CADu | `Cad/CadLayoutService`, `Cad/CadTiskService` (COM) | + +Aplikace **nemá CLI režim** – vše jede z GUI. Neočekávané výjimky zachytává globální síť v +[`App.xaml.cs`](Rozpisky/App.xaml.cs) a zapisuje je do `error.log` vedle .exe. + +--- + +## 8. Persistence a robustnost + +- **Projekt `.rzp`** ([`ProjektStore`](Rozpisky/Data/ProjektStore.cs)) – JSON s exkluzivním zámkem + drženým po dobu otevření (ostatní procesy smí jen číst). Zápis serializuje **před** useknutím + souboru, aby pád nezanechal prázdný soubor. +- **Configy vedle .exe** (`ciselniky.json`, `cad.json`, `layout.json`, `mapovani.json`) jdou přes + [`JsonConfigFile`](Rozpisky/Data/JsonConfigFile.cs): **atomický zápis** (přes `.tmp`) a při + poškozeném souboru **záloha do `.bak` + upozornění** (místo tichého přepsání výchozími daty). +- **Zamčený cíl exportu** – před zápisem PDF/XLSX/DXF se ověří, zda soubor nedrží jiný program + (Excel, prohlížeč PDF), a nabídne Pokračovat/Přerušit. + +--- + +## 9. Závislost na šabloně + +Šablona je libovolný DXF, kde: +- rám a mřížku tvoří `LINE` / `LWPOLYLINE`, +- pevné popisky jsou `TEXT` / `MTEXT`, +- **vyplňovaná pole jsou `ATTDEF`** v model space (jejich `Tag` = klíč do hodnot), +- placeholdery pro loga jsou uzavřené polylinie na vyhrazených netisknutelných hladinách + (`Rozpiska_logo1`…, `Rozpiska_Orientační schéma`) – logo/schéma se fitne do jejich ohraničení, + samotný placeholder se nekreslí (`PlotFlag=0`), +- A4 hranici papíru vymezuje rámeček na hladině `!!NOPRINT`. + +Tím je celý vzhled rozpisky daný **datovým souborem a mapováním** (`Rozpiska.dxf` + `mapovani.json`), +ne kódem – pro jinou rozpisku stačí jiný DXF a mapování. diff --git a/Rozpiska.dxf b/Rozpiska.dxf new file mode 100644 index 0000000..0e0b053 --- /dev/null +++ b/Rozpiska.dxf @@ -0,0 +1,33542 @@ + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1027 + 9 +$ACADMAINTVER + 70 + 125 + 9 +$DWGCODEPAGE + 3 +ANSI_1250 + 9 +$LASTSAVEDBY + 1 +jomar + 9 +$REQUIREDVERSIONS +160 + 0 + 9 +$INSBASE + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$EXTMIN + 10 +-210.0 + 20 +0.0 + 30 +0.0 + 9 +$EXTMAX + 10 +210.0 + 20 +297.0000000000005 + 30 +0.0 + 9 +$LIMMIN + 10 +0.0 + 20 +0.0 + 9 +$LIMMAX + 10 +420.0 + 20 +297.0 + 9 +$ORTHOMODE + 70 + 0 + 9 +$REGENMODE + 70 + 0 + 9 +$FILLMODE + 70 + 1 + 9 +$QTEXTMODE + 70 + 0 + 9 +$MIRRTEXT + 70 + 0 + 9 +$LTSCALE + 40 +1.0 + 9 +$ATTMODE + 70 + 1 + 9 +$TEXTSIZE + 40 +2.5 + 9 +$TRACEWID + 40 +1.0 + 9 +$TEXTSTYLE + 7 +Standard + 9 +$CLAYER + 8 +0 + 9 +$CELTYPE + 6 +ByLayer + 9 +$CECOLOR + 62 + 256 + 9 +$CELTSCALE + 40 +1.0 + 9 +$DISPSILH + 70 + 0 + 9 +$DIMSCALE + 40 +1.0 + 9 +$DIMASZ + 40 +0.18 + 9 +$DIMEXO + 40 +0.0625 + 9 +$DIMDLI + 40 +0.38 + 9 +$DIMRND + 40 +0.0 + 9 +$DIMDLE + 40 +0.0 + 9 +$DIMEXE + 40 +0.18 + 9 +$DIMTP + 40 +0.0 + 9 +$DIMTM + 40 +0.0 + 9 +$DIMTXT + 40 +0.18 + 9 +$DIMCEN + 40 +0.09 + 9 +$DIMTSZ + 40 +0.0 + 9 +$DIMTOL + 70 + 0 + 9 +$DIMLIM + 70 + 0 + 9 +$DIMTIH + 70 + 1 + 9 +$DIMTOH + 70 + 1 + 9 +$DIMSE1 + 70 + 0 + 9 +$DIMSE2 + 70 + 0 + 9 +$DIMTAD + 70 + 0 + 9 +$DIMZIN + 70 + 0 + 9 +$DIMBLK + 1 + + 9 +$DIMASO + 70 + 1 + 9 +$DIMSHO + 70 + 1 + 9 +$DIMPOST + 1 + + 9 +$DIMAPOST + 1 + + 9 +$DIMALT + 70 + 0 + 9 +$DIMALTD + 70 + 2 + 9 +$DIMALTF + 40 +25.4 + 9 +$DIMLFAC + 40 +1.0 + 9 +$DIMTOFL + 70 + 0 + 9 +$DIMTVP + 40 +0.0 + 9 +$DIMTIX + 70 + 0 + 9 +$DIMSOXD + 70 + 0 + 9 +$DIMSAH + 70 + 0 + 9 +$DIMBLK1 + 1 + + 9 +$DIMBLK2 + 1 + + 9 +$DIMSTYLE + 2 +Standard + 9 +$DIMCLRD + 70 + 0 + 9 +$DIMCLRE + 70 + 0 + 9 +$DIMCLRT + 70 + 0 + 9 +$DIMTFAC + 40 +1.0 + 9 +$DIMGAP + 40 +0.09 + 9 +$DIMJUST + 70 + 0 + 9 +$DIMSD1 + 70 + 0 + 9 +$DIMSD2 + 70 + 0 + 9 +$DIMTOLJ + 70 + 1 + 9 +$DIMTZIN + 70 + 0 + 9 +$DIMALTZ + 70 + 0 + 9 +$DIMALTTZ + 70 + 0 + 9 +$DIMUPT + 70 + 0 + 9 +$DIMDEC + 70 + 4 + 9 +$DIMTDEC + 70 + 4 + 9 +$DIMALTU + 70 + 2 + 9 +$DIMALTTD + 70 + 2 + 9 +$DIMTXSTY + 7 +Standard + 9 +$DIMAUNIT + 70 + 0 + 9 +$DIMADEC + 70 + 0 + 9 +$DIMALTRND + 40 +0.0 + 9 +$DIMAZIN + 70 + 0 + 9 +$DIMDSEP + 70 + 46 + 9 +$DIMATFIT + 70 + 3 + 9 +$DIMFRAC + 70 + 0 + 9 +$DIMLDRBLK + 1 + + 9 +$DIMLUNIT + 70 + 2 + 9 +$DIMLWD + 70 + -2 + 9 +$DIMLWE + 70 + -2 + 9 +$DIMTMOVE + 70 + 0 + 9 +$DIMFXL + 40 +1.0 + 9 +$DIMFXLON + 70 + 0 + 9 +$DIMJOGANG + 40 +0.7853981633974483 + 9 +$DIMTFILL + 70 + 0 + 9 +$DIMTFILLCLR + 70 + 0 + 9 +$DIMARCSYM + 70 + 0 + 9 +$DIMLTYPE + 6 + + 9 +$DIMLTEX1 + 6 + + 9 +$DIMLTEX2 + 6 + + 9 +$DIMTXTDIRECTION + 70 + 0 + 9 +$LUNITS + 70 + 2 + 9 +$LUPREC + 70 + 3 + 9 +$SKETCHINC + 40 +1.0 + 9 +$FILLETRAD + 40 +0.0 + 9 +$AUNITS + 70 + 0 + 9 +$AUPREC + 70 + 3 + 9 +$MENU + 1 +. + 9 +$ELEVATION + 40 +0.0 + 9 +$PELEVATION + 40 +0.0 + 9 +$THICKNESS + 40 +0.0 + 9 +$LIMCHECK + 70 + 0 + 9 +$CHAMFERA + 40 +0.0 + 9 +$CHAMFERB + 40 +0.0 + 9 +$CHAMFERC + 40 +20.0 + 9 +$CHAMFERD + 40 +0.0 + 9 +$SKPOLY + 70 + 0 + 9 +$TDCREATE + 40 +2457049.596631945 + 9 +$TDUCREATE + 40 +2457049.554976354 + 9 +$TDUPDATE + 40 +2461216.777824074 + 9 +$TDUUPDATE + 40 +2461216.694490741 + 9 +$TDINDWG + 40 +5.7419703819 + 9 +$TDUSRTIMER + 40 +5.7419702662 + 9 +$USRTIMER + 70 + 1 + 9 +$ANGBASE + 50 +0.0 + 9 +$ANGDIR + 70 + 0 + 9 +$PDMODE + 70 + 35 + 9 +$PDSIZE + 40 +1.0 + 9 +$PLINEWID + 40 +0.0 + 9 +$SPLFRAME + 70 + 0 + 9 +$SPLINETYPE + 70 + 6 + 9 +$SPLINESEGS + 70 + 8 + 9 +$HANDSEED + 5 +25A + 9 +$SURFTAB1 + 70 + 6 + 9 +$SURFTAB2 + 70 + 6 + 9 +$SURFTYPE + 70 + 6 + 9 +$SURFU + 70 + 6 + 9 +$SURFV + 70 + 6 + 9 +$UCSBASE + 2 + + 9 +$UCSNAME + 2 + + 9 +$UCSORG + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSXDIR + 10 +1.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSYDIR + 10 +0.0 + 20 +1.0 + 30 +0.0 + 9 +$UCSORTHOREF + 2 + + 9 +$UCSORTHOVIEW + 70 + 0 + 9 +$UCSORGTOP + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGBOTTOM + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGLEFT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGRIGHT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGFRONT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGBACK + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSBASE + 2 + + 9 +$PUCSNAME + 2 + + 9 +$PUCSORG + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSXDIR + 10 +1.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSYDIR + 10 +0.0 + 20 +1.0 + 30 +0.0 + 9 +$PUCSORTHOREF + 2 + + 9 +$PUCSORTHOVIEW + 70 + 0 + 9 +$PUCSORGTOP + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGBOTTOM + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGLEFT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGRIGHT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGFRONT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGBACK + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$USERI1 + 70 + 0 + 9 +$USERI2 + 70 + 0 + 9 +$USERI3 + 70 + 0 + 9 +$USERI4 + 70 + 0 + 9 +$USERI5 + 70 + 0 + 9 +$USERR1 + 40 +0.0 + 9 +$USERR2 + 40 +0.0 + 9 +$USERR3 + 40 +0.0 + 9 +$USERR4 + 40 +0.0 + 9 +$USERR5 + 40 +0.0 + 9 +$WORLDVIEW + 70 + 1 + 9 +$SHADEDGE + 70 + 3 + 9 +$SHADEDIF + 70 + 70 + 9 +$TILEMODE + 70 + 1 + 9 +$MAXACTVP + 70 + 64 + 9 +$PINSBASE + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PLIMCHECK + 70 + 0 + 9 +$PEXTMIN + 10 +1.000000000000000E+20 + 20 +1.000000000000000E+20 + 30 +1.000000000000000E+20 + 9 +$PEXTMAX + 10 +-1.000000000000000E+20 + 20 +-1.000000000000000E+20 + 30 +-1.000000000000000E+20 + 9 +$PLIMMIN + 10 +0.0 + 20 +0.0 + 9 +$PLIMMAX + 10 +210.0 + 20 +297.0 + 9 +$UNITMODE + 70 + 0 + 9 +$VISRETAIN + 70 + 1 + 9 +$PLINEGEN + 70 + 0 + 9 +$PSLTSCALE + 70 + 1 + 9 +$TREEDEPTH + 70 + 3020 + 9 +$CMLSTYLE + 2 +Standard + 9 +$CMLJUST + 70 + 0 + 9 +$CMLSCALE + 40 +20.0 + 9 +$PROXYGRAPHICS + 70 + 1 + 9 +$MEASUREMENT + 70 + 1 + 9 +$CELWEIGHT +370 + -1 + 9 +$ENDCAPS +280 + 0 + 9 +$JOINSTYLE +280 + 0 + 9 +$LWDISPLAY +290 + 0 + 9 +$INSUNITS + 70 + 0 + 9 +$HYPERLINKBASE + 1 + + 9 +$STYLESHEET + 1 + + 9 +$XEDIT +290 + 1 + 9 +$CEPSNTYPE +380 + 0 + 9 +$PSTYLEMODE +290 + 1 + 9 +$FINGERPRINTGUID + 2 +{047FE60D-F3D4-9745-AAD6-5D201DAE3E77} + 9 +$VERSIONGUID + 2 +{B08F2FF0-BA98-A649-AF9F-CEABBBD47E62} + 9 +$EXTNAMES +290 + 1 + 9 +$PSVPSCALE + 40 +0.0 + 9 +$OLESTARTUP +290 + 0 + 9 +$SORTENTS +280 + 127 + 9 +$INDEXCTL +280 + 0 + 9 +$HIDETEXT +280 + 1 + 9 +$XCLIPFRAME +280 + 0 + 9 +$HALOGAP +280 + 0 + 9 +$OBSCOLOR + 70 + 257 + 9 +$OBSLTYPE +280 + 0 + 9 +$INTERSECTIONDISPLAY +280 + 0 + 9 +$INTERSECTIONCOLOR + 70 + 257 + 9 +$DIMASSOC +280 + 2 + 9 +$PROJECTNAME + 1 + + 9 +$CAMERADISPLAY +290 + 0 + 9 +$LENSLENGTH + 40 +50.0 + 9 +$CAMERAHEIGHT + 40 +0.0 + 9 +$STEPSPERSEC + 40 +2.0 + 9 +$STEPSIZE + 40 +6.0 + 9 +$3DDWFPREC + 40 +2.0 + 9 +$PSOLWIDTH + 40 +0.25 + 9 +$PSOLHEIGHT + 40 +4.0 + 9 +$LOFTANG1 + 40 +1.570796326794896 + 9 +$LOFTANG2 + 40 +1.570796326794896 + 9 +$LOFTMAG1 + 40 +0.0 + 9 +$LOFTMAG2 + 40 +0.0 + 9 +$LOFTPARAM + 70 + 7 + 9 +$LOFTNORMALS +280 + 1 + 9 +$LATITUDE + 40 +37.795 + 9 +$LONGITUDE + 40 +-122.394 + 9 +$NORTHDIRECTION + 40 +0.0 + 9 +$TIMEZONE + 70 + -8000 + 9 +$LIGHTGLYPHDISPLAY +280 + 1 + 9 +$TILEMODELIGHTSYNCH +280 + 1 + 9 +$CMATERIAL +347 +35 + 9 +$SOLIDHIST +280 + 1 + 9 +$SHOWHIST +280 + 1 + 9 +$DWFFRAME +280 + 2 + 9 +$DGNFRAME +280 + 0 + 9 +$REALWORLDSCALE +290 + 1 + 9 +$INTERFERECOLOR + 62 + 1 + 9 +$INTERFEREOBJVS +345 +53 + 9 +$INTERFEREVPVS +346 +54 + 9 +$CSHADOW +280 + 0 + 9 +$SHADOWPLANELOCATION + 40 +0.0 + 0 +ENDSEC + 0 +SECTION + 2 +CLASSES + 0 +CLASS + 1 +ACDBDICTIONARYWDFLT + 2 +AcDbDictionaryWithDefault + 3 +ObjectDBX Classes + 90 + 0 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBPLACEHOLDER + 2 +AcDbPlaceHolder + 3 +ObjectDBX Classes + 90 + 0 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +LAYOUT + 2 +AcDbLayout + 3 +ObjectDBX Classes + 90 + 0 + 91 + 2 +280 + 0 +281 + 0 + 0 +CLASS + 1 +DICTIONARYVAR + 2 +AcDbDictionaryVar + 3 +ObjectDBX Classes + 90 + 0 + 91 + 21 +280 + 0 +281 + 0 + 0 +CLASS + 1 +MATERIAL + 2 +AcDbMaterial + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 3 +280 + 0 +281 + 0 + 0 +CLASS + 1 +VISUALSTYLE + 2 +AcDbVisualStyle + 3 +ObjectDBX Classes + 90 + 4095 + 91 + 25 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SCALE + 2 +AcDbScale + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 17 +280 + 0 +281 + 0 + 0 +CLASS + 1 +TABLESTYLE + 2 +AcDbTableStyle + 3 +ObjectDBX Classes + 90 + 4095 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +MLEADERSTYLE + 2 +AcDbMLeaderStyle + 3 +ACDB_MLEADERSTYLE_CLASS + 90 + 4095 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +CELLSTYLEMAP + 2 +AcDbCellStyleMap + 3 +ObjectDBX Classes + 90 + 1152 + 91 + 3 +280 + 0 +281 + 0 + 0 +CLASS + 1 +EXACXREFPANELOBJECT + 2 +ExAcXREFPanelObject + 3 +EXAC_ESW + 90 + 1025 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +NPOCOLLECTION + 2 +AcDbImpNonPersistentObjectsCollection + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SORTENTSTABLE + 2 +AcDbSortentsTable + 3 +ObjectDBX Classes + 90 + 0 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +DMMAPMANAGER + 2 +AcMapDMMapManager + 3 +AcMapDisplayManagement + 90 + 1024 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +DMSTYLELIBRARY + 2 +AcMapDMStyleLibrary + 3 +AcMapDisplayManagement + 90 + 1024 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +DMSTYLECATEGORY + 2 +AcMapDMStyleCategory + 3 +AcMapDisplayManagement + 90 + 1024 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +DATATABLE + 2 +AcDbDataTable + 3 +ObjectDBX Classes + 90 + 0 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +EXACTERMXREFMAP + 2 +ExAcTermXrefMap + 3 +EXAC_SERVICE + 90 + 1025 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +DMMAP + 2 +AcMapDMMap + 3 +AcMapDisplayManagement + 90 + 1024 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +DMBASEELEMENT + 2 +AcMapDMBaseElement + 3 +AcMapDisplayManagement + 90 + 1024 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +DMDEFAULTSTYLE + 2 +AcMapDMDefaultStyle + 3 +AcMapDisplayManagement + 90 + 1024 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +DMSTYLEREFERENCE + 2 +AcMapDMStyleReference + 3 +AcMapDisplayManagement + 90 + 1024 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +DMSURROGATESTYLESETS + 2 +AcMapDMSurrogateStyleSets + 3 +AcMapDisplayManagement + 90 + 1153 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +DMSTYLIZEDENTITIESTABLE + 2 +AcMapDMStylizedEntitiesTable + 3 +AcMapDisplayManagement + 90 + 1024 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +MAPGWSUNDOOBJECT + 2 +AcMapGWSUndoRecorder + 3 +AcMapFeatureSourceManager + 90 + 1025 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_TREE_NODE + 2 +AeccDbTreeNode + 3 +AeccvBase70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_CLASS_NODE + 2 +AeccDbClassNode + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_USER_DEFINED_ATTRIBUTE_CLASSIFICATION + 2 +AeccDbUserDefinedAttributeClassification + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +IMAGEDEF + 2 +AcDbRasterImageDef + 3 +ISM + 90 + 0 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SPATIAL_FILTER + 2 +AcDbSpatialFilter + 3 +ObjectDBX Classes + 90 + 0 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SUN + 2 +AcDbSun + 3 +1 + 90 + 1024 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECC_ROOT_SETTINGS_NODE + 2 +AeccDbRootSettingsNode + 3 +AeccvBase70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_VARS_DWG_SETUP + 2 +AecDbVarsDwgSetup + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_NOTIFICATION_TRACKER + 2 +AecDbNotificationTracker + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ANCHOR_BUB_TO_GRID + 2 +AecDbDispRepAnchorBubToGrid + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_ENT + 2 +AecDbDispPropsEnt + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ANCHOR_BUB_TO_GRID_MODEL + 2 +AecDbDispRepAnchorBubToGridMdl + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ANCHOR_BUB_TO_GRID_RCP + 2 +AecDbDispRepAnchorBubToGridRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COLUMN_GRID + 2 +AecDbDispRepColumnGrid + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_LAYOUT_GRID2D + 2 +AecDbDispPropsLayoutGrid2d + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COLUMN_GRID_MODEL + 2 +AecDbDispRepColumnGridModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COLUMN_GRID_RCP + 2 +AecDbDispRepColumnGridRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_REP_MEMBER_ELEVATION_DESIGN + 2 +AecsDbDispRepMemberElevationDesign + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_PROPS_MEMBER_PROJECTED + 2 +AecsDbDispPropsMemberProjected + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_REP_MEMBER_ELEVATION_DETAIL + 2 +AecsDbDispRepMemberElevationDetail + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_REP_MEMBER_LOGICAL + 2 +AecsDbDispRepMemberLogical + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_PROPS_MEMBER_LOGICAL + 2 +AecsDbDispPropsMemberLogical + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_REP_MEMBER_MODEL_DESIGN + 2 +AecsDbDispRepMemberModelDesign + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_PROPS_MEMBER + 2 +AecsDbDispPropsMember + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_REP_MEMBER_MODEL_DETAIL + 2 +AecsDbDispRepMemberModelDetail + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_REP_MEMBER_PLAN_DESIGN + 2 +AecsDbDispRepMemberPlanDesign + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_PROPS_MEMBER_PLAN + 2 +AecsDbDispPropsMemberPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_REP_MEMBER_PLAN_DETAIL + 2 +AecsDbDispRepMemberPlanDetail + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_REP_MEMBER_PLAN_SKETCH + 2 +AecsDbDispRepMemberPlanSketch + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECS_DISP_PROPS_MEMBER_PLAN_SKETCH + 2 +AecsDbDispPropsMemberPlanSketch + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MASS_ELEM_MODEL + 2 +AecDbDispRepMassElemModel + 3 +AecBaseEx80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_MASS_ELEM_MODEL + 2 +AecDbDispPropsMassElem + 3 +AecBaseEx80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MASS_ELEM_SCHEM + 2 +AecDbDispRepMassElemSchem + 3 +AecBaseEx80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MASS_GROUP_MODEL + 2 +AecDbDispRepMassGroupModel + 3 +AecBaseEx80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_MASS_GROUP + 2 +AecDbDispPropsMassGroup + 3 +AecBaseEx80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MASS_GROUP_PLAN + 2 +AecDbDispRepMassGroupPlan + 3 +AecBaseEx80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_FEATURE_LINE + 2 +AeccDbDispRepFeatureLine + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_GRADING + 2 +AeccDbDispRepGrading + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_GRAPH + 2 +AeccDbDispRepGraph + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SECTION_VIEW + 2 +AeccDbDispRepGraphCrossSection + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PROFILE_VIEW + 2 +AeccDbDispRepGraphProfile + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_MATERIAL_SECTION + 2 +AeccDbDispRepMaterialSection + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_QUANTITY_TAKEOFF_AGGREGATE_EARTHWORK_TABLE + 2 +AeccDbDispRepQuantityTakeoffAggregateTable + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SAMPLE_LINE + 2 +AeccDbDispRepSampleLine + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SAMPLE_LINE_GROUP + 2 +AeccDbDispRepSampleLineGroup + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SECTION + 2 +AeccDbDispRepSection + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SECTION_VIEW_QUANTITY_TAKEOFF_TABLE + 2 +AeccDbDispRepSectionViewQuantityTakeoffTable + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SHEET + 2 +AeccDbDispRepSheet + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_GRID_SURFACE + 2 +AeccDbDispRepSurfaceGrid + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_TIN_SURFACE + 2 +AeccDbDispRepSurfaceTin + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PROFILE + 2 +AeccDbDispRepVAlignment + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT + 2 +AeccDbViewAlignment + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_LABELING + 2 +AeccDbViewLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_CURVE_LABEL + 2 +AeccDbViewAlignmentCurveLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_DESIGNSPEED_LABEL_GROUP + 2 +AeccDbViewAlignmentDesignSpeedLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_GEOMPT_LABEL_GROUP + 2 +AeccDbViewAlignmentGeomPointLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_MINOR_STATION_LABEL_GROUP + 2 +AeccDbViewAlignmentMinorStationLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_PI_LABEL + 2 +AeccDbViewAlignmentPILabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_SPIRAL_LABEL + 2 +AeccDbViewAlignmentSpiralLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_STAEQU_LABEL_GROUP + 2 +AeccDbViewAlignmentStaEquLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_STATION_LABEL_GROUP + 2 +AeccDbViewAlignmentStationLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_TABLE + 2 +AeccDbViewAlignmentTable + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_TANGENT_LABEL + 2 +AeccDbViewAlignmentTangentLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_VERTICAL_GEOMPT_LABELING + 2 +AeccDbViewAlignmentVAGeomPointLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_CURVE_TABLE + 2 +AeccDbViewCurveScheduleTable + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_FACE + 2 +AeccDbViewFace + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PARCEL_TABLE + 2 +AeccDbViewFaceScheduleTable + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_FEATURE + 2 +AeccDbViewFeature + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_FEATURE_LABEL + 2 +AeccDbViewFeatureLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_GENERAL_SEGMENT_LABEL + 2 +AeccDbViewGeneralLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_LEGEND_TABLE + 2 +AeccDbViewLegendScheduleTable + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PARCEL_SEGMENT + 2 +AeccDbViewLotLine + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_LINE_TABLE + 2 +AeccDbViewLotLineScheduleTable + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_NOTE_LABEL + 2 +AeccDbViewNoteLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_OFFSET_ELEV_LABEL + 2 +AeccDbViewOffsetElevLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PARCEL_BOUNDARY + 2 +AeccDbViewParcelBoundary + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PARCEL_SEGMENT_TABLE + 2 +AeccDbViewParcelSegmentTable + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_POINT_ENT + 2 +AeccDbViewPointEnt + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_POINT_GROUP + 2 +AeccDbViewPointGroup + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_POINT_TABLE + 2 +AeccDbViewPointScheduleTable + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PROFILE_VIEW_DEPTH_LABEL + 2 +AeccDbViewProfileViewDepthLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_RIGHT_OF_WAY + 2 +AeccDbViewRightofWay + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SAMPLELINE_LABELING + 2 +AeccDbViewSampleLineLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SECTION_GRADEBREAK_LABEL_GROUP + 2 +AeccDbViewSectionGradeBreakLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SECTION_MINOR_OFFSET_LABEL_GROUP + 2 +AeccDbViewSectionMinorOffsetLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SECTION_OFFSET_LABEL_GROUP + 2 +AeccDbViewSectionOffsetLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SECTION_SEGMENT_LABEL_GROUP + 2 +AeccDbViewSectionSegmentLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SECTION_VIEW_DEPTH_LABEL + 2 +AeccDbViewSectionViewDepthLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_STATION_ELEV_LABEL + 2 +AeccDbViewStaElevLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ALIGNMENT_STATION_OFFSET_LABEL + 2 +AeccDbViewStaOffsetLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SURFACE_CONTOUR_LABEL_GROUP + 2 +AeccDbViewSurfaceContourLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SURFACE_ELEVATION_LABEL + 2 +AeccDbViewSurfaceElevLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SURFACE_SLOPE_LABEL + 2 +AeccDbViewSurfaceSlopeLabel + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_TANGENT_INTERSECTION_TABLE + 2 +AeccDbViewTangentIntersectionTable + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_VALIGNMENT_CRESTCURVE_LABEL_GROUP + 2 +AeccDbViewVAlignmentCrestCurveLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_VALIGNMENT_HAGEOMPT_LABEL_GROUP + 2 +AeccDbViewVAlignmentHAGeomPointLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_VALIGNMENT_LINE_LABEL_GROUP + 2 +AeccDbViewVAlignmentLineLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_VALIGNMENT_MINOR_STATION_LABEL_GROUP + 2 +AeccDbViewVAlignmentMinorStationLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_VALIGNMENT_PVI_LABEL_GROUP + 2 +AeccDbViewVAlignmentPVILabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_VALIGNMENT_SAGCURVE_LABEL_GROUP + 2 +AeccDbViewVAlignmentSagCurveLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_VALIGNMENT_STATION_LABEL_GROUP + 2 +AeccDbViewVAlignmentStationLabeling + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_BLOCK + 2 +AeccuDbDispRepColBlock + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CIRCARC2D + 2 +AeccuDbDispRepColCircArc2d + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CONCOINCIDENT + 2 +AeccuDbDispRepColConCoincident + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CONCONCENTRIC + 2 +AeccuDbDispRepColConConcentric + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CONEQUALDISTANCE + 2 +AeccuDbDispRepColConEqualDistance + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CONMIDPOINT + 2 +AeccuDbDispRepColConMidpoint + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CONNORMAL + 2 +AeccuDbDispRepColConNormal + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CONPARALLEL + 2 +AeccuDbDispRepColConParallel + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CONPERPENDICULAR + 2 +AeccuDbDispRepColConPerpendicular + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CONSYMMETRIC + 2 +AeccuDbDispRepColConSymmetric + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CONTANGENT + 2 +AeccuDbDispRepColConTangent + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_CONNECTOR + 2 +AeccuDbDispRepColConnector + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_DIMANGLE + 2 +AeccuDbDispRepColDimAngle + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DCM_DIMRADIUS + 2 +AeccuDbDispRepColDimRadius + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_DIMDIAMETER + 2 +AeccuDbDispRepColDimDiameter + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_DIMDISTANCE + 2 +AeccuDbDispRepColDimDistance + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_DIMLENGTH + 2 +AeccuDbDispRepColDimLength + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_DIMMAJORRADIUS + 2 +AeccuDbDispRepColDimMajorRadius + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_DIMMINORRADIUS + 2 +AeccuDbDispRepColDimMinorRadius + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_ELLIPARC2D + 2 +AeccuDbDispRepColEllipArc2d + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_LAYOUTDATA + 2 +AeccuDbDispRepColLayoutData + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_LINE2D + 2 +AeccuDbDispRepColLine2d + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_MODIFIER_ADD + 2 +AeccuDbDispRepColModAdd + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_MODIFIER_CUTPLANE + 2 +AeccuDbDispRepColModCutPlane + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_MODIFIER_EXTRUSION + 2 +AeccuDbDispRepColModExtrusion + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_MODIFIER_GROUP + 2 +AeccuDbDispRepColModGroup + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_MODIFIER_PATH + 2 +AeccuDbDispRepColModPath + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_MODIFIER_SUBTRACT + 2 +AeccuDbDispRepColModSubtract + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_MODIFIER_TRANSITION + 2 +AeccuDbDispRepColModTransition + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_POINT2D + 2 +AeccuDbDispRepColPoint2d + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_PROFILE + 2 +AeccuDbDispRepColProfile + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_WORKPLANE + 2 +AeccuDbDispRepColWorkPlane + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_COL_WORKPLANE_REF + 2 +AeccuDbDispRepColWorkPlaneRef + 3 +AeccParamPart60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_GRAPHPROFILE_NETWORKPART + 2 +AeccDbDispRepGraphProfileNetworkPart + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_INTERFERENCE_PART + 2 +AeccDbDispRepInterference + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_INTERFERENCE_CHECK + 2 +AeccDbDispRepInterferenceCheck + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_NETWORK + 2 +AeccDbDispRepNetwork + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PIPE + 2 +AeccDbDispRepPipe + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SECTION_PIPENETWORK + 2 +AeccDbDispRepSectionPipeNetwork + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_STRUCTURE + 2 +AeccDbDispRepStructure + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PIPE_TABLE + 2 +AeccDbViewPipeAndStructureTable + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PIPE_LABELING + 2 +AeccDbViewPipeLabel + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PIPE_PROFILE_LABELING + 2 +AeccDbViewPipeProfileLabel + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_PIPE_SECTION_LABELING + 2 +AeccDbViewPipeSectionLabel + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SPANNING_PIPE_LABELING + 2 +AeccDbViewSpanningPipeLabel + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_STRUCTURE_LABELING + 2 +AeccDbViewStructureLabel + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_STRUCTURE_PROFILE_LABELING + 2 +AeccDbViewStructureProfileLabel + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_STRUCTURE_SECTION_LABELING + 2 +AeccDbViewStructureSectionLabel + 3 +AeccNetwork60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SECTION_CORRIDOR + 2 +AeccDbDispRepSectionCorridor + 3 +AeccRoadway60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_ASSEMBLY + 2 +AeccDbViewAssembly + 3 +AeccRoadway60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_CORRIDOR + 2 +AeccDbViewCorridor + 3 +AeccRoadway60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SUBASSEMBLY + 2 +AeccDbViewSubassembly + 3 +AeccRoadway60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SVFIGURE + 2 +AeccDbViewSvFigure + 3 +AeccSurvey60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_SVNETWORK + 2 +AeccDbViewSvNetwork + 3 +AeccSurvey60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_MATCH_LINE + 2 +AeccDbDispRepMatchLine + 3 +AeccPlanProd60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_VIEW_FRAME + 2 +AeccDbDispRepViewFrame + 3 +AeccPlanProd60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_MATCHLINE_LABELING + 2 +AeccDbViewMatchLineLabeling + 3 +AeccPlanProd60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_DISP_REP_VIEWFRAME_LABELING + 2 +AeccDbViewViewFrameLabeling + 3 +AeccPlanProd60|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 0 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ANCHOR_TAG_TO_ENT + 2 +AecDbDispRepAnchorTagToEnt + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ANCHOR_EXT_TAG_TO_ENT + 2 +AecDbDispRepAnchorExtendedTagToEnt + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_BDG_ELEVLINE_MODEL + 2 +AecDbDispRepBdgElevLineModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_CLIP_VOLUME + 2 +AecDbDispPropsClipVol + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_BDG_SECTIONLINE_PLAN + 2 +AecDbDispRepBdgElevLinePlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_BDG_ELEVLINE_RCP + 2 +AecDbDispRepBdgElevLineRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_BDG_SECTIONLINE_MODEL + 2 +AecDbDispRepBdgSectionLineModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_BDG_SECTIONLINE_PLAN + 2 +AecDbDispRepBdgSectionLinePlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_BDG_SECTIONLINE_RCP + 2 +AecDbDispRepBdgSectionLineRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_BDG_SECTION_MODEL + 2 +AecDbDispRepBdgSectionModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_BDG_SECTION_SUBDIV + 2 +AecDbDispRepBdgSectionSubDiv + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_CLIP_VOLUME_RESULT + 2 +AecDbDispPropsClipVolResSubDiv + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CEILING_GRID + 2 +AecDbDispRepCeilingGrid + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 893 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CEILING_GRID_MODEL + 2 +AecDbDispRepCeilingGridModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CEILING_GRID_RCP + 2 +AecDbDispRepCeilingGridRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CURTAIN_WALL_LAYOUT_MODEL + 2 +AecDbDispRepCurtainWallLayoutModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_GRID_ASSEMBLY_MODEL + 2 +AecDbDispPropsGridAssemblyModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CURTAIN_WALL_LAYOUT_PLAN + 2 +AecDbDispRepCurtainWallLayoutPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_GRID_ASSEMBLY_PLAN + 2 +AecDbDispPropsGridAssemblyPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CURTAIN_WALL_UNIT_MODEL + 2 +AecDbDispRepCurtainWallUnitModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CURTAIN_WALL_UNIT_PLAN + 2 +AecDbDispRepCurtainWallUnitPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DOOR_MODEL + 2 +AecDbDispRepDoorModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_DOOR + 2 +AecDbDispPropsDoor + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DOOR_ELEV + 2 +AecDbDispRepDoorElev + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DOOR_PLAN + 2 +AecDbDispRepDoorPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DOOR_NOMINAL + 2 +AecDbDispRepDoorNominal + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_DOOR_NOMINAL + 2 +AecDbDispPropsDoorNominal + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DOOR_RCP + 2 +AecDbDispRepDoorRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DOOR_THRESHOLD_PLAN + 2 +AecDbDispRepDoorThresholdPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_DOOR_THRESHOLD_PLAN + 2 +AecDbDispPropsDoorThresholdPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MASKBLOCK_REF_RCP + 2 +AecDbDispRepMaskBlockRefRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_MASKBLOCK + 2 +AecDbDispPropsMaskBlock + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MASS_ELEM_RCP + 2 +AecDbDispRepMassElemRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MASS_GROUP_RCP + 2 +AecDbDispRepMassGroupRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MVBLOCK_REF_RCP + 2 +AecDbDispRepMvBlockRefRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_OPENING + 2 +AecDbDispRepOpening + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_OPENING + 2 +AecDbDispPropsOpening + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_OPENING_MODEL + 2 +AecDbDispRepOpeningModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_RAILING_MODEL + 2 +AecDbDispRepRailingModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_RAILING_MODEL + 2 +AecDbDispPropsRailingModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_RAILING_PLAN + 2 +AecDbDispRepRailingPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_RAILING_PLAN + 2 +AecDbDispPropsRailingPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ROOF_MODEL + 2 +AecDbDispRepRoofModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_ROOF + 2 +AecDbDispPropsRoof + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ROOF_PLAN + 2 +AecDbDispRepRoofPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ROOF_RCP + 2 +AecDbDispRepRoofRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_SLAB_MODEL + 2 +AecDbDispRepSlabModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_SLAB + 2 +AecDbDispPropsSlab + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ROOFSLAB_MODEL + 2 +AecDbDispRepRoofSlabModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_ROOFSLAB + 2 +AecDbDispPropsRoofSlab + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_SLAB_PLAN + 2 +AecDbDispRepSlabPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_SLAB_PLAN + 2 +AecDbDispPropsSlabPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ROOFSLAB_PLAN + 2 +AecDbDispRepRoofSlabPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_ROOFSLAB_PLAN + 2 +AecDbDispPropsRoofSlabPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_SPACE_DECOMPOSED + 2 +AecDbDispRepSpaceDecomposed + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_SPACE_DECOMPOSED + 2 +AecDbDispPropsSpaceDecomposed + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_SPACE_MODEL + 2 +AecDbDispRepSpaceModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_SPACE_MODEL + 2 +AecDbDispPropsSpaceModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_SPACE_PLAN + 2 +AecDbDispRepSpacePlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_SPACE_PLAN + 2 +AecDbDispPropsSpacePlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_SPACE_RCP + 2 +AecDbDispRepSpaceRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_SPACE_VOLUME + 2 +AecDbDispRepSpaceVolume + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_STAIR_MODEL + 2 +AecDbDispRepStairModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_STAIR_MODEL + 2 +AecDbDispPropsStairModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_STAIR_PLAN + 2 +AecDbDispRepStairPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_STAIR_PLAN + 2 +AecDbDispPropsStairPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_STAIR_PLAN_OVERLAPPING + 2 +AecDbDispRepStairPlanOverlapping + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_STAIR_PLAN_OVERLAPPING + 2 +AecDbDispPropsStairPlanOverlapping + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_STAIR_RCP + 2 +AecDbDispRepStairRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WALL_GRAPH + 2 +AecDbDispRepWallGraph + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_WALL_GRAPH + 2 +AecDbDispPropsWallGraph + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WALL_MODEL + 2 +AecDbDispRepWallModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_WALL_MODEL + 2 +AecDbDispPropsWallModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WALL_PLAN + 2 +AecDbDispRepWallPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_WALL_PLAN + 2 +AecDbDispPropsWallPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WALL_RCP + 2 +AecDbDispRepWallRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WALL_SCHEM + 2 +AecDbDispRepWallSchem + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_WALL_SCHEM + 2 +AecDbDispPropsWallSchem + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOW_ASSEMBLY_MODEL + 2 +AecDbDispRepWindowAssemblyModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOW_ASSEMBLY_PLAN + 2 +AecDbDispRepWindowAssemblyPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOWASSEMBLY_SILL_PLAN + 2 +AecDbDispRepWindowAssemblySillPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_WINDOW_ASSEMBLY_SILL_PLAN + 2 +AecDbDispPropsWindowAssemblySillPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOW_MODEL + 2 +AecDbDispRepWindowModel + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_WINDOW + 2 +AecDbDispPropsWindow + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOW_ELEV + 2 +AecDbDispRepWindowElev + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOW_PLAN + 2 +AecDbDispRepWindowPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOW_NOMINAL + 2 +AecDbDispRepWindowNominal + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_WINDOW_NOMINAL + 2 +AecDbDispPropsWindowNominal + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOW_RCP + 2 +AecDbDispRepWindowRcp + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOW_SILL_PLAN + 2 +AecDbDispRepWindowSillPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_WINDOW_SILL_PLAN + 2 +AecDbDispPropsWindowSillPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ZONE + 2 +AecDbDispRepZone + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_ZONE + 2 +AecDbDispPropsZone + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_2D_SECTION + 2 +AecDbDispRep2dSection + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_2D_SECTION + 2 +AecDbDispProps2dSection + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ANCHOR + 2 +AecDbDispRepAnchor + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ANCHOR_ENT_TO_NODE + 2 +AecDbDispRepAnchorEntToNode + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CLIP_VOLUME_MODEL + 2 +AecDbDispRepClipVolModel + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CLIP_VOLUME_PLAN + 2 +AecDbDispRepClipVolPlan + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CLIP_VOLUME_RESULT + 2 +AecDbDispRepClipVolResult + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CLIP_VOLUME_RESULT_SUBDIV + 2 +AecDbDispRepClipVolResSubDiv + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DISPLAYTHEME + 2 +AecDbDispRepDisplayTheme + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_DISPLAYTHEME + 2 +AecDbDispPropsDisplayTheme + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_EDITINPLACEPROFILE + 2 +AecDbDispRepEditInPlaceProfile + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_EDITINPLACEPROFILE_MODEL + 2 +AecDbDispPropsEditInPlaceProfile + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_ENT_REF + 2 +AecDbDispRepEntRef + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_ENT_REF + 2 +AecDbDispPropsEntRef + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_LAYOUT_CURVE + 2 +AecDbDispRepLayoutCurve + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_LAYOUT_CURVE + 2 +AecDbDispPropsLayoutCurve + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_LAYOUT_GRID2D + 2 +AecDbDispRepLayoutGrid2d + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_LAYOUT_GRID3D + 2 +AecDbDispRepLayoutGrid3d + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_LAYOUT_GRID3D + 2 +AecDbDispPropsLayoutGrid3d + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MASKBLOCK_REF + 2 +AecDbDispRepMaskBlockRef + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MATERIAL + 2 +AecDbDispRepMaterial + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_MATERIAL + 2 +AecDbDispPropsMaterial + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MVBLOCK_REF + 2 +AecDbDispRepMvBlockRef + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_MVBLOCK_REF_MODEL + 2 +AecDbDispRepMvBlockRefModel + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_POLYGON_MODEL + 2 +AecDbDispRepPolygonModel + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_POLYGON_MODEL + 2 +AecDbDispPropsPolygonModel + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_POLYGON_TRUECOLOUR + 2 +AecDbDispRepPolygonTrueColour + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_POLYGON_TRUECOLOUR + 2 +AecDbDispPropsPolygonTrueColour + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_SLICE + 2 +AecDbDispRepSlice + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_SLICE + 2 +AecDbDispPropsSlice + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_SET + 2 +AecDbDispRepSet + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_CONFIG + 2 +AecDbDispRepConfig + 3 +AecBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +WIPEOUTVARIABLES + 2 +AcDbWipeoutVariables + 3 +"WipeOut|Product Desc: WipeOut Dbx Application|Company: Autodesk, Inc.|WEB Address: www.autodesk.com" + 90 + 0 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_REFEDIT_STATUS_TRACKER + 2 +AecDbRefEditStatusTracker + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPBDGELEVLINEPLAN100 + 2 +AecDbDispRepBdgElevLinePlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPBDGSECTIONLINEPLAN100 + 2 +AecDbDispRepBdgSectionLinePlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPCEILINGGRIDPLAN100 + 2 +AecDbDispRepCeilingGridPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPCOLUMNGRIDPLAN100 + 2 +AecDbDispRepColumnGridPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPCURTAINWALLLAYOUTPLAN100 + 2 +AecDbDispRepCurtainWallLayoutPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPCURTAINWALLUNITPLAN100 + 2 +AecDbDispRepCurtainWallUnitPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPMVBLOCKREFPLAN100 + 2 +AecDbDispRepMvBlockRefPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPROOFPLAN100 + 2 +AecDbDispRepRoofPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPROOFSLABPLAN100 + 2 +AecDbDispRepRoofSlabPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPSLABPLAN100 + 2 +AecDbDispRepSlabPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPSPACEPLAN100 + 2 +AecDbDispRepSpacePlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPWALLPLAN100 + 2 +AecDbDispRepWallPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPWINDOWASSEMBLYPLAN100 + 2 +AecDbDispRepWindowAssemblyPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPZONE100 + 2 +AecDbDispRepZonePlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPBDGELEVLINEPLAN50 + 2 +AecDbDispRepBdgElevLinePlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPBDGSECTIONLINEPLAN50 + 2 +AecDbDispRepBdgSectionLinePlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPCEILINGGRIDPLAN50 + 2 +AecDbDispRepCeilingGridPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPCOLUMNGRIDPLAN50 + 2 +AecDbDispRepColumnGridPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPCURTAINWALLLAYOUTPLAN50 + 2 +AecDbDispRepCurtainWallLayoutPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPCURTAINWALLUNITPLAN50 + 2 +AecDbDispRepCurtainWallUnitPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPMVBLOCKREFPLAN50 + 2 +AecDbDispRepMvBlockRefPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPROOFPLAN50 + 2 +AecDbDispRepRoofPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPROOFSLABPLAN50 + 2 +AecDbDispRepRoofSlabPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPSLABPLAN50 + 2 +AecDbDispRepSlabPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPSPACEPLAN50 + 2 +AecDbDispRepSpacePlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPWALLPLAN50 + 2 +AecDbDispRepWallPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPWINDOWASSEMBLYPLAN50 + 2 +AecDbDispRepWindowAssemblyPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_AECDBDISPREPZONE50 + 2 +AecDbDispRepZonePlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DB_DISP_REP_DIM_GROUP_PLAN100 + 2 +AecDbDispRepDimGroupPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_DIM + 2 +AecDbDispPropsDimGroup + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DB_DISP_REP_DIM_GROUP_PLAN50 + 2 +AecDbDispRepDimGroupPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DB_DISP_REP_DIM_GROUP_PLAN + 2 +AecDbDispRepDimGroupPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DOOR_PLAN_50 + 2 +AecDbDispRepDoorPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_DOOR_PLAN_50 + 2 +AecDbDispPropsDoorPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DOOR_PLAN_HEKTO + 2 +AecDbDispRepDoorPlanHekto + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_DOOR_PLAN_100 + 2 +AecDbDispPropsDoorPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_DOOR_THRESHOLD_SYMBOL_PLAN + 2 +AecDbDispRepDoorThresholdSymbolPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_DOOR_THRESHOLD_SYMBOL_PLAN + 2 +AecDbDispPropsDoorThresholdSymbolPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPREPAECDBDISPREPMASSELEMPLAN100 + 2 +AecDbDispRepMassElemPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPROPSMASSELEMPLANCOMMON + 2 +AecDbDispPropsMassElemPlanCommon + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPREPAECDBDISPREPMASSELEMPLAN50 + 2 +AecDbDispRepMassElemPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPREPAECDBDISPREPMASSGROUPPLAN100 + 2 +AecDbDispRepMassGroupPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPROPSMASSGROUPPLANCOMMON + 2 +AecDbDispPropsMassGroupPlanCommon + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPREPAECDBDISPREPMASSGROUPPLAN50 + 2 +AecDbDispRepMassGroupPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPREPAECDBDISPREPOPENINGPLAN100 + 2 +AecDbDispRepOpeningPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPROPSOPENINGPLANCOMMONHATCHED + 2 +AecDbDispPropsOpeningPlanCommonHatched + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPREPAECDBDISPREPOPENINGPLAN50 + 2 +AecDbDispRepOpeningPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPREPAECDBDISPREPOPENINGPLANREFLECTED + 2 +AecDbDispRepOpeningPlanReflected + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPROPSOPENINGPLANCOMMON + 2 +AecDbDispPropsOpeningPlanCommon + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPREPAECDBDISPREPOPENINGSILLPLAN + 2 +AecDbDispRepOpeningSillPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISPROPSOPENINGSILLPLAN + 2 +AecDbDispPropsOpeningSillPlan + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_RAILING_PLAN_100 + 2 +AecDbDispRepRailingPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_ROPS_RAILING_PLAN_100 + 2 +AecDbDispPropsRailingPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_RAILING_PLAN_50 + 2 +AecDbDispRepRailingPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_ROPS_RAILING_PLAN_50 + 2 +AecDbDispPropsRailingPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_STAIR_PLAN_100 + 2 +AecDbDispRepStairPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_ROPS_STAIR_PLAN_100 + 2 +AecDbDispPropsStairPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_STAIR_PLAN_50 + 2 +AecDbDispRepStairPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_ROPS_STAIR_PLAN_50 + 2 +AecDbDispPropsStairPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOW_PLAN_100 + 2 +AecDbDispRepWindowPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_WINDOW_PLAN_100 + 2 +AecDbDispPropsWindowPlan100 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_WINDOW_PLAN_50 + 2 +AecDbDispRepWindowPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_WINDOW_PLAN_50 + 2 +AecDbDispPropsWindowPlan50 + 3 +AecArchBase80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_REP_SCHEDULE_TABLE + 2 +AecDbDispRepScheduleTable + 3 +AecSchedule80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +AEC_DISP_PROPS_SCHEDULE_TABLE + 2 +AecDbDispPropsScheduleTable + 3 +AecSchedule80|Product Desc: Autodesk Architectural Desktop 2007 |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 129 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACAD_EVALUATION_GRAPH + 2 +AcDbEvalGraph + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACAECUSTOBJ + 2 +AcAeEditorObj + 3 +AcAeEditorObj + 90 + 1024 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION + 2 +AcDbDynamicBlockPurgePreventer + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +DIMASSOC + 2 +AcDbDimAssoc + 3 +"AcDbDimAssoc|Product Desc: AcDim ARX App For Dimension|Company: Autodesk, Inc.|WEB Address: www.autodesk.com" + 90 + 0 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ABSHDRAWINGSETTING + 2 +AbShDrawingSetting + 3 +AbShDrawingSetting + 90 + 1 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +AECC_TAG_MANAGER + 2 +AeccDbTagManager + 3 +AeccLand70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com + 90 + 3071 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +RASTERVARIABLES + 2 +AcDbRasterVariables + 3 +ISM + 90 + 0 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SOLID_BACKGROUND + 2 +AcDbSolidBackground + 3 +SCENEOE + 90 + 4095 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +MULTILEADER + 2 +AcDbMLeader + 3 +ACDB_MLEADER_CLASS + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +BLOCKLINEARPARAMETER + 2 +AcDbBlockLinearParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKLINEARGRIP + 2 +AcDbBlockLinearGrip + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKGRIPLOCATIONCOMPONENT + 2 +AcDbBlockGripExpr + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKSTRETCHACTION + 2 +AcDbBlockStretchAction + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKPOINTPARAMETER + 2 +AcDbBlockPointParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKXYGRIP + 2 +AcDbBlockXYGrip + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKSCALEACTION + 2 +AcDbBlockScaleAction + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKLOOKUPPARAMETER + 2 +AcDbBlockLookupParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKLOOKUPGRIP + 2 +AcDbBlockLookupGrip + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKLOOKUPACTION + 2 +AcDbBlockLookupAction + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKFLIPPARAMETER + 2 +AcDbBlockFlipParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKFLIPACTION + 2 +AcDbBlockFlipAction + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKFLIPGRIP + 2 +AcDbBlockFlipGrip + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKVISIBILITYPARAMETER + 2 +AcDbBlockVisibilityParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKVISIBILITYGRIP + 2 +AcDbBlockVisibilityGrip + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKMOVEACTION + 2 +AcDbBlockMoveAction + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDB_BLOCKREPRESENTATION_DATA + 2 +AcDbBlockRepresentationData + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +XYGRIPENTITY + 2 +AcDbBlockXYGripEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +ACAEEEMGROBJ + 2 +AcAeEEMgrObj + 3 +AcAeEEMgrObj + 90 + 1024 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +POINTPARAMETERENTITY + 2 +AcDbBlockPointParameterEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +STRETCHACTIONENTITY + 2 +AcDbBlockStretchActionEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +FLIPGRIPENTITY + 2 +AcDbBlockFlipGripEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +FLIPPARAMETERENTITY + 2 +AcDbBlockFlipParameterEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +FLIPACTIONENTITY + 2 +AcDbBlockFlipActionEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +LINEARGRIPENTITY + 2 +AcDbBlockLinearGripEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +LINEARPARAMETERENTITY + 2 +AcDbBlockLinearParameterEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +VISIBILITYGRIPENTITY + 2 +AcDbBlockVisibilityGripEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +VISIBILITYPARAMETERENTITY + 2 +AcDbBlockVisibilityParameterEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +BLOCKROTATIONPARAMETER + 2 +AcDbBlockRotationParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKROTATIONGRIP + 2 +AcDbBlockRotationGrip + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ROTATIONGRIPENTITY + 2 +AcDbBlockRotationGripEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +ROTATIONPARAMETERENTITY + 2 +AcDbBlockRotationParameterEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +BLOCKROTATEACTION + 2 +AcDbBlockRotateAction + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ROTATEACTIONENTITY + 2 +AcDbBlockRotateActionEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +FIELD + 2 +AcDbField + 3 +ObjectDBX Classes + 90 + 1152 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKBASEPOINTPARAMETER + 2 +AcDbBlockBasepointParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +FIELDLIST + 2 +AcDbFieldList + 3 +ObjectDBX Classes + 90 + 1152 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +MOVEACTIONENTITY + 2 +AcDbBlockMoveActionEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +SCALEACTIONENTITY + 2 +AcDbBlockScaleActionEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +LOOKUPPARAMETERENTITY + 2 +AcDbBlockLookupParameterEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +LOOKUPGRIPENTITY + 2 +AcDbBlockLookupGripEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +LOOKUPACTIONENTITY + 2 +AcDbBlockLookupActionEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +BLOCKARRAYACTION + 2 +AcDbBlockArrayAction + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ARRAYACTIONENTITY + 2 +AcDbBlockArrayActionEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +BLOCKXYPARAMETER + 2 +AcDbBlockXYParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +XYPARAMETERENTITY + 2 +AcDbBlockXYParameterEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +BLOCKPOLARPARAMETER + 2 +AcDbBlockPolarParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKPOLARGRIP + 2 +AcDbBlockPolarGrip + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +POLARGRIPENTITY + 2 +AcDbBlockPolarGripEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +POLARPARAMETERENTITY + 2 +AcDbBlockPolarParameterEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +ACAD_TABLE + 2 +AcDbTable + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +TABLECONTENT + 2 +AcDbTableContent + 3 +ObjectDBX Classes + 90 + 1152 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +TABLEGEOMETRY + 2 +AcDbTableGeometry + 3 +ObjectDBX Classes + 90 + 1152 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBASSOCNETWORK + 2 +AcDbAssocNetwork + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBASSOC2DCONSTRAINTGROUP + 2 +AcDbAssoc2dConstraintGroup + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBASSOCGEOMDEPENDENCY + 2 +AcDbAssocGeomDependency + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBASSOCVALUEDEPENDENCY + 2 +AcDbAssocValueDependency + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBASSOCDEPENDENCY + 2 +AcDbAssocDependency + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKPARAMDEPENDENCYBODY + 2 +AcDbBlockParameterDependencyBody + 3 +ObjectDBX Classes + 90 + 1 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBASSOCVARIABLE + 2 +AcDbAssocVariable + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKHORIZONTALCONSTRAINTPARAMETER + 2 +AcDbBlockHorizontalConstraintParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDB_DYNAMICBLOCKPROXYNODE + 2 +AcDbDynamicBlockProxyNode + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKVERTICALCONSTRAINTPARAMETER + 2 +AcDbBlockVerticalConstraintParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKRADIALCONSTRAINTPARAMETER + 2 +AcDbBlockRadialConstraintParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKPROPERTIESTABLE + 2 +AcDbBlockPropertiesTable + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKPROPERTIESTABLEGRIP + 2 +AcDbBlockPropertiesTableGrip + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKUSERPARAMETER + 2 +AcDbBlockUserParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ASSOCDIMDEPENDENCYBODY + 2 +AcDbAssocDimDependencyBody + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDB_BLKREFOBJECTCONTEXTDATA_CLASS + 2 +AcDbBlkRefObjectContextData + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BASEPOINTPARAMETERENTITY + 2 +AcDbBlockBasepointParameterEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +BLOCKALIGNMENTPARAMETER + 2 +AcDbBlockAlignmentParameter + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +BLOCKALIGNMENTGRIP + 2 +AcDbBlockAlignmentGrip + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ALIGNMENTGRIPENTITY + 2 +AcDbBlockAlignmentGripEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +ALIGNMENTPARAMETERENTITY + 2 +AcDbBlockAlignmentParameterEntity + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +ZRXEBBLOCKEDITORCUSTOBJ + 2 +CZrxEbBlockEditorObject + 3 +CZrxEbBlockEditorObject + 90 + 1024 + 91 + 0 +280 + 1 +281 + 0 + 0 +CLASS + 1 +PLOTSETTINGS + 2 +AcDbPlotSettings + 3 +ObjectDBX Classes + 90 + 0 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +DBCOLOR + 2 +AcDbColor + 3 +ObjectDBX Classes + 90 + 0 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +GEODATA + 2 +AcDbGeoData + 3 +ObjectDBX Classes + 90 + 4095 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBSECTIONVIEWSTYLE + 2 +AcDbSectionViewStyle + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBDETAILVIEWSTYLE + 2 +AcDbDetailViewStyle + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ZRXEBBLOCKEDITORCUSTOBJ + 2 +CZwCbBlockEditorObject + 3 +CZwCbBlockEditorObject + 90 + 1024 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +TAGROOTDATA + 2 +ZcDbTagRootData + 3 +ObjectDBX Classes + 90 + 0 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +TAG_EVALGRAPH + 2 +ZcDbTagEvalGraph + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SWR_DBCONFIG + 2 +TDbConfig + 3 +"SWR_ARCHCORE" + 90 + 1 + 91 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +RAPIDRTRENDERSETTINGS + 2 +AcDbRapidRTRenderSettings + 3 +ObjectDBX Classes + 90 + 1024 + 91 + 0 +280 + 0 +281 + 0 + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +27 +330 +0 +100 +AcDbSymbolTable + 70 + 1 +1001 +ACAD +1000 +DbSaveVer +1071 + 278 + 0 +VPORT + 5 +28 +330 +27 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord + 2 +*Active + 70 + 0 + 10 +0.0 + 20 +0.0 + 11 +1.0 + 21 +1.0 + 12 +93.15340734545975 + 22 +159.9433954948966 + 13 +0.0 + 23 +0.0 + 14 +10.0 + 24 +10.0 + 15 +10.0 + 25 +10.0 + 16 +0.0 + 26 +0.0 + 36 +1.0 + 17 +0.0 + 27 +0.0 + 37 +0.0 + 40 +510.4335479279375 + 41 +1.747457627118644 + 42 +50.0 + 43 +0.0 + 44 +0.0 + 50 +0.0 + 51 +0.0 + 71 + 0 + 72 + 100 + 73 + 1 + 74 + 3 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 +281 + 0 + 65 + 1 +110 +0.0 +120 +0.0 +130 +0.0 +111 +1.0 +121 +0.0 +131 +0.0 +112 +0.0 +122 +1.0 +132 +0.0 + 79 + 0 +146 +0.0 +348 +29 + 60 + 3 + 61 + 5 +292 + 1 +282 + 1 +141 +0.0 +142 +0.0 + 63 + 250 +421 + 3355443 +1001 +ACAD_NAV_VCDISPLAY +1070 + 3 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +23 +330 +0 +100 +AcDbSymbolTable + 70 + 3 + 0 +LTYPE + 5 +24 +330 +23 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByBlock + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +12 +330 +23 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByLayer + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +11 +330 +23 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +Continuous + 70 + 0 + 3 +Solid line + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +ENDTAB + 0 +TABLE + 2 +LAYER + 5 +1E +102 +{ACAD_XDICTIONARY +360 +1F +102 +} +330 +0 +100 +AcDbSymbolTable + 70 + 16 + 0 +LAYER + 5 +6 +102 +{ACAD_XDICTIONARY +360 +7 +102 +} +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0 + 70 + 0 + 62 + 7 + 6 +Continuous +370 + -3 +390 +9 +347 +D +348 +0 + 0 +LAYER + 5 +68 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +!!NOPRINT + 70 + 0 + 62 + 136 + 6 +Continuous +290 + 0 +370 + 9 +390 +9 +347 +D +348 +0 + 0 +LAYER + 5 +B6 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_pole_1 + 70 + 0 + 62 + 7 + 6 +Continuous +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 + 0 +LAYER + 5 +91 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_pole_2 + 70 + 0 + 62 + 7 + 6 +Continuous +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 + 0 +LAYER + 5 +7E +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_pola_3 + 70 + 0 + 62 + 7 + 6 +Continuous +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 + 0 +LAYER + 5 +71 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_pole_4 + 70 + 0 + 62 + 7 + 6 +Continuous +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 + 0 +LAYER + 5 +6A +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_pole_5 + 70 + 0 + 62 + 7 + 6 +Continuous +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 + 0 +LAYER + 5 +85 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_pole_6 + 70 + 0 + 62 + 7 + 6 +Continuous +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 + 0 +LAYER + 5 +C3 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_pole_7 + 70 + 0 + 62 + 7 + 6 +Continuous +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 + 0 +LAYER + 5 +DD +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_pole_8 + 70 + 0 + 62 + 7 + 6 +Continuous +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 + 0 +LAYER + 5 +19D +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_Orientační schéma + 70 + 0 + 62 + 7 + 6 +Continuous +290 + 0 +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 +1001 +AcAecLayerStandard +1000 + +1000 + + 0 +LAYER + 5 +1A6 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_logo1 + 70 + 0 + 62 + 7 + 6 +Continuous +290 + 0 +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 +1001 +AcAecLayerStandard +1000 + +1000 + + 0 +LAYER + 5 +1A8 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_logo2 + 70 + 0 + 62 + 7 + 6 +Continuous +290 + 0 +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 +1001 +AcAecLayerStandard +1000 + +1000 + + 0 +LAYER + 5 +1A0 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_logo3 + 70 + 0 + 62 + 7 + 6 +Continuous +290 + 0 +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 +1001 +AcAecLayerStandard +1000 + +1000 + + 0 +LAYER + 5 +1A2 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_logo4 + 70 + 0 + 62 + 7 + 6 +Continuous +290 + 0 +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 +1001 +AcAecLayerStandard +1000 + +1000 + + 0 +LAYER + 5 +1A4 +330 +1E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Rozpiska_logo5 + 70 + 0 + 62 + 7 + 6 +Continuous +290 + 0 +370 + 0 +390 +9 +347 +D +348 +0 +1001 +AcCmTransparency +1071 + 33554687 +1001 +AcAecLayerStandard +1000 + +1000 + + 0 +ENDTAB + 0 +TABLE + 2 +STYLE + 5 +22 +330 +0 +100 +AcDbSymbolTable + 70 + 12 + 0 +STYLE + 5 +30 +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Standard + 70 + 0 + 40 +0.0 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +2.5 + 3 +txt + 4 + + 0 +STYLE + 5 +7F +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Název pole + 70 + 0 + 40 +0.15 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +verdana.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 60967 + 0 +STYLE + 5 +12C +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Název objektu + 70 + 0 + 40 +0.18 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +verdanab.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 33615399 + 0 +STYLE + 5 +77 +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Popis základní + 70 + 0 + 40 +0.18 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +verdana.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 60967 + 0 +STYLE + 5 +FF +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Označení hlavní + 70 + 0 + 40 +0.25 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +verdanab.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 33615399 + 0 +STYLE + 5 +128 +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Název přílohy + 70 + 0 + 40 +0.18 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.18 + 3 +verdana.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 60967 + 0 +STYLE + 5 +6F +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Kódování + 70 + 0 + 40 +0.12 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.12 + 3 +verdana.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 60962 + 0 +STYLE + 5 +86 +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Popis identifikace + 70 + 0 + 40 +0.18 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.5 + 3 +verdana.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 60967 + 0 +STYLE + 5 +98 +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Název subjektu + 70 + 0 + 40 +0.2 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +verdanab.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 33615399 + 0 +STYLE + 5 +104 +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Název stavby + 70 + 0 + 40 +0.3 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +verdanab.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 33615399 + 0 +STYLE + 5 +108 +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Popis revize + 70 + 0 + 40 +0.15 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +verdana.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 60967 + 0 +STYLE + 5 +12A +330 +22 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Název přílohy hlavní + 70 + 0 + 40 +0.25 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +verdana.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 60967 + 0 +ENDTAB + 0 +TABLE + 2 +VIEW + 5 +25 +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +26 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +2C +330 +0 +100 +AcDbSymbolTable + 70 + 9 + 0 +APPID + 5 +2D +330 +2C +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD + 70 + 0 + 0 +APPID + 5 +C +330 +2C +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ADE + 70 + 0 + 0 +APPID + 5 +17 +330 +2C +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +AcDbDynamicBlockGUID + 70 + 0 + 0 +APPID + 5 +16 +330 +2C +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD_PSEXT + 70 + 0 + 0 +APPID + 5 +2B +330 +2C +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD_NAV_VCDISPLAY + 70 + 0 + 0 +APPID + 5 +6B +330 +2C +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +AcCmTransparency + 70 + 0 + 0 +APPID + 5 +18 +330 +2C +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAUTHENVIRON + 70 + 0 + 0 +APPID + 5 +19E +330 +2C +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +AcAecLayerStandard + 70 + 0 + 0 +APPID + 5 +1E3 +330 +2C +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD_EXEMPT_FROM_CAD_STANDARDS + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +2E +330 +0 +100 +AcDbSymbolTable + 70 + 1 +100 +AcDbDimStyleTable + 71 + 1 +340 +2F + 0 +DIMSTYLE +105 +2F +330 +2E +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord + 2 +Standard + 70 + 0 +340 +30 + 0 +ENDTAB + 0 +TABLE + 2 +BLOCK_RECORD + 5 +1 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +BLOCK_RECORD + 5 +2 +102 +{ACAD_XDICTIONARY +360 +3 +102 +} +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Model_Space +340 +14 + 70 + 0 +280 + 1 +281 + 0 +1001 +AcDbDynamicBlockGUID +1000 +{3DB88E8A-552C-EC4A-94A5-C2A76022FBFB} +1001 +ACAUTHENVIRON +1005 +0 + 0 +BLOCK_RECORD + 5 +19 +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Paper_Space +340 +1C + 70 + 0 +280 + 1 +281 + 0 + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +BLOCKS + 0 +BLOCK + 5 +5 +330 +2 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*Model_Space + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Model_Space + 1 + + 0 +ENDBLK + 5 +13 +330 +2 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +1A +330 +19 +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockBegin + 2 +*Paper_Space + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Paper_Space + 1 + + 0 +ENDBLK + 5 +1B +330 +19 +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockEnd + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +LWPOLYLINE + 5 +67 +330 +2 +100 +AcDbEntity + 8 +!!NOPRINT +100 +AcDbPolyline + 90 + 5 + 70 + 1 + 43 +0.0 + 10 +0.0 + 20 +0.0 + 10 +210.0 + 20 +0.0 + 10 +210.0 + 20 +297.0000000000005 + 10 +0.0 + 20 +297.0000000000005 + 10 +0.0 + 20 +0.0 + 0 +LINE + 5 +69 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_5 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +59.78723404255319 + 20 +145.0000000000001 + 30 +0.0 + 11 +59.78723404255319 + 21 +165.0000000000001 + 31 +0.0 + 0 +TEXT + 5 +6E +330 +2 +100 +AcDbEntity + 8 +!!NOPRINT + 62 + 7 +100 +AcDbText + 10 +20.5 + 20 +18.30000000004668 + 30 +0.0 + 40 +1.199999999953432 + 1 +[Prostor pro další informace] + 7 +Kódování + 11 +20.5 + 21 +19.50000000000011 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +LINE + 5 +70 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +157.4468085106382 + 20 +170.0000000000001 + 30 +0.0 + 11 +157.4468085106382 + 21 +195.0000000000001 + 31 +0.0 + 0 +LINE + 5 +72 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.0 + 20 +190.0000000000001 + 30 +0.0 + 11 +190.0 + 21 +190.0000000000001 + 31 +0.0 + 0 +LINE + 5 +73 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.0 + 20 +185.0000000000001 + 30 +0.0 + 11 +190.0 + 21 +185.0000000000001 + 31 +0.0 + 0 +LINE + 5 +74 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.0 + 20 +180.0000000000001 + 30 +0.0 + 11 +190.0 + 21 +180.0000000000001 + 31 +0.0 + 0 +LINE + 5 +75 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.0 + 20 +175.0000000000001 + 30 +0.0 + 11 +190.0 + 21 +175.0000000000001 + 31 +0.0 + 0 +TEXT + 5 +76 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +158.993207153344 + 20 +191.6533147154842 + 30 +0.0 + 40 +1.800000000046565 + 1 +Kontroloval: + 7 +Popis základní + 11 +158.993207153344 + 21 +193.4533147155308 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +78 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.33363268525901 + 20 +191.6533147154842 + 30 +0.0 + 40 +1.800000000046565 + 1 +Popis: + 7 +Popis základní + 11 +61.33363268525901 + 21 +193.4533147155308 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +79 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +39.63150502568451 + 20 +191.6533147154842 + 30 +0.0 + 40 +1.800000000046565 + 1 +Datum: + 7 +Popis základní + 11 +39.63150502568451 + 21 +193.4533147155308 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +LINE + 5 +7A +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +38.0851063829787 + 20 +170.0000000000001 + 30 +0.0 + 11 +38.0851063829787 + 21 +195.0000000000001 + 31 +0.0 + 0 +TEXT + 5 +7B +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +191.6533147154842 + 30 +0.0 + 40 +1.800000000046565 + 1 +Revize: + 7 +Popis základní + 11 +21.54639864270581 + 21 +193.4533147155308 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +LINE + 5 +7C +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +59.78723404255319 + 20 +170.0000000000001 + 30 +0.0 + 11 +59.78723404255319 + 21 +195.0000000000001 + 31 +0.0 + 0 +TEXT + 5 +7D +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pola_3 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +132.6500000000233 + 20 +232.5000000000001 + 30 +0.0 + 40 +1.5 + 1 +Razítko oprávněné osoby: + 7 +Název pole + 11 +132.6500000000233 + 21 +234.0000000000001 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +LINE + 5 +80 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pola_3 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +131.6500000000233 + 20 +200.0000000000001 + 30 +0.0 + 11 +185.0 + 21 +200.0000000000001 + 31 +0.0 + 0 +TEXT + 5 +82 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pola_3 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +132.6500000000233 + 20 +197.5000000000001 + 30 +0.0 + 40 +1.5 + 1 +Podpis: + 7 +Název pole + 11 +132.6500000000233 + 21 +199.0000000000001 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +83 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pola_3 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +166.6500000000232 + 20 +197.5000000000001 + 30 +0.0 + 40 +1.5 + 1 +Datum: + 7 +Název pole + 11 +166.6500000000232 + 21 +199.0000000000001 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +84 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +130.5554097926819 + 20 +101.5999999999768 + 30 +0.0 + 40 +1.800000000046565 + 1 +Specialista: + 7 +Popis identifikace + 11 +130.5554097926819 + 21 +102.5000000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +LINE + 5 +87 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.0 + 20 +105.0000000000001 + 30 +0.0 + 11 +190.0 + 21 +105.0000000000001 + 31 +0.0 + 0 +LINE + 5 +88 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +128.5106382978723 + 20 +100.0000000000001 + 30 +0.0 + 11 +128.5106382978723 + 21 +105.0000000000001 + 31 +0.0 + 0 +LINE + 5 +89 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +59.78723404255319 + 20 +105.0000000000001 + 30 +0.0 + 11 +59.78723404255319 + 21 +140.0000000000001 + 31 +0.0 + 0 +LINE + 5 +8F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.0 + 20 +122.5000000000001 + 30 +0.0 + 11 +190.0 + 21 +122.5000000000001 + 31 +0.0 + 0 +LINE + 5 +90 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_2 + 6 +Continuous + 62 + 9 +370 + 0 +100 +AcDbLine + 10 +20.0 + 20 +235.0000000000001 + 30 +0.0 + 11 +190.0 + 21 +235.0000000000001 + 31 +0.0 + 0 +LINE + 5 +92 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_2 + 6 +Continuous + 62 + 9 +370 + 0 +100 +AcDbLine + 10 +126.6500000000233 + 20 +260.0 + 30 +0.0 + 11 +126.6500000000233 + 21 +195.0000000000001 + 31 +0.0 + 0 +LINE + 5 +93 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_2 + 6 +Continuous + 62 + 9 +370 + 0 +100 +AcDbLine + 10 +190.0 + 20 +195.0000000000001 + 30 +0.0 + 11 +20.0 + 21 +195.0000000000001 + 31 +0.0 + 0 +TEXT + 5 +96 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_2 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +25.65000000002331 + 20 +232.5000000000001 + 30 +0.0 + 40 +1.5 + 1 +Orientační schéma: + 7 +Název pole + 11 +25.65000000002331 + 21 +234.0000000000001 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +97 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_5 + 62 + 7 +100 +AcDbText + 10 +21.3844107313198 + 20 +161.5000000000001 + 30 +0.0 + 40 +2.0 + 1 +Stavebník/Investor: + 7 +Název subjektu + 11 +21.3844107313198 + 21 +162.5000000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +TEXT + 5 +9E +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +114.9375000000001 + 30 +0.0 + 40 +2.0 + 1 +Adresa: + 7 +Popis identifikace + 11 +21.54639864270581 + 21 +115.9375000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +TEXT + 5 +9F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +108.3750000000001 + 30 +0.0 + 40 +2.0 + 1 +Kontakt: + 7 +Popis identifikace + 11 +21.54639864270581 + 21 +109.3750000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +TEXT + 5 +A0 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +101.5000000000001 + 30 +0.0 + 40 +2.0 + 1 +Hlavní projektant (HIP): + 7 +Popis identifikace + 11 +21.54639864270581 + 21 +102.5000000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +TEXT + 5 +A1 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_5 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +156.5999999999768 + 30 +0.0 + 40 +1.800000000046565 + 1 +Adresa: + 7 +Popis identifikace + 11 +21.54639864270581 + 21 +157.5000000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +TEXT + 5 +A2 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_5 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +151.5999999999768 + 30 +0.0 + 40 +1.800000000046565 + 1 +Zástupce investora: + 7 +Popis identifikace + 11 +21.54639864270581 + 21 +152.5000000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +TEXT + 5 +A3 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_5 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +146.5999999999768 + 30 +0.0 + 40 +1.800000000046565 + 1 +Adresa: + 7 +Popis identifikace + 11 +21.54639864270581 + 21 +147.5000000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +TEXT + 5 +A4 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pola_3 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +132.6500000000233 + 20 +257.5000000000001 + 30 +0.0 + 40 +1.5 + 1 +Paré: + 7 +Název pole + 11 +132.6500000000233 + 21 +259.0000000000001 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +A5 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_2 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +25.65000000002331 + 20 +257.5000000000001 + 30 +0.0 + 40 +1.5 + 1 +Jiná ověření: + 7 +Název pole + 11 +25.65000000002331 + 21 +259.0000000000001 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +LINE + 5 +A6 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_2 + 6 +Continuous + 62 + 9 +370 + 0 +100 +AcDbLine + 10 +20.0 + 20 +260.0 + 30 +0.0 + 11 +190.0 + 21 +260.0 + 31 +0.0 + 0 +TEXT + 5 +C0 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +119.0000000000001 + 30 +0.0 + 40 +2.0 + 1 +Zhotovitel objektu: + 7 +Název subjektu + 11 +21.54639864270581 + 21 +120.0000000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +LINE + 5 +C1 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_1 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.0 + 20 +20.0 + 30 +0.0 + 11 +190.0 + 21 +20.0 + 31 +0.0 + 0 +LWPOLYLINE + 5 +C2 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 53 +100 +AcDbPolyline + 90 + 5 + 70 + 129 + 43 +0.0 + 10 +20.0 + 20 +95.00000000000012 + 10 +190.0 + 20 +95.00000000000012 + 10 +190.0 + 20 +25.00000000000011 + 10 +20.0 + 20 +25.00000000000011 + 10 +20.0 + 20 +95.00000000000012 + 0 +LINE + 5 +C4 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.01358145438167 + 20 +32.50000000000011 + 30 +0.0 + 11 +190.0 + 21 +32.50000000000011 + 31 +0.0 + 0 +LINE + 5 +C5 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +103.1914893617021 + 20 +25.00000000000011 + 30 +0.0 + 11 +103.1914893617021 + 21 +40.00000000000009 + 31 +0.0 + 0 +LINE + 5 +C6 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +59.78723404255319 + 20 +25.00000000000011 + 30 +0.0 + 11 +59.78723404255319 + 21 +95.00000000000012 + 31 +0.0 + 0 +LINE + 5 +C7 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.01358145438167 + 20 +52.5000000000001 + 30 +0.0 + 11 +142.9787234042553 + 21 +52.5000000000001 + 31 +0.0 + 0 +LINE + 5 +C8 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.01358145438167 + 20 +72.5000000000001 + 30 +0.0 + 11 +190.0135814543816 + 21 +72.5000000000001 + 31 +0.0 + 0 +LINE + 5 +C9 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +20.01358145438167 + 20 +80.00000000000012 + 30 +0.0 + 11 +190.0135814543816 + 21 +80.00000000000012 + 31 +0.0 + 0 +LINE + 5 +CA +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbLine + 10 +142.9787234042553 + 20 +87.50000000000012 + 30 +0.0 + 11 +190.0135814543816 + 21 +87.50000000000012 + 31 +0.0 + 0 +LWPOLYLINE + 5 +CB +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbPolyline + 90 + 5 + 70 + 129 + 43 +0.0 + 10 +189.9999999999997 + 20 +25.00000000000011 + 10 +142.9787234042553 + 20 +25.00000000000011 + 10 +142.9787234042553 + 20 +95.00000000000012 + 10 +189.9999999999997 + 20 +95.00000000000012 + 10 +189.9999999999997 + 20 +25.00000000000011 + 0 +LINE + 5 +CD +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbLine + 10 +142.9787234042553 + 20 +52.5000000000001 + 30 +0.0 + 11 +190.0135814543816 + 21 +52.5000000000001 + 31 +0.0 + 0 +TEXT + 5 +CE +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.55998009706292 + 20 +76.97345965504957 + 30 +0.0 + 40 +1.799999999999995 + 1 +Název části: + 7 +Název pole + 11 +21.55998009706292 + 21 +78.77345965504956 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +LINE + 5 +CF +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbLine + 10 +20.01358145438167 + 20 +40.00000000000009 + 30 +0.0 + 11 +190.0 + 21 +40.00000000000009 + 31 +0.0 + 0 +TEXT + 5 +D1 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +104.751469458765 + 20 +36.82357217651146 + 30 +0.0 + 40 +2.0 + 1 +Měřítko: + 7 +Popis identifikace + 11 +104.751469458765 + 21 +38.82357217651146 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +D2 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +104.751469458765 + 20 +33.40304091187829 + 30 +0.0 + 40 +2.0 + 1 +Formáty: + 7 +Popis identifikace + 11 +104.751469458765 + 21 +35.4030409118783 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +D3 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +104.751469458765 + 20 +29.41201588976618 + 30 +0.0 + 40 +2.0 + 1 +TUDU: + 7 +Popis identifikace + 11 +104.751469458765 + 21 +31.41201588976617 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +D4 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.55998009706292 + 20 +48.83262216870725 + 30 +0.0 + 40 +1.799999999999995 + 1 +Název přílohy: + 7 +Název pole + 11 +21.55998009706292 + 21 +50.63262216870724 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +D5 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.55998009706292 + 20 +41.97345965504957 + 30 +0.0 + 40 +1.799999999999995 + 1 +Název dílčí části přílohy: + 7 +Název pole + 11 +21.55998009706292 + 21 +43.77345965504956 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +D6 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.34721413961608 + 20 +29.41201588976618 + 30 +0.0 + 40 +2.0 + 1 +Katastrální území: + 7 +Popis identifikace + 11 +61.34721413961608 + 21 +31.41201588976617 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +D7 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.55998009706292 + 20 +91.72345965504957 + 30 +0.0 + 40 +1.799999999999995 + 1 +Název stavby/akce: + 7 +Název pole + 11 +21.55998009706292 + 21 +93.52345965504957 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +D8 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.34721413961608 + 20 +36.82357217651146 + 30 +0.0 + 40 +2.0 + 1 +Zpracovatel přílohy: + 7 +Popis identifikace + 11 +61.34721413961608 + 21 +38.82357217651146 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +D9 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.55998009706292 + 20 +36.82357217651146 + 30 +0.0 + 40 +2.0 + 1 +Odpovědný projektant: + 7 +Popis identifikace + 11 +21.55998009706292 + 21 +38.82357217651146 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +DA +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.55998009706292 + 20 +29.32357217651156 + 30 +0.0 + 40 +2.0 + 1 +Kraj: + 7 +Popis identifikace + 11 +21.55998009706292 + 21 +31.32357217651156 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +TEXT + 5 +DB +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.55998009706292 + 20 +69.26930247662501 + 30 +0.0 + 40 +1.799999999999995 + 1 +Název objektu/dílči části: + 7 +Název pole + 11 +21.55998009706292 + 21 +71.06930247662501 + 31 +0.0 +100 +AcDbText + 73 + 3 + 0 +LWPOLYLINE + 5 +DC +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbPolyline + 90 + 5 + 70 + 129 + 43 +0.0 + 10 +20.0 + 20 +25.00000000000011 + 10 +190.0 + 20 +25.00000000000011 + 10 +190.0 + 20 +20.00000000000011 + 10 +20.0 + 20 +20.00000000000011 + 10 +20.0 + 20 +25.00000000000011 + 0 +LINE + 5 +DE +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +189.9999999999997 + 20 +22.50000000000011 + 30 +0.0 + 11 +20.0 + 21 +22.50000000000011 + 31 +0.0 + 0 +MTEXT + 5 +DF +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbMText + 10 +20.70000000000007 + 20 +23.75000000000011 + 30 +0.0 + 40 +1.0 + 41 +0.0 + 46 +0.0 + 71 + 4 + 72 + 1 + 1 +Označení investora: + 7 +Kódování + 73 + 1 + 44 +0.9 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 1 +1070 + 44 +1040 +0.9 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +E0 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbMText + 10 +60.4872340425533 + 20 +23.75000000000011 + 30 +0.0 + 40 +1.0 + 41 +0.0 + 46 +0.0 + 71 + 4 + 72 + 1 + 1 +Stupeň dokumentace: + 7 +Kódování + 73 + 1 + 44 +0.9 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 1 +1070 + 44 +1040 +0.9 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +E1 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbMText + 10 +96.65744680851069 + 20 +23.75000000000011 + 30 +0.0 + 40 +1.0 + 41 +0.0 + 46 +0.0 + 71 + 4 + 72 + 1 + 1 +Objekt: + 7 +Kódování + 73 + 1 + 44 +0.9 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 1 +1070 + 44 +1040 +0.9 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +E2 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbMText + 10 +132.8276595744681 + 20 +23.75000000000011 + 30 +0.0 + 40 +1.0 + 41 +0.0 + 46 +0.0 + 71 + 4 + 72 + 1 + 1 +Podobjekt: + 7 +Kódování + 73 + 1 + 44 +0.9 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 1 +1070 + 44 +1040 +0.9 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +E3 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbMText + 10 +176.231914893617 + 20 +23.75000000000011 + 30 +0.0 + 40 +1.0 + 41 +0.0 + 46 +0.0 + 71 + 4 + 72 + 1 + 1 +Revize: + 7 +Kódování + 73 + 1 + 44 +0.9 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 1 +1070 + 44 +1040 +0.9 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +E4 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbMText + 10 +161.7638297872341 + 20 +23.7500000000001 + 30 +0.0 + 40 +1.0 + 41 +0.0 + 46 +0.0 + 71 + 4 + 72 + 1 + 1 +Příloha: + 7 +Kódování + 73 + 1 + 44 +0.9 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 1 +1070 + 44 +1040 +0.9 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +LINE + 5 +E5 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +59.78723404255319 + 20 +25.00000000000011 + 30 +0.0 + 11 +59.78723404255319 + 21 +20.00000000000011 + 31 +0.0 + 0 +LINE + 5 +E6 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +77.87234042553189 + 20 +25.00000000000011 + 30 +0.0 + 11 +77.87234042553189 + 21 +20.00000000000011 + 31 +0.0 + 0 +LINE + 5 +E7 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +95.95744680851071 + 20 +25.00000000000023 + 30 +0.0 + 11 +95.95744680851071 + 21 +20.00000000000023 + 31 +0.0 + 0 +LINE + 5 +E8 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +132.1276595744681 + 20 +25.00000000000011 + 30 +0.0 + 11 +132.1276595744681 + 21 +20.00000000000011 + 31 +0.0 + 0 +LINE + 5 +E9 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +161.063829787234 + 20 +25.0000000000001 + 30 +0.0 + 11 +161.063829787234 + 21 +20.0000000000001 + 31 +0.0 + 0 +LINE + 5 +EA +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +175.531914893617 + 20 +25.00000000000011 + 30 +0.0 + 11 +175.531914893617 + 21 +20.00000000000011 + 31 +0.0 + 0 +MTEXT + 5 +EB +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +143.9787234042555 + 20 +39.07357217651146 + 30 +0.0 + 40 +1.8 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +Stupeň dokumentace: + 7 +Název pole + 73 + 2 + 44 +0.72 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +EC +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +143.9787234042555 + 20 +71.21930247662509 + 30 +0.0 + 40 +1.8 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +Objekt/Skupina objektů: + 7 +Název pole + 73 + 2 + 44 +0.72 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +ED +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +143.9787234042555 + 20 +78.91323152988696 + 30 +0.0 + 40 +1.8 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +Označení části: + 7 +Název pole + 73 + 2 + 44 +0.72 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +EE +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +143.9787234042555 + 20 +93.69277527956183 + 30 +0.0 + 40 +1.8 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +Označení investora: + 7 +Název pole + 73 + 2 + 44 +0.72 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +EF +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +143.9787234042555 + 20 +31.44277527956194 + 30 +0.0 + 40 +1.8 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +Smluvní datum zpracování: + 7 +Název pole + 73 + 2 + 44 +0.72 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +F0 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +143.9787234042555 + 20 +86.52345965504958 + 30 +0.0 + 40 +1.8 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +Zakázka: + 7 +Název pole + 73 + 2 + 44 +0.72 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +LWPOLYLINE + 5 +F1 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 62 + 7 +370 + 13 +100 +AcDbPolyline + 90 + 2 + 70 + 0 + 43 +0.0 + 10 +161.063829787234 + 20 +68.0000000000001 + 10 +161.063829787234 + 20 +40.00000000000009 + 0 +MTEXT + 5 +F3 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +143.9787234042555 + 20 +66.28262216870723 + 30 +0.0 + 40 +1.199999999999999 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +{\fVerdana|b0|i1|c238|p39;řada} + 7 +Název pole + 73 + 2 + 44 +0.72 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +F4 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +162.063829787234 + 20 +66.28262216870723 + 30 +0.0 + 40 +1.199999999999999 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +{\fVerdana|b0|i1|c238|p39;úsek} + 7 +Název pole + 73 + 2 + 44 +0.72 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +F6 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +176.2447755511831 + 20 +66.28262216870723 + 30 +0.0 + 40 +1.199999999999999 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +{\fVerdana|b0|i1|c238|p39;podobjekt} + 7 +Název pole + 73 + 2 + 44 +0.72 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +LINE + 5 +F7 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbLine + 10 +143.0058863130189 + 20 +68.0000000000001 + 30 +0.0 + 11 +190.0271629087633 + 21 +68.0000000000001 + 31 +0.0 + 0 +MTEXT + 5 +F8 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +162.0774112416157 + 20 +50.78262216870722 + 30 +0.0 + 40 +1.199999999999999 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +typ přílohy: + 7 +Název pole + 73 + 2 + 44 +0.72 + 90 + 2 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +F9 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +176.2583570055648 + 20 +50.78262216870722 + 30 +0.0 + 40 +1.199999999999999 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +číslo přílohy: + 7 +Název pole + 73 + 2 + 44 +0.72 + 90 + 2 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +MTEXT + 5 +FA +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +143.992304858637 + 20 +50.78262216870722 + 30 +0.0 + 40 +1.199999999999999 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +dílčí část/řada: + 7 +Název pole + 73 + 2 + 44 +0.72 + 90 + 2 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +TEXT + 5 +FB +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +132.4375000000001 + 30 +0.0 + 40 +2.0 + 1 +Adresa: + 7 +Popis identifikace + 11 +21.54639864270581 + 21 +133.4375000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +TEXT + 5 +FC +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +125.8750000000001 + 30 +0.0 + 40 +2.0 + 1 +Kontakt: + 7 +Popis identifikace + 11 +21.54639864270581 + 21 +126.8750000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +TEXT + 5 +FD +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864270581 + 20 +136.5000000000001 + 30 +0.0 + 40 +2.0 + 1 +Zhotovitel díla: + 7 +Název subjektu + 11 +21.54639864270581 + 21 +137.5000000000001 + 31 +0.0 +100 +AcDbText + 73 + 2 + 0 +ATTDEF + 5 +FE +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +160.788784419073 + 20 +54.77278355015959 + 30 +0.0 + 40 +3.0 + 1 + + 7 +Označení hlavní + 72 + 2 + 11 +188.4999999999998 + 21 +56.2727835501596 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +[Číslo objektu nebo skupiny objektů] + 2 +PODOBJEKT + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +100 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +162.9894402926425 + 20 +54.77278355015959 + 30 +0.0 + 40 +3.0 + 1 + + 7 +Označení hlavní + 72 + 1 + 11 +171.9148936170213 + 21 +56.2727835501596 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +[Číslo objektu nebo skupiny objektů] + 2 +RAZENI + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +101 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +158.5388094251461 + 20 +54.77278355015959 + 30 +0.0 + 40 +3.0 + 1 + + 7 +Označení hlavní + 72 + 1 + 11 +164.6808510638298 + 21 +56.2727835501596 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +[Číslo objektu nebo skupiny objektů] + 2 +USEK + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +102 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +131.1514725004642 + 20 +41.73945021682629 + 30 +0.0 + 40 +3.0 + 1 + + 7 +Označení hlavní + 72 + 2 + 11 +159.5638297872338 + 21 +43.2394502168263 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Dílčí část: + 2 +DILCI_CAST + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +103 +102 +{ACAD_XDICTIONARY +360 +1AD +102 +} +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 30 +100 +AcDbText + 10 +87.08210565423035 + 20 +86.10000000000011 + 30 +0.0 + 40 +2.799999999999998 + 1 + + 7 +Název stavby + 72 + 1 + 11 +101.3829787234043 + 21 +87.50000000000012 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Název stavby/akce: + 2 +NAZEV_AKCE + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +105 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.34721413961608 + 20 +26.36150046769842 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Popis identifikace + 11 +61.34721413961608 + 21 +28.36150046769842 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Katastrální území: + 2 +KATASTRALNI_UZEMI + 70 + 0 + 74 + 3 +280 + 1 + 0 +ATTDEF + 5 +106 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +176.2479526747175 + 20 +73.3749999999999 + 30 +0.0 + 40 +3.0 + 1 + + 7 +Označení hlavní + 72 + 2 + 11 +188.1814650991634 + 21 +74.8749999999999 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Zadej část dokumentace: + 2 +CAST + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +107 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864268089 + 20 +171.7500000000001 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +21.54639864268089 + 21 +172.5000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE4CISLO + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +109 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864268089 + 20 +176.7500000000001 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +21.54639864268089 + 21 +177.5000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE3CISLO + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +10A +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864268089 + 20 +181.75 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +21.54639864268089 + 21 +182.5000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE2CISLO + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +10B +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.54639864268089 + 20 +186.7500000000001 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +21.54639864268089 + 21 +187.5000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE1CISLO + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +10C +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +39.57214202174851 + 20 +171.6581956239814 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +39.57214202174851 + 21 +172.4081956239814 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE4DAT + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +10D +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +39.57214202174851 + 20 +176.6581956239814 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +39.57214202174851 + 21 +177.4081956239814 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE3DAT + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +10E +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +39.57214202174851 + 20 +181.6581956239819 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +39.57214202174851 + 21 +182.4081956239819 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE2DAT + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +10F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +39.57214202174851 + 20 +186.7499999999999 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +39.57214202174851 + 21 +187.4999999999999 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE1DAT + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +110 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +159.0212439886901 + 20 +171.6108910940839 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +159.0212439886901 + 21 +172.3608910940839 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Kontroloval: + 2 +SO_KONTROLOVAL4 + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +111 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.2897363577587 + 20 +171.6581956239811 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +61.2897363577587 + 21 +172.4081956239811 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE4 + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +112 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +159.0212439886901 + 20 +176.6108910940839 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +159.0212439886901 + 21 +177.3608910940839 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Kontroloval: + 2 +SO_KONTROLOVAL3 + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +113 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.2897363577587 + 20 +176.6581956239811 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +61.2897363577587 + 21 +177.4081956239811 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE3 + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +114 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +159.0212439886901 + 20 +181.6108910940844 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +159.0212439886901 + 21 +182.3608910940844 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Kontroloval: + 2 +SO_KONTROLOVAL2 + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +115 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.2897363577587 + 20 +181.6581956239815 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +61.2897363577587 + 21 +182.4081956239816 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE2 + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +116 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.60063286475599 + 20 +146.6000000000001 + 30 +0.0 + 40 +1.8 + 1 + + 7 +Popis základní + 11 +61.60063286475599 + 21 +147.5000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +[adresa pracoviště zástupce investora] + 2 +OBJEDNATEL_ZASTUPCE_ADRESA + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +117 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.60063286475599 + 20 +151.6000000000001 + 30 +0.0 + 40 +1.8 + 1 + + 7 +Popis základní + 11 +61.60063286475599 + 21 +152.5000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Zástupce objednatele zakázky: + 2 +OBJEDNATEL_ZASTUPCE_NAZEV + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +118 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.5588464053231 + 20 +156.6 + 30 +0.0 + 40 +1.8 + 1 + + 7 +Popis základní + 11 +61.5588464053231 + 21 +157.5000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Adresa objednatele: + 2 +OBJEDNATEL_ADRESA + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +119 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_5 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.2957891962036 + 20 +161.4000000000001 + 30 +0.0 + 40 +2.2 + 1 + + 7 +Název subjektu + 11 +61.2957891962036 + 21 +162.5000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Objednatel zakázky: + 2 +OBJEDNATEL_NAZEV + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +11A +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +159.0212439886901 + 20 +186.7026954701024 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +159.0212439886901 + 21 +187.4526954701024 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Kontroloval: + 2 +SO_KONTROLOVAL1 + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +11B +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.2897363577587 + 20 +186.7499999999995 + 30 +0.0 + 40 +1.5 + 1 + + 7 +Popis revize + 11 +61.2897363577587 + 21 +187.4999999999996 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Revize + 2 +REVIZE1 + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +11C +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +150.1225654801878 + 20 +41.73945021682629 + 30 +0.0 + 40 +3.0 + 1 + + 7 +Označení hlavní + 72 + 2 + 11 +188.4999999999998 + 21 +43.2394502168263 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Číslo přílohy: + 2 +CISLO_PRILOHY + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +11D +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +165.154816169641 + 20 +41.73945021682629 + 30 +0.0 + 40 +3.0 + 1 + + 7 +Označení hlavní + 72 + 2 + 11 +174.0319148936168 + 21 +43.2394502168263 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Typ přílohy: + 2 +TYP + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +11E +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +145.4913907663289 + 20 +54.77278355015959 + 30 +0.0 + 40 +3.0 + 1 + + 7 +Označení hlavní + 72 + 1 + 11 +152.0212765957447 + 21 +56.2727835501596 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +[Číslo objektu nebo skupiny objektů] + 2 +RADA + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +11F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +172.1062468318818 + 20 +80.87500000000012 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Popis základní + 72 + 2 + 11 +188.1814650991753 + 21 +81.87500000000012 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Číslo zakázky + 2 +ZAK_CISLO + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +120 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +178.3750331217237 + 20 +88.37500000000012 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Popis základní + 72 + 2 + 11 +188.1950465535572 + 21 +89.37500000000012 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Číslo smlouvy dle SOD + 2 +S_KOD + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +121 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +121.2047432967304 + 20 +36.81077119507882 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Popis identifikace + 11 +121.2047432967304 + 21 +38.81077119507882 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Zadej měřítko výkresu: + 2 +MERITKO + 70 + 8 + 74 + 3 +280 + 1 + 0 +ATTDEF + 5 +122 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +121.2218373067176 + 20 +33.19301378479122 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Popis identifikace + 11 +121.2218373067176 + 21 +35.19301378479122 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Zadej počet formátů A4: + 2 +FORMATY + 70 + 8 + 74 + 3 +280 + 1 + 0 +ATTDEF + 5 +123 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +175.94655763482 + 20 +25.88509938853795 + 30 +0.0 + 40 +2.2 + 1 + + 7 +Označení hlavní + 72 + 2 + 11 +188.1950465535574 + 21 +26.98509938853795 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +[datum dle SOD] + 2 +DATUM + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +124 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +169.7380955797495 + 20 +33.80930607411792 + 30 +0.0 + 40 +2.2 + 1 + + 7 +Označení hlavní + 72 + 2 + 11 +188.1950465535574 + 21 +34.90930607411792 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Stupeň projektové dokumentace: + 2 +STUP_DOK + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +125 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +104.7564442733148 + 20 +26.36150046769842 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Popis identifikace + 11 +104.7564442733148 + 21 +28.36150046769842 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +[číslo TUDU] + 2 +TUDU + 70 + 8 + 74 + 3 +280 + 1 + 0 +ATTDEF + 5 +126 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.55998009706292 + 20 +26.36150046769842 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Popis identifikace + 11 +21.55998009706292 + 21 +28.36150046769842 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Kraj: + 2 +KRAJ + 70 + 8 + 74 + 3 +280 + 1 + 0 +ATTDEF + 5 +127 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 30 +100 +AcDbText + 10 +61.34721413961608 + 20 +42.12500000000011 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Název přílohy + 11 +61.34721413961608 + 21 +43.1250000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Název části přílohy + 2 +PRILOHA_CAST + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +129 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 30 +100 +AcDbText + 10 +61.34721413961608 + 20 +48.1250000000001 + 30 +0.0 + 40 +2.5 + 1 + + 7 +Název přílohy hlavní + 11 +61.34721413961608 + 21 +49.3750000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Název přílohy: + 2 +PRILOHA + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +12B +102 +{ACAD_XDICTIONARY +360 +1B0 +102 +} +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 30 +100 +AcDbText + 10 +61.07929842448342 + 20 +67.63558406083268 + 30 +0.0 + 40 +3.5 + 1 + + 7 +Název objektu + 11 +61.07929842448342 + 21 +71.13558406083268 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +[Název objektu nebo skupiny objektů] + 2 +OBJEKT_NAZEV + 70 + 0 + 74 + 3 +280 + 1 + 0 +ATTDEF + 5 +12D +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.31895145594959 + 20 +76.40000000000011 + 30 +0.0 + 40 +2.2 + 1 + + 7 +Název pole + 11 +61.31895145594959 + 21 +77.5000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +[Název Profesní skupiny dle zařazení viz Manuál] + 2 +CAST_NAZEV + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +12E +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.34721413961608 + 20 +33.76376365391536 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Popis identifikace + 11 +61.34721413961608 + 21 +35.76376365391535 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Vypracoval: + 2 +SO_VYPRACOVAL_PRILOHA + 70 + 8 + 74 + 3 +280 + 1 + 0 +ATTDEF + 5 +12F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +21.51448246110661 + 20 +33.71100207410438 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Popis identifikace + 11 +21.51448246110661 + 21 +35.71100207410438 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Zodpovědný projektant objektu: + 2 +SO_ZODP_PROJEKTANT + 70 + 8 + 74 + 3 +280 + 1 + 0 +ATTDEF + 5 +130 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +146.9314886872024 + 20 +101.4435039047252 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Označení hlavní + 11 +146.9314886872024 + 21 +102.4435039047252 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Specialista profese dle SOD: + 2 +SO_SPECIALISTA + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +131 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +56.917321840391 + 20 +101.4363490698521 + 30 +0.0 + 40 +2.0 + 1 + + 7 +Označení hlavní + 11 +56.917321840391 + 21 +102.4363490698521 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +HIP: + 2 +SO_HIP + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +132 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_5 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.2957891962036 + 20 +136.4000000000001 + 30 +0.0 + 40 +2.2 + 1 + + 7 +Název subjektu + 11 +61.2957891962036 + 21 +137.5000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Zhotovitel díla: + 2 +ZHOTOVITEL_DILA_NAZEV + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +133 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.60063286475599 + 20 +132.5375000000001 + 30 +0.0 + 40 +1.8 + 1 + + 7 +Popis základní + 11 +61.60063286475599 + 21 +133.4375000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Adresa zhotovitele díla: + 2 +ZHOTOVITEL_DILA_ADRESA + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +134 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.60063286475599 + 20 +128.1625000000001 + 30 +0.0 + 40 +1.8 + 1 + + 7 +Popis základní + 11 +61.60063286475599 + 21 +129.0625000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Telefon zhotovitele díla: + 2 +ZHOTOVITEL_DILA_TELEFON + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +135 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.60063286475599 + 20 +124.8812500000001 + 30 +0.0 + 40 +1.8 + 1 + + 7 +Popis základní + 11 +61.60063286475599 + 21 +125.7812500000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Email zhotovitele díla: + 2 +ZHOTOVITEL_DILA_EMAIL + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +136 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_5 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.2957891962036 + 20 +118.9000000000001 + 30 +0.0 + 40 +2.2 + 1 + + 7 +Název subjektu + 11 +61.2957891962036 + 21 +120.0000000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Zhotovitel objektu: + 2 +ZHOTOVITEL_OBJEKTU_NAZEV + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +137 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.60063286475599 + 20 +115.0375000000001 + 30 +0.0 + 40 +1.8 + 1 + + 7 +Popis základní + 11 +61.60063286475599 + 21 +115.9375000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Adresa zhotovitele objektu: + 2 +ZHOTOVITEL_OBJEKTU_ADRESA + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +138 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.60063286475599 + 20 +110.6625000000001 + 30 +0.0 + 40 +1.8 + 1 + + 7 +Popis základní + 11 +61.60063286475599 + 21 +111.5625000000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Telefon zhotovitele objektu: + 2 +ZHOTOVITEL_OBJEKTU_TELEFON + 70 + 8 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +139 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbText + 10 +61.60063286475599 + 20 +107.3812500000001 + 30 +0.0 + 40 +1.8 + 1 + + 7 +Popis základní + 11 +61.60063286475599 + 21 +108.2812500000001 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 +Email zhotovitele objektu: + 2 +ZHOTOVITEL_OBJEKTU_EMAIL + 70 + 8 + 74 + 2 +280 + 1 + 0 +MTEXT + 5 +13A +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbMText + 10 +78.57234042553199 + 20 +23.75000000000011 + 30 +0.0 + 40 +1.0 + 41 +0.0 + 46 +0.0 + 71 + 4 + 72 + 1 + 1 +Dílčí část/základní řada: + 7 +Kódování + 73 + 1 + 44 +0.9 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 1 +1070 + 44 +1040 +0.9 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +ATTDEF + 5 +13B +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +20.71207007416091 + 20 +20.65000000000006 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +21.80851063829792 + 21 +21.25000000000006 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K1 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +13C +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +24.32909135075669 + 20 +20.65000000000006 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +25.4255319148937 + 21 +21.25000000000006 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K2 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +13D +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +27.94611262735241 + 20 +20.65000000000006 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +29.04255319148942 + 21 +21.25000000000006 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K3 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +13E +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +31.56313390394811 + 20 +20.65000000000005 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +32.65957446808511 + 21 +21.25000000000005 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K4 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +13F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +35.18015518054389 + 20 +20.65000000000005 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +36.27659574468089 + 21 +21.25000000000005 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K5 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +140 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +38.79717645713958 + 20 +20.65000000000006 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +39.89361702127658 + 21 +21.25000000000006 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K6 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +141 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +42.41419773373541 + 20 +20.65000000000006 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +43.51063829787242 + 21 +21.25000000000006 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K7 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +142 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +46.03121901033111 + 20 +20.65000000000006 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +47.12765957446811 + 21 +21.25000000000006 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K8 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +143 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +49.64824028692689 + 20 +20.65000000000006 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +50.74468085106389 + 21 +21.25000000000006 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K9 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +144 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +52.74061414915052 + 20 +20.65000000000005 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +54.36170212765958 + 21 +21.25000000000005 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K10 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +145 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +56.35763542574643 + 20 +20.65000000000006 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +57.9787234042555 + 21 +21.25000000000006 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K11 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +146 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +59.97465670234202 + 20 +20.65000000000005 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +61.59574468085108 + 21 +21.25000000000005 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K12 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +147 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +63.59167797893782 + 20 +20.65000000000005 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +65.21276595744689 + 21 +21.25000000000005 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K13 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +148 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +67.02530273831662 + 20 +20.65000000000005 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +68.64639071682569 + 21 +21.25000000000005 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K14 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +149 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +70.82572053212935 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +72.44680851063842 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K15 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +14A +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +74.44274180872501 + 20 +20.65000000000006 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +76.06382978723408 + 21 +21.25000000000006 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K16 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +14B +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +78.05976308532073 + 20 +20.65000000000006 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +79.6808510638298 + 21 +21.25000000000006 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K17 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +14C +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +81.67678436191652 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +83.29787234042559 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K18 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +14D +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +85.29380563851223 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +86.9148936170213 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K19 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +14E +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +88.91082691510803 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +90.5319148936171 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K20 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +14F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +92.52784819170374 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +94.14893617021281 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K21 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +150 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +96.14486946829952 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +97.76595744680859 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K22 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +151 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +99.76189074489523 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +101.3829787234043 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K23 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +152 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +103.3789120214909 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +105.0 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K24 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +153 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +106.9959332980867 + 20 +20.65000000000003 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +108.6170212765958 + 21 +21.25000000000003 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K25 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +154 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +110.6129545746824 + 20 +20.65000000000003 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +112.2340425531915 + 21 +21.25000000000003 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K26 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +155 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +114.2299758512781 + 20 +20.65000000000003 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +115.8510638297872 + 21 +21.25000000000003 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K27 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +156 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +117.8469971278739 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +119.468085106383 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K28 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +157 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +121.4640184044697 + 20 +20.65000000000003 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +123.0851063829787 + 21 +21.25000000000003 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K29 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +158 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +125.0810396810654 + 20 +20.65000000000003 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +126.7021276595745 + 21 +21.25000000000003 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K30 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +159 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +128.6980609576611 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +130.3191489361702 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K31 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +15A +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +132.3150822342569 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +133.936170212766 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K32 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +15B +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +135.9321035108526 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +137.5531914893617 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K33 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +15C +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +139.5491247874484 + 20 +20.65000000000003 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +141.1702127659574 + 21 +21.25000000000003 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K34 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +15D +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +143.1661460640441 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +144.7872340425532 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K35 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +15E +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +146.7831673406399 + 20 +20.65000000000003 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +148.4042553191489 + 21 +21.25000000000003 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K36 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +15F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +150.4001886172356 + 20 +20.65000000000003 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +152.0212765957447 + 21 +21.25000000000003 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K37 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +160 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +154.0172098938314 + 20 +20.65000000000003 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +155.6382978723404 + 21 +21.25000000000003 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K38 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +161 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +157.6342311704271 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +159.2553191489362 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K39 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +162 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +161.2512524470229 + 20 +20.65000000000002 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +162.8723404255319 + 21 +21.25000000000002 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K40 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +163 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +164.8682737236186 + 20 +20.65000000000002 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +166.4893617021276 + 21 +21.25000000000002 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K41 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +164 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +168.4852950002143 + 20 +20.65000000000002 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +170.1063829787234 + 21 +21.25000000000002 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K42 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +165 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +172.1023162768101 + 20 +20.65000000000002 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +173.7234042553192 + 21 +21.25000000000002 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K43 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +166 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +175.7193375534058 + 20 +20.65000000000004 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +177.3404255319149 + 21 +21.25000000000004 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K44 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +167 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +179.3363588300016 + 20 +20.65000000000002 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +180.9574468085106 + 21 +21.25000000000002 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K45 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +168 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +182.9533801065973 + 20 +20.65000000000002 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +184.5744680851064 + 21 +21.25000000000002 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K46 + 70 + 0 + 74 + 2 +280 + 1 + 0 +ATTDEF + 5 +169 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbText + 10 +186.5704013831931 + 20 +20.65000000000002 + 30 +0.0 + 40 +1.199999999999999 + 1 + + 7 +Kódování + 72 + 1 + 11 +188.1914893617021 + 21 +21.25000000000002 + 31 +0.0 +100 +AcDbAttributeDefinition +280 + 0 + 3 + + 2 +K47 + 70 + 0 + 74 + 2 +280 + 1 + 0 +LWPOLYLINE + 5 +16A +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 62 + 7 +370 + 13 +100 +AcDbPolyline + 90 + 2 + 70 + 0 + 43 +0.0 + 10 +168.2978723404255 + 20 +68.0000000000001 + 10 +168.2978723404255 + 20 +52.5000000000001 + 0 +MTEXT + 5 +16B +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 6 +Continuous + 62 + 7 +370 + 13 +100 +AcDbMText + 10 +169.2978723404255 + 20 +66.28262216870723 + 30 +0.0 + 40 +1.199999999999999 + 41 +0.0 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 +{\fVerdana|b0|i1|c238|p35;řazení} + 7 +Název pole + 73 + 2 + 44 +0.72 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 2 +1070 + 44 +1040 +0.72 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +LINE + 5 +16C +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +23.61702127659581 + 20 +20.0 + 30 +0.0 + 11 +23.61702127659581 + 21 +22.50000000000011 + 31 +0.0 + 0 +LINE + 5 +16D +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +27.2340425531915 + 20 +19.99999999999988 + 30 +0.0 + 11 +27.2340425531915 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +16E +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +30.85106382978717 + 20 +19.99999999999988 + 30 +0.0 + 11 +30.85106382978717 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +16F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +34.46808510638309 + 20 +19.99999999999988 + 30 +0.0 + 11 +34.46808510638309 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +170 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +38.0851063829787 + 20 +19.99999999999988 + 30 +0.0 + 11 +38.0851063829787 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +171 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +41.7021276595745 + 20 +19.99999999999988 + 30 +0.0 + 11 +41.7021276595745 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +172 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +45.31914893617019 + 20 +19.99999999999988 + 30 +0.0 + 11 +45.31914893617019 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +173 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +48.936170212766 + 20 +19.99999999999988 + 30 +0.0 + 11 +48.936170212766 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +174 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +52.5531914893617 + 20 +19.99999999999988 + 30 +0.0 + 11 +52.5531914893617 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +175 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +56.1702127659575 + 20 +19.99999999999988 + 30 +0.0 + 11 +56.1702127659575 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +177 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +63.404255319149 + 20 +19.99999999999988 + 30 +0.0 + 11 +63.404255319149 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +178 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +67.02127659574469 + 20 +19.99999999999988 + 30 +0.0 + 11 +67.02127659574469 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +179 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +70.6382978723405 + 20 +19.99999999999988 + 30 +0.0 + 11 +70.6382978723405 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +17A +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +74.25531914893619 + 20 +19.99999999999988 + 30 +0.0 + 11 +74.25531914893619 + 21 +22.5 + 31 +0.0 + 0 +LINE + 5 +17C +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +81.48936170212769 + 20 +20.0 + 30 +0.0 + 11 +81.48936170212769 + 21 +22.50000000000011 + 31 +0.0 + 0 +LINE + 5 +17D +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +85.10638297872342 + 20 +20.00000000000011 + 30 +0.0 + 11 +85.10638297872342 + 21 +22.50000000000023 + 31 +0.0 + 0 +LINE + 5 +17E +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +88.7234042553192 + 20 +20.0 + 30 +0.0 + 11 +88.7234042553192 + 21 +22.50000000000011 + 31 +0.0 + 0 +LINE + 5 +17F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +92.34042553191491 + 20 +20.0 + 30 +0.0 + 11 +92.34042553191491 + 21 +22.50000000000011 + 31 +0.0 + 0 +LINE + 5 +181 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +99.57446808510642 + 20 +20.0 + 30 +0.0 + 11 +99.57446808510642 + 21 +22.50000000000011 + 31 +0.0 + 0 +LINE + 5 +182 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +103.1914893617021 + 20 +20.00000000000011 + 30 +0.0 + 11 +103.1914893617021 + 21 +22.50000000000023 + 31 +0.0 + 0 +LINE + 5 +183 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +106.8085106382979 + 20 +19.99999999999999 + 30 +0.0 + 11 +106.8085106382979 + 21 +22.50000000000011 + 31 +0.0 + 0 +LINE + 5 +184 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +110.4255319148936 + 20 +19.99999999999999 + 30 +0.0 + 11 +110.4255319148936 + 21 +22.50000000000011 + 31 +0.0 + 0 +LINE + 5 +185 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +114.0425531914893 + 20 +20.00000000000011 + 30 +0.0 + 11 +114.0425531914893 + 21 +22.50000000000023 + 31 +0.0 + 0 +LINE + 5 +186 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +117.6595744680851 + 20 +20.00000000000011 + 30 +0.0 + 11 +117.6595744680851 + 21 +22.50000000000023 + 31 +0.0 + 0 +LINE + 5 +187 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +121.2765957446808 + 20 +19.99999999999999 + 30 +0.0 + 11 +121.2765957446808 + 21 +22.5000000000001 + 31 +0.0 + 0 +LINE + 5 +188 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +124.8936170212766 + 20 +19.99999999999999 + 30 +0.0 + 11 +124.8936170212766 + 21 +22.5000000000001 + 31 +0.0 + 0 +LINE + 5 +189 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +128.5106382978723 + 20 +19.99999999999999 + 30 +0.0 + 11 +128.5106382978723 + 21 +22.5000000000001 + 31 +0.0 + 0 +LINE + 5 +18B +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +135.7446808510638 + 20 +20.00000000000011 + 30 +0.0 + 11 +135.7446808510638 + 21 +22.50000000000023 + 31 +0.0 + 0 +LINE + 5 +18C +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +139.3617021276596 + 20 +20.00000000000011 + 30 +0.0 + 11 +139.3617021276596 + 21 +22.50000000000023 + 31 +0.0 + 0 +LINE + 5 +18E +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +146.595744680851 + 20 +19.99999999999998 + 30 +0.0 + 11 +146.595744680851 + 21 +22.5000000000001 + 31 +0.0 + 0 +LINE + 5 +18F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +150.2127659574468 + 20 +20.00000000000011 + 30 +0.0 + 11 +150.2127659574468 + 21 +22.50000000000023 + 31 +0.0 + 0 +LINE + 5 +190 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +153.8297872340425 + 20 +20.00000000000011 + 30 +0.0 + 11 +153.8297872340425 + 21 +22.50000000000023 + 31 +0.0 + 0 +LINE + 5 +191 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +157.4468085106382 + 20 +19.99999999999998 + 30 +0.0 + 11 +157.4468085106382 + 21 +22.5000000000001 + 31 +0.0 + 0 +LINE + 5 +193 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +164.6808510638298 + 20 +19.99999999999998 + 30 +0.0 + 11 +164.6808510638298 + 21 +22.50000000000009 + 31 +0.0 + 0 +LINE + 5 +194 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +168.2978723404255 + 20 +19.99999999999998 + 30 +0.0 + 11 +168.2978723404255 + 21 +22.50000000000009 + 31 +0.0 + 0 +LINE + 5 +195 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +171.9148936170213 + 20 +19.99999999999998 + 30 +0.0 + 11 +171.9148936170213 + 21 +22.50000000000009 + 31 +0.0 + 0 +LINE + 5 +197 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +179.1489361702128 + 20 +19.99999999999997 + 30 +0.0 + 11 +179.1489361702128 + 21 +22.50000000000009 + 31 +0.0 + 0 +LINE + 5 +198 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +182.7659574468085 + 20 +19.99999999999997 + 30 +0.0 + 11 +182.7659574468085 + 21 +22.50000000000009 + 31 +0.0 + 0 +LINE + 5 +199 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +186.3829787234042 + 20 +19.99999999999997 + 30 +0.0 + 11 +186.3829787234042 + 21 +22.50000000000009 + 31 +0.0 + 0 +MTEXT + 5 +19A +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbMText + 10 +143.6787234042554 + 20 +23.75000000000011 + 30 +0.0 + 40 +1.0 + 41 +0.0 + 46 +0.0 + 71 + 4 + 72 + 1 + 1 +Typ přílohy: + 7 +Kódování + 73 + 1 + 44 +0.9 +1001 +ACAD +1000 +MTEXTBEGIN +1070 + 73 +1070 + 1 +1070 + 44 +1040 +0.9 +1070 + 74 +1070 + 0 +1000 +MTEXTEND + 0 +LINE + 5 +19B +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_8 + 6 +Continuous +370 + 0 +100 +AcDbLine + 10 +142.9787234042553 + 20 +25.00000000000011 + 30 +0.0 + 11 +142.9787234042553 + 21 +20.00000000000011 + 31 +0.0 + 0 +LWPOLYLINE + 5 +19C +330 +2 +100 +AcDbEntity + 8 +Rozpiska_Orientační schéma +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +22.0 + 20 +233.0000000000001 + 10 +124.6500000000232 + 20 +233.0000000000001 + 10 +124.6500000000233 + 20 +197.0 + 10 +22.00000000000009 + 20 +197.0 + 0 +LWPOLYLINE + 5 +19F +330 +2 +100 +AcDbEntity + 8 +Rozpiska_logo3 +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +130.5106382978723 + 20 +147.0000000000001 + 10 +188.0 + 20 +147.0000000000001 + 10 +188.0 + 20 +163.0 + 10 +130.5106382978723 + 20 +163.0 + 0 +LWPOLYLINE + 5 +1A1 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_logo4 +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +130.5106382978723 + 20 +124.5000000000001 + 10 +188.0 + 20 +124.5000000000001 + 10 +188.0 + 20 +138.0 + 10 +130.5106382978723 + 20 +138.0 + 0 +LWPOLYLINE + 5 +1A3 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_logo5 +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +130.5106382978723 + 20 +107.0000000000001 + 10 +188.0 + 20 +107.0000000000001 + 10 +188.0 + 20 +120.5000000000001 + 10 +130.5106382978723 + 20 +120.5000000000001 + 0 +LWPOLYLINE + 5 +1A5 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_logo1 +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +22.0 + 20 +262.0 + 10 +103.0 + 20 +262.0 + 10 +103.0 + 20 +278.0000000000001 + 10 +22.0 + 20 +278.0000000000001 + 0 +LWPOLYLINE + 5 +1A7 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_logo2 +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +107.0 + 20 +278.0000000000001 + 10 +188.0 + 20 +278.0000000000001 + 10 +188.0 + 20 +262.0 + 10 +107.0 + 20 +262.0 + 0 +LWPOLYLINE + 5 +1DF +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_6 + 6 +Continuous + 62 + 7 +370 + 53 +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +20.0 + 20 +140.0000000000001 + 10 +190.0 + 20 +140.0000000000001 + 10 +190.0 + 20 +100.0000000000001 + 10 +20.0 + 20 +100.0000000000001 + 0 +LWPOLYLINE + 5 +1E0 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_5 + 6 +Continuous + 62 + 7 +370 + 53 +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +190.0 + 20 +145.0000000000001 + 10 +20.0 + 20 +145.0000000000001 + 10 +20.0 + 20 +165.0000000000001 + 10 +190.0 + 20 +165.0000000000001 + 0 +LWPOLYLINE + 5 +1E1 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_1 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +20.0 + 20 +15.0 + 10 +20.0 + 20 +280.0000000000001 + 10 +190.0 + 20 +280.0000000000001 + 10 +190.0 + 20 +15.0 + 0 +LWPOLYLINE + 5 +1E2 +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_4 + 6 +Continuous + 62 + 7 +370 + 0 +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +190.0 + 20 +170.0000000000001 + 10 +20.0 + 20 +170.0000000000001 + 10 +20.0 + 20 +195.0000000000001 + 10 +190.0 + 20 +195.0000000000001 + 0 +LINE + 5 +1EA +330 +2 +100 +AcDbEntity + 8 +Rozpiska_pole_7 + 62 + 7 +370 + 13 +100 +AcDbLine + 10 +175.531914893617 + 20 +68.0000000000001 + 30 +0.0 + 11 +175.531914893617 + 21 +40.00000000000009 + 31 +0.0 + 0 +VIEWPORT + 5 +1FE +102 +{ACAD_XDICTIONARY +360 +1FF +102 +} +330 +19 +100 +AcDbEntity + 67 + 1 + 8 +0 +348 +29 +100 +AcDbViewport + 10 +353.7259949360932 + 20 +242.9683971594646 + 30 +0.0 + 40 +1329.915656217235 + 41 +761.0574560312013 + 68 + 1 + 69 + 1 + 12 +353.7259949360932 + 22 +242.9683971594646 + 13 +0.0 + 23 +0.0 + 14 +10.0 + 24 +10.0 + 15 +10.0 + 25 +10.0 + 16 +0.0 + 26 +0.0 + 36 +1.0 + 17 +0.0 + 27 +0.0 + 37 +0.0 + 42 +50.0 + 43 +0.0 + 44 +0.0 + 45 +761.0574560312013 + 50 +0.0 + 51 +0.0 + 72 + 100 + 90 + 819232 + 1 + +281 + 0 + 71 + 1 + 74 + 0 +110 +0.0 +120 +0.0 +130 +0.0 +111 +1.0 +121 +0.0 +131 +0.0 +112 +0.0 +122 +1.0 +132 +0.0 + 79 + 0 +146 +0.0 +170 + 0 + 61 + 5 +292 + 1 +282 + 1 +141 +0.0 +142 +0.0 + 63 + 250 +421 + 3355443 + 0 +ENDSEC + 0 +SECTION + 2 +OBJECTS + 0 +DICTIONARY + 5 +B +330 +0 +100 +AcDbDictionary +281 + 1 + 3 +ACAD_CIP_PREVIOUS_PRODUCT_INFO +350 +1DE + 3 +ACAD_COLOR +350 +37 + 3 +ACAD_DETAILVIEWSTYLE +350 +1D4 + 3 +ACAD_FIELDLIST +350 +1D7 + 3 +ACAD_GROUP +350 +32 + 3 +ACAD_LAYOUT +350 +15 + 3 +ACAD_MATERIAL +350 +E + 3 +ACAD_MLEADERSTYLE +350 +3A + 3 +ACAD_MLINESTYLE +350 +33 + 3 +ACAD_PLOTSETTINGS +350 +34 + 3 +ACAD_PLOTSTYLENAME +350 +A + 3 +ACAD_SCALELIST +350 +38 + 3 +ACAD_SECTIONVIEWSTYLE +350 +1D2 + 3 +ACAD_TABLESTYLE +350 +39 + 3 +ACAD_VISUALSTYLE +350 +2A + 3 +ACDB_RECOMPOSE_DATA +350 +24D + 3 +ACDBVARIABLEDICTIONARY +350 +3B + 3 +AcDsDecomposeData +350 +253 + 3 +ZCAD_TAG_ROOTDATA +350 +66 +1001 +ADE +1000 +ADE02C004 +1000 +[Query] +1000 +CaseSensitiveMatch=0 +1000 +SaveCurrQueryInSession=1 +1000 +MkSelSetWithQryObj=0 +1000 +ShowBlockAsInsPt=0 +1000 +CreateAssociativeHatchObjects=0 +1000 +ReferenceBoundaryForAreaLocation=1 +1000 +ShowImageAsBoundary=1 +1000 +DefaultJoinOperator=2 +1000 +ColorForAdd=red +1000 +ColorForRemove=red +1000 +BlockLocnForQuery=1 +1000 +TextLocnForQuery=1 +1000 +IncludeAllObjectsInGroups=0 +1000 +AlwaysUseLibraryDefinitions=0 +1000 +PreviewDefinitionsFrom=2 +1000 +[Save Back] +1000 +RedefineBlockDefinitions=1 +1000 +RedefineLayerDefinitions=1 +1000 +RedefineTextStyleDefinitions=1 +1000 +RemoveUnusedGroups=1 +1000 +EraseSavedBackObjects=1 +1000 +RemoveLockAfterSave=1 +1000 +CreateHistoryFileOfChanges=0 +1000 +CreateBackupFileOfSourceDwg=1 +1000 +DontAddObjectsToSaveSet=0 +1000 +MarkObjectsForEditingWithoutPrompting=0 +1000 +FdoDontAddObjsToSvSet=0 +1000 +FdoEditWithoutPrompt=1 +1000 +FdoRemUnusedGrps=1 +1000 +FdoEraseSvdBkObjs=1 +1000 +FdoRemoveLockOnSave=1 +1000 +FdoTesselationMaxPointsDistance=0 +1000 +FdoTesselationMaxCurvesDistance=0 +1000 +[Coordinate Transformation] +1000 +RestoreLastActiveDwgsOnStartup=1 +1000 +ActivateDwgsOnAttach=1 +1000 +AdjustSizesAndScalesForChangesInUnits=1 +1000 +AdjustRotationsForMapDistortions=1 +1000 +AdjustSizesAndScalesForMapDistortions=1 +1000 +AdjustElevations=1 +1000 +AdjustZeroRotationObjects=1 +1000 +ReconnectDbOnWSOpen=1 +1000 +NoOfSQLConditionsInHistory=10 + 0 +DICTIONARY + 5 +1F +330 +1E +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_LAYERSTATES +360 +20 + 3 +ACLYDICTIONARY +360 +21 + 0 +DICTIONARY + 5 +7 +330 +6 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ADSK_XREC_LAYER_RECONCILED +360 +8 + 0 +DICTIONARY + 5 +3 +330 +2 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_SORTENTS +360 +1A9 + 0 +DICTIONARY + 5 +1AD +330 +103 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_MLATT +360 +24A + 3 +ACAD_XREC_ROUNDTRIP +360 +249 + 0 +DICTIONARY + 5 +1B0 +330 +12B +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_MLATT +360 +24C + 3 +ACAD_XREC_ROUNDTRIP +360 +24B + 0 +DICTIONARY + 5 +1FF +330 +1FE +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ASDK_XREC_ANNOTATION_SCALE_INFO +360 +200 + 0 +XRECORD + 5 +1DE +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbXrecord +280 + 1 +300 +ACD +300 +2023 +300 + + 0 +DICTIONARY + 5 +37 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 0 +DICTIONARY + 5 +1D4 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +Metric50 +350 +1D5 + 0 +FIELDLIST + 5 +1D7 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbIdSet + 90 + 0 +100 +AcDbFieldList + 0 +DICTIONARY + 5 +32 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 0 +DICTIONARY + 5 +15 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +Layout1 +350 +1C + 3 +Model +350 +14 + 0 +DICTIONARY + 5 +E +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +ByBlock +350 +36 + 3 +ByLayer +350 +35 + 3 +Global +350 +D + 0 +DICTIONARY + 5 +3A +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +Standard +350 +1D1 + 0 +DICTIONARY + 5 +33 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +Standard +350 +51 + 0 +DICTIONARY + 5 +34 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 0 +ACDBDICTIONARYWDFLT + 5 +A +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +Normal +350 +9 +100 +AcDbDictionaryWithDefault +340 +9 + 0 +DICTIONARY + 5 +38 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +A0 +350 +55 + 3 +A1 +350 +56 + 3 +A2 +350 +57 + 3 +A3 +350 +58 + 3 +A4 +350 +59 + 3 +A5 +350 +5A + 3 +A6 +350 +5B + 3 +A7 +350 +5C + 3 +A8 +350 +5D + 3 +A9 +350 +5E + 3 +B0 +350 +5F + 3 +B1 +350 +60 + 3 +B2 +350 +61 + 3 +B3 +350 +62 + 3 +B4 +350 +63 + 3 +B5 +350 +64 + 3 +B6 +350 +65 + 0 +DICTIONARY + 5 +1D2 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +Metric50 +350 +1D3 + 0 +DICTIONARY + 5 +39 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +Standard +350 +52 + 0 +DICTIONARY + 5 +2A +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +2dWireframe +350 +29 + 3 +3dWireframe +350 +54 + 3 +Basic +350 +1BF + 3 +Brighten +350 +1C4 + 3 +ColorChange +350 +1C8 + 3 +Conceptual +350 +1C2 + 3 +Dim +350 +1C3 + 3 +EdgeColorOff +350 +1D0 + 3 +Facepattern +350 +1C7 + 3 +Flat +350 +1BB + 3 +FlatWithEdges +350 +1BC + 3 +Gouraud +350 +1BD + 3 +GouraudWithEdges +350 +1BE + 3 +Hidden +350 +1C1 + 3 +JitterOff +350 +1CE + 3 +Linepattern +350 +1C6 + 3 +OverhangOff +350 +1CF + 3 +Realistic +350 +53 + 3 +Shaded +350 +1CD + 3 +Shaded with edges +350 +1CC + 3 +Shades of Gray +350 +1C9 + 3 +Sketchy +350 +1CA + 3 +Thicken +350 +1C5 + 3 +Wireframe +350 +1C0 + 3 +X-Ray +350 +1CB + 0 +XRECORD + 5 +24D +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbXrecord +280 + 1 + 90 + 1 +330 +52 +330 +103 +330 +12B + 0 +DICTIONARY + 5 +3B +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 2 + 3 +#REVCLOUDAPPROXARCLEN +350 +3C + 3 +ANNOALLVISIBLE +350 +3D + 3 +CANNOSCALE +350 +3E + 3 +CMLEADERSTYLE +350 +3F + 3 +CTABLESTYLE +350 +40 + 3 +CVIEWDETAILSTYLE +350 +41 + 3 +CVIEWSECTIONSTYLE +350 +42 + 3 +DIMADEC +350 +43 + 3 +FIELDEVAL +350 +44 + 3 +HPCOLOR +350 +45 + 3 +HPORIGIN +350 +46 + 3 +HPTRANSPARENCY +350 +47 + 3 +LAYEREVAL +350 +48 + 3 +LAYERNOTIFY +350 +49 + 3 +LIGHTINGUNITS +350 +4A + 3 +MARKUPASSISTMODE +350 +4B + 3 +MLEADERSCALE +350 +4C + 3 +MSLTSCALE +350 +4D + 3 +OLEFRAME +350 +4E + 3 +PDFFRAME +350 +4F + 3 +XCLIPFRAME +350 +50 + 0 +DICTIONARY + 5 +253 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +AcDbDictionary +281 + 1 + 3 +AcDsRecords +350 +255 + 3 +AcDsSchemas +350 +254 +1001 +ACAD +1070 + 2 + 0 +TAGROOTDATA + 5 +66 +102 +{ACAD_REACTORS +330 +B +102 +} +330 +B +100 +ZcDbTagRootData + 90 + 0 + 91 + 0 + 0 +DICTIONARY + 5 +20 +102 +{ACAD_REACTORS +330 +1F +102 +} +330 +1F +100 +AcDbDictionary +281 + 1 + 0 +DICTIONARY + 5 +21 +102 +{ACAD_REACTORS +330 +1F +102 +} +330 +1F +100 +AcDbDictionary +281 + 1 + 0 +XRECORD + 5 +8 +102 +{ACAD_REACTORS +330 +7 +102 +} +330 +7 +100 +AcDbXrecord +280 + 1 +290 + 1 + 0 +SORTENTSTABLE + 5 +1A9 +102 +{ACAD_REACTORS +330 +3 +102 +} +330 +3 +100 +AcDbSortentsTable +330 +2 +331 +69 + 5 +9E +331 +6E + 5 +A0 +331 +70 + 5 +A1 +331 +72 + 5 +A2 +331 +73 + 5 +A3 +331 +74 + 5 +A4 +331 +75 + 5 +A5 +331 +76 + 5 +A6 +331 +78 + 5 +A7 +331 +79 + 5 +A8 +331 +7A + 5 +A9 +331 +7B + 5 +AA +331 +7C + 5 +AB +331 +7D + 5 +AC +331 +80 + 5 +AD +331 +82 + 5 +AE +331 +83 + 5 +AF +331 +84 + 5 +B0 +331 +87 + 5 +B1 +331 +88 + 5 +B2 +331 +89 + 5 +B3 +331 +8F + 5 +BA +331 +90 + 5 +BB +331 +92 + 5 +BC +331 +93 + 5 +BD +331 +96 + 5 +C0 +331 +97 + 5 +C1 +331 +9E + 5 +C8 +331 +9F + 5 +C9 +331 +A0 + 5 +CA +331 +A1 + 5 +CB +331 +A2 + 5 +CC +331 +A3 + 5 +CD +331 +A4 + 5 +CE +331 +A5 + 5 +CF +331 +A6 + 5 +D0 +331 +C0 + 5 +EA +331 +C1 + 5 +EB +331 +C2 + 5 +ED +331 +C4 + 5 +EE +331 +C5 + 5 +EF +331 +C6 + 5 +F0 +331 +C7 + 5 +F1 +331 +C8 + 5 +F2 +331 +C9 + 5 +F3 +331 +CA + 5 +F4 +331 +CB + 5 +F5 +331 +CD + 5 +F7 +331 +CE + 5 +F8 +331 +CF + 5 +F9 +331 +D1 + 5 +FB +331 +D2 + 5 +FC +331 +D3 + 5 +FD +331 +D4 + 5 +FE +331 +D5 + 5 +100 +331 +D6 + 5 +101 +331 +D7 + 5 +102 +331 +D8 + 5 +103 +331 +D9 + 5 +105 +331 +DA + 5 +106 +331 +DB + 5 +107 +331 +DC + 5 +10A +331 +DE + 5 +10B +331 +DF + 5 +10C +331 +E0 + 5 +10D +331 +E1 + 5 +10E +331 +E2 + 5 +10F +331 +E3 + 5 +110 +331 +E4 + 5 +111 +331 +E5 + 5 +112 +331 +E6 + 5 +113 +331 +E7 + 5 +114 +331 +E8 + 5 +115 +331 +E9 + 5 +116 +331 +EA + 5 +117 +331 +EB + 5 +118 +331 +EC + 5 +119 +331 +ED + 5 +11A +331 +EE + 5 +11B +331 +EF + 5 +11C +331 +F0 + 5 +11D +331 +F1 + 5 +11E +331 +F3 + 5 +120 +331 +F4 + 5 +121 +331 +F6 + 5 +123 +331 +F7 + 5 +124 +331 +F8 + 5 +125 +331 +F9 + 5 +126 +331 +FA + 5 +127 +331 +FB + 5 +129 +331 +FC + 5 +12B +331 +FD + 5 +12D +331 +FE + 5 +131 +331 +100 + 5 +130 +331 +101 + 5 +12F +331 +102 + 5 +12E +331 +103 + 5 +109 +331 +105 + 5 +EC +331 +106 + 5 +9D +331 +107 + 5 +9C +331 +109 + 5 +9B +331 +10A + 5 +9A +331 +10B + 5 +99 +331 +10C + 5 +97 +331 +10D + 5 +96 +331 +10E + 5 +95 +331 +10F + 5 +94 +331 +110 + 5 +93 +331 +111 + 5 +92 +331 +112 + 5 +90 +331 +113 + 5 +8F +331 +114 + 5 +8E +331 +115 + 5 +8D +331 +116 + 5 +8C +331 +117 + 5 +8B +331 +118 + 5 +8A +331 +119 + 5 +89 +331 +11A + 5 +88 +331 +11B + 5 +87 +331 +11C + 5 +84 +331 +11D + 5 +83 +331 +11E + 5 +82 +331 +11F + 5 +80 +331 +120 + 5 +7D +331 +121 + 5 +7C +331 +122 + 5 +7B +331 +123 + 5 +7A +331 +124 + 5 +79 +331 +125 + 5 +78 +331 +126 + 5 +76 +331 +127 + 5 +75 +331 +129 + 5 +74 +331 +12B + 5 +73 +331 +12D + 5 +72 +331 +12E + 5 +70 +331 +12F + 5 +6E +331 +130 + 5 +6C +331 +131 + 5 +69 + 0 +XRECORD + 5 +24A +102 +{ACAD_REACTORS +330 +1AD +102 +} +330 +1AD +100 +AcDbXrecord +280 + 1 + 70 + 4 + 70 + 0 + 70 + 0 + 40 +1.0 + 2 +NAZEV_AKCE + 1 +Embedded Object + 10 +101.3829787234043 + 20 +87.50000000000012 + 30 +0.0 + 40 +2.799999999999998 + 41 +80.95548956477973 + 46 +0.0 + 71 + 5 + 72 + 5 + 1 + + 7 +Název stavby + 73 + 1 + 44 +1.0 + 0 +XRECORD + 5 +249 +102 +{ACAD_REACTORS +330 +1AD +102 +} +330 +1AD +100 +AcDbXrecord +280 + 1 +102 +ACAD_MATT_HEIGHT +140 +2.799999999999998 + 0 +XRECORD + 5 +24C +102 +{ACAD_REACTORS +330 +1B0 +102 +} +330 +1B0 +100 +AcDbXrecord +280 + 1 + 70 + 4 + 70 + 0 + 70 + 0 + 40 +1.0 + 2 +OBJEKT_NAZEV + 1 +Embedded Object + 10 +61.07929842448342 + 20 +71.13558406083268 + 30 +0.0 + 40 +3.5 + 41 +80.69696774239551 + 46 +0.0 + 71 + 1 + 72 + 1 + 1 + + 7 +Název objektu + 73 + 1 + 44 +1.0 + 0 +XRECORD + 5 +24B +102 +{ACAD_REACTORS +330 +1B0 +102 +} +330 +1B0 +100 +AcDbXrecord +280 + 1 +102 +ACAD_MATT_HEIGHT +140 +3.5 + 0 +XRECORD + 5 +200 +102 +{ACAD_REACTORS +330 +1FF +102 +} +330 +1FF +100 +AcDbXrecord +280 + 1 + 90 + 1 +340 +55 + 0 +ACDBDETAILVIEWSTYLE + 5 +1D5 +102 +{ACAD_XDICTIONARY +360 +258 +102 +} +102 +{ACAD_REACTORS +330 +1D4 +102 +} +330 +1D4 +100 +AcDbModelDocViewStyle + 70 + 0 + 3 +Metric50 +290 + 0 +100 +AcDbDetailViewStyle + 70 + 0 + 71 + 0 + 90 + 3 + 71 + 1 +340 +30 + 62 + 256 + 40 +5.0 +340 +0 + 62 + 256 + 40 +5.0 +300 + + 40 +0.0 +280 + 1 + 71 + 2 +340 +11 + 90 + 25 + 62 + 256 + 71 + 3 +340 +30 + 62 + 256 + 40 +5.0 + 90 + 0 + 40 +15.0 + 90 + 1 +300 +%<\AcVar ViewDetailId>% (%<\AcVar ViewScale \f "%sn">%) + 71 + 4 +340 +11 + 90 + 25 + 62 + 256 +340 +11 + 90 + 25 + 62 + 256 +280 + 0 + 0 +LAYOUT + 5 +1C +102 +{ACAD_REACTORS +330 +15 +102 +} +330 +15 +100 +AcDbPlotSettings + 1 + + 2 +DWG to PDF.pc5 + 4 +210x297 + 6 + + 40 +0.0 + 41 +0.0 + 42 +0.0 + 43 +0.0 + 44 +210.0 + 45 +297.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 + 688 + 72 + 1 + 73 + 0 + 74 + 5 + 7 + + 75 + 16 +147 +1.0 + 76 + 0 + 77 + 2 + 78 + 300 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Layout1 + 70 + 1 + 71 + 1 + 10 +0.0 + 20 +0.0 + 11 +210.0 + 21 +297.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +1.000000000000000E+20 + 24 +1.000000000000000E+20 + 34 +1.000000000000000E+20 + 15 +-1.000000000000000E+20 + 25 +-1.000000000000000E+20 + 35 +-1.000000000000000E+20 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 + 0 +330 +19 +331 +1FE +1001 +ACAD_PSEXT +1000 +DWG to PDF.pc5 +1000 +DWG to PDF +1000 +Soubor +1000 + +1070 + 0 + 0 +LAYOUT + 5 +14 +102 +{ACAD_REACTORS +330 +15 +102 +} +330 +15 +100 +AcDbPlotSettings + 1 + + 2 +DWG To PDF.pc5 + 4 +UserDefinedMetric (210.00 x 297.00MM) + 6 + + 40 +0.0 + 41 +0.0 + 42 +0.0 + 43 +0.0 + 44 +210.0 + 45 +297.0 + 46 +0.0000000000002274 + 47 +0.0 + 48 +1958.503442225681 + 49 +918.9265359469022 +140 +2168.503442225681 +141 +1215.926535946903 +142 +1.0 +143 +1.000000000000001 + 70 + 11956 + 72 + 1 + 73 + 0 + 74 + 4 + 7 +Zcad.ctb + 75 + 0 +147 +0.9999999999999978 + 76 + 1 + 77 + 2 + 78 + 300 +148 +-1958.503442225681 +149 +-918.9265359469022 +100 +AcDbLayout + 1 +Model + 70 + 1 + 71 + 0 + 10 +0.0 + 20 +0.0 + 11 +12.0 + 21 +9.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +0.0 + 24 +0.0 + 34 +0.0 + 15 +0.0 + 25 +0.0 + 35 +0.0 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 + 0 +330 +2 +331 +28 +1001 +ACAD_PSEXT +1000 +DWG To PDF.pc3 +1000 +DWG To PDF +1000 +File +1000 + +1070 + 0 + 0 +MATERIAL + 5 +36 +102 +{ACAD_REACTORS +330 +E +102 +} +330 +E +100 +AcDbMaterial + 1 +ByBlock + 72 + 0 + 77 + 0 +171 + 0 +175 + 0 +179 + 0 + 0 +MATERIAL + 5 +35 +102 +{ACAD_REACTORS +330 +E +102 +} +330 +E +100 +AcDbMaterial + 1 +ByLayer + 72 + 0 + 77 + 0 +171 + 0 +175 + 0 +179 + 0 + 0 +MATERIAL + 5 +D +102 +{ACAD_XDICTIONARY +360 +F +102 +} +102 +{ACAD_REACTORS +330 +E +102 +} +330 +E +100 +AcDbMaterial + 1 +Global + 72 + 0 + 77 + 0 +171 + 0 +175 + 0 +179 + 0 + 0 +MLEADERSTYLE + 5 +1D1 +102 +{ACAD_REACTORS +330 +3A +102 +} +330 +3A +100 +AcDbMLeaderStyle +179 + 2 +170 + 2 +171 + 1 +172 + 0 + 90 + 2 + 40 +0.0 + 41 +0.0 +173 + 1 + 91 +-1056964608 +340 +24 + 92 + -2 +290 + 1 + 42 +2.0 +291 + 1 + 43 +0.36 + 3 +Standard + 44 +4.0 +300 + +342 +30 +174 + 1 +178 + 6 +175 + 1 +176 + 0 + 93 +-1056964608 + 45 +4.0 +292 + 0 +297 + 0 + 46 +4.0 + 94 +-1056964608 + 47 +1.0 + 49 +1.0 +140 +1.0 +293 + 1 +141 +0.0 +294 + 1 +177 + 0 +142 +1.0 +295 + 0 +296 + 0 +143 +0.125 +271 + 0 +272 + 9 +273 + 9 +298 + 1 + 0 +MLINESTYLE + 5 +51 +102 +{ACAD_REACTORS +330 +33 +102 +} +330 +33 +100 +AcDbMlineStyle + 2 +STANDARD + 70 + 0 + 3 + + 62 + 256 + 51 +90.0 + 52 +90.0 + 71 + 2 + 49 +0.5 + 62 + 256 + 6 +BYLAYER + 49 +-0.5 + 62 + 256 + 6 +BYLAYER + 0 +ACDBPLACEHOLDER + 5 +9 +102 +{ACAD_REACTORS +330 +A +102 +} +330 +A + 0 +SCALE + 5 +55 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:1 +140 +1.0 +141 +1.0 +290 + 1 + 0 +SCALE + 5 +56 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:2 +140 +1.0 +141 +2.0 +290 + 0 + 0 +SCALE + 5 +57 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:4 +140 +1.0 +141 +4.0 +290 + 0 + 0 +SCALE + 5 +58 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:5 +140 +1.0 +141 +5.0 +290 + 0 + 0 +SCALE + 5 +59 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:8 +140 +1.0 +141 +8.0 +290 + 0 + 0 +SCALE + 5 +5A +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:10 +140 +1.0 +141 +10.0 +290 + 0 + 0 +SCALE + 5 +5B +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:16 +140 +1.0 +141 +16.0 +290 + 0 + 0 +SCALE + 5 +5C +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:20 +140 +1.0 +141 +20.0 +290 + 0 + 0 +SCALE + 5 +5D +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:30 +140 +1.0 +141 +30.0 +290 + 0 + 0 +SCALE + 5 +5E +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:40 +140 +1.0 +141 +40.0 +290 + 0 + 0 +SCALE + 5 +5F +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:50 +140 +1.0 +141 +50.0 +290 + 0 + 0 +SCALE + 5 +60 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +1:100 +140 +1.0 +141 +100.0 +290 + 0 + 0 +SCALE + 5 +61 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +2:1 +140 +2.0 +141 +1.0 +290 + 0 + 0 +SCALE + 5 +62 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +4:1 +140 +4.0 +141 +1.0 +290 + 0 + 0 +SCALE + 5 +63 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +8:1 +140 +8.0 +141 +1.0 +290 + 0 + 0 +SCALE + 5 +64 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +10:1 +140 +10.0 +141 +1.0 +290 + 0 + 0 +SCALE + 5 +65 +102 +{ACAD_REACTORS +330 +38 +102 +} +330 +38 +100 +AcDbScale + 70 + 0 +300 +100:1 +140 +100.0 +141 +1.0 +290 + 0 + 0 +ACDBSECTIONVIEWSTYLE + 5 +1D3 +102 +{ACAD_XDICTIONARY +360 +256 +102 +} +102 +{ACAD_REACTORS +330 +1D2 +102 +} +330 +1D2 +100 +AcDbModelDocViewStyle + 70 + 0 + 3 +Metric50 +290 + 0 +100 +AcDbSectionViewStyle + 70 + 0 + 71 + 0 + 90 + 102 + 71 + 1 +340 +30 + 62 + 256 + 40 +5.0 +340 +0 +340 +0 + 62 + 256 + 40 +5.0 +300 +I, O, Q, S, X, Z + 40 +10.0 + 90 + 0 + 40 +2.5 + 90 + 0 + 71 + 2 +340 +11 + 90 + 25 + 62 + 256 +340 +11 + 90 + 50 + 62 + 256 + 40 +5.0 + 40 +2.5 + 40 +5.0 + 71 + 3 +340 +30 + 62 + 256 + 40 +5.0 + 90 + 0 + 40 +15.0 + 90 + 1 +300 +%<\AcVar ViewSectionStartId>%-%<\AcVar ViewSectionEndId>% (%<\AcVar ViewScale \f "%sn">%) + 71 + 4 + 62 + 256 + 62 + 257 +300 +ANSI31 + 40 +1.0 + 90 + 0 +290 + 0 +290 + 0 + 90 + 6 + 40 +0.0 + 40 +1.570796326794896 + 40 +0.2617993877991494 + 40 +1.308996938995747 + 40 +-0.2617993877991494 + 40 +1.832595714594045 + 0 +TABLESTYLE + 5 +52 +102 +{ACAD_XDICTIONARY +360 +1B3 +102 +} +102 +{ACAD_REACTORS +330 +39 +102 +} +330 +39 +100 +AcDbTableStyle +280 + 0 + 3 +Standard + 70 + 1 + 71 + 0 + 40 +0.06 + 41 +0.06 +280 + 0 +281 + 0 + 7 +Standard +140 +0.18 +170 + 2 + 62 + 0 + 63 + 7 +283 + 0 + 90 + 512 + 91 + 0 + 1 + +274 + -2 +284 + 1 + 64 + 0 +275 + -2 +285 + 1 + 65 + 0 +276 + -2 +286 + 1 + 66 + 0 +277 + -2 +287 + 1 + 67 + 0 +278 + -2 +288 + 1 + 68 + 0 +279 + -2 +289 + 1 + 69 + 0 + 7 +Standard +140 +0.25 +170 + 5 + 62 + 0 + 63 + 7 +283 + 0 + 90 + 512 + 91 + 0 + 1 + +274 + -2 +284 + 1 + 64 + 0 +275 + -2 +285 + 1 + 65 + 0 +276 + -2 +286 + 1 + 66 + 0 +277 + -2 +287 + 1 + 67 + 0 +278 + -2 +288 + 1 + 68 + 0 +279 + -2 +289 + 1 + 69 + 0 + 7 +Standard +140 +0.18 +170 + 5 + 62 + 0 + 63 + 7 +283 + 0 + 90 + 512 + 91 + 0 + 1 + +274 + -2 +284 + 1 + 64 + 0 +275 + -2 +285 + 1 + 65 + 0 +276 + -2 +286 + 1 + 66 + 0 +277 + -2 +287 + 1 + 67 + 0 +278 + -2 +288 + 1 + 68 + 0 +279 + -2 +289 + 1 + 69 + 0 + 0 +VISUALSTYLE + 5 +29 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +2dWireframe + 70 + 4 +177 + 3 +291 + 0 + 70 + 58 + 90 + 0 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +176 + 1 + 90 + 1 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 257 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +54 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +3dWireframe + 70 + 5 +177 + 3 +291 + 0 + 70 + 58 + 90 + 0 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +176 + 1 + 90 + 1 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 257 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1BF +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Basic + 70 + 7 +177 + 3 +291 + 1 + 70 + 58 + 90 + 1 +176 + 1 + 90 + 0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 0 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1C4 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Brighten + 70 + 12 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 1 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +50.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1C8 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +ColorChange + 70 + 16 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 3 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 8 +420 + 8421504 +176 + 1 + 90 + 1 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 8 +420 + 8421504 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1C2 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Conceptual + 70 + 9 +177 + 3 +291 + 0 + 70 + 58 + 90 + 3 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +179.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 3 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1C3 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Dim + 70 + 11 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 1 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +-50.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1D0 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +EdgeColorOff + 70 + 22 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 0 + 90 + 2 +176 + 0 + 90 + 0 +176 + 0 + 90 + 0 +176 + 0 + 40 +0.6 +176 + 0 + 40 +30.0 +176 + 0 + 62 + 7 +420 + 16777215 +176 + 0 + 90 + 1 +176 + 0 + 90 + 4 +176 + 0 + 62 + 7 +176 + 0 + 62 + 257 +176 + 0 + 90 + 1 +176 + 0 + 90 + 1 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 8 +176 + 2 + 62 + 7 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 1 +176 + 0 + 90 + 6 +176 + 0 + 90 + 2 +176 + 0 + 62 + 7 +176 + 0 + 90 + 5 +176 + 0 + 90 + 0 +176 + 0 + 90 + 0 +176 + 0 +290 + 0 +176 + 0 + 90 + 1 +176 + 0 + 40 +0.0 +176 + 0 + 90 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 1 +176 + 0 +290 + 1 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 + 90 + 50 +176 + 0 + 40 +0.0 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 0 +176 + 0 + 62 + 18 +176 + 0 + 90 + 50 +176 + 0 + 90 + 3 +176 + 0 + 62 + 5 +420 + 255 +176 + 0 +290 + 0 +176 + 0 + 90 + 50 +176 + 0 + 90 + 50 +176 + 0 + 90 + 50 +176 + 0 +290 + 0 +176 + 0 + 90 + 50 +176 + 0 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 0 + 1 +strokes_ogs.tif +176 + 0 +290 + 0 +176 + 0 + 40 +1.0 +176 + 0 + 40 +1.0 +176 + 0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1C7 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Facepattern + 70 + 15 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 1 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1BB +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Flat + 70 + 0 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 90 + 2 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 13 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1BC +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +FlatWithEdges + 70 + 1 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 90 + 2 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 1 +176 + 1 + 90 + 0 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 257 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 13 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1BD +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Gouraud + 70 + 2 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 1 +176 + 1 + 90 + 2 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 13 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1BE +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +GouraudWithEdges + 70 + 3 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 1 +176 + 1 + 90 + 2 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 1 +176 + 1 + 90 + 0 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 257 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 13 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1C1 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Hidden + 70 + 6 +177 + 3 +291 + 0 + 70 + 58 + 90 + 1 +176 + 1 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 2 +176 + 1 + 90 + 1 +176 + 1 + 40 +40.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 257 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 3 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1CE +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +JitterOff + 70 + 20 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 0 + 90 + 2 +176 + 0 + 90 + 0 +176 + 0 + 90 + 0 +176 + 0 + 40 +0.6 +176 + 0 + 40 +30.0 +176 + 0 + 62 + 7 +420 + 16777215 +176 + 0 + 90 + 1 +176 + 0 + 90 + 4 +176 + 0 + 62 + 7 +176 + 0 + 62 + 257 +176 + 0 + 90 + 1 +176 + 0 + 90 + 1 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 10 +176 + 2 + 62 + 7 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 1 +176 + 0 + 90 + 6 +176 + 0 + 90 + 2 +176 + 0 + 62 + 7 +176 + 0 + 90 + 5 +176 + 0 + 90 + 0 +176 + 0 + 90 + 0 +176 + 0 +290 + 0 +176 + 0 + 90 + 1 +176 + 0 + 40 +0.0 +176 + 0 + 90 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 1 +176 + 0 +290 + 1 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 + 90 + 50 +176 + 0 + 40 +0.0 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 0 +176 + 0 + 62 + 18 +176 + 0 + 90 + 50 +176 + 0 + 90 + 3 +176 + 0 + 62 + 5 +420 + 255 +176 + 0 +290 + 0 +176 + 0 + 90 + 50 +176 + 0 + 90 + 50 +176 + 0 + 90 + 50 +176 + 0 +290 + 0 +176 + 0 + 90 + 50 +176 + 0 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 0 + 1 +strokes_ogs.tif +176 + 0 +290 + 0 +176 + 0 + 40 +1.0 +176 + 0 + 40 +1.0 +176 + 0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1C6 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Linepattern + 70 + 14 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 1 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 7 +176 + 1 + 90 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1CF +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +OverhangOff + 70 + 21 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 0 + 90 + 2 +176 + 0 + 90 + 0 +176 + 0 + 90 + 0 +176 + 0 + 40 +0.6 +176 + 0 + 40 +30.0 +176 + 0 + 62 + 7 +420 + 16777215 +176 + 0 + 90 + 1 +176 + 0 + 90 + 4 +176 + 0 + 62 + 7 +176 + 0 + 62 + 257 +176 + 0 + 90 + 1 +176 + 0 + 90 + 1 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 9 +176 + 2 + 62 + 7 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 1 +176 + 0 + 90 + 6 +176 + 0 + 90 + 2 +176 + 0 + 62 + 7 +176 + 0 + 90 + 5 +176 + 0 + 90 + 0 +176 + 0 + 90 + 0 +176 + 0 +290 + 0 +176 + 0 + 90 + 1 +176 + 0 + 40 +0.0 +176 + 0 + 90 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 1 +176 + 0 +290 + 1 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 +290 + 0 +176 + 0 + 90 + 50 +176 + 0 + 40 +0.0 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 0 +176 + 0 + 62 + 18 +176 + 0 + 90 + 50 +176 + 0 + 90 + 3 +176 + 0 + 62 + 5 +420 + 255 +176 + 0 +290 + 0 +176 + 0 + 90 + 50 +176 + 0 + 90 + 50 +176 + 0 + 90 + 50 +176 + 0 +290 + 0 +176 + 0 + 90 + 50 +176 + 0 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 0 + 1 +strokes_ogs.tif +176 + 0 +290 + 0 +176 + 0 + 40 +1.0 +176 + 0 + 40 +1.0 +176 + 0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +53 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Realistic + 70 + 8 +177 + 3 +291 + 0 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +176 + 1 + 90 + 1 +176 + 1 + 90 + 0 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 8 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 13 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1CD +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Shaded + 70 + 27 +177 + 3 +291 + 0 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 1 +176 + 1 + 90 + 2 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 0 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 257 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 8 +420 + 7895160 +176 + 1 + 90 + 3 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 5 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1CC +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Shaded with edges + 70 + 26 +177 + 3 +291 + 0 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 1 +176 + 1 + 90 + 2 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 1 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 2 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 257 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 3 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 5 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1C9 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Shades of Gray + 70 + 23 +177 + 3 +291 + 0 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 3 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 62 + 7 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +40.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 3 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1CA +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Sketchy + 70 + 24 +177 + 3 +291 + 0 + 70 + 58 + 90 + 1 +176 + 1 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 62 + 7 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +40.0 +176 + 1 + 90 + 11 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 6 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1C5 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Thicken + 70 + 13 +177 + 3 +291 + 1 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 1 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 12 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 5 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1C0 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Wireframe + 70 + 5 +177 + 3 +291 + 0 + 70 + 58 + 90 + 0 +176 + 1 + 90 + 2 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 + 40 +0.6 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 1 +176 + 1 + 90 + 4 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 257 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 3 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +1CB +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +X-Ray + 70 + 25 +177 + 3 +291 + 0 + 70 + 58 + 90 + 2 +176 + 1 + 90 + 2 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +0.5 +176 + 1 + 40 +30.0 +176 + 1 + 62 + 7 +420 + 16777215 +176 + 1 + 90 + 1 +176 + 1 + 90 + 0 +176 + 1 + 62 + 7 +176 + 1 + 62 + 257 +176 + 1 + 90 + 1 +176 + 1 + 90 + 1 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 8 +176 + 1 + 62 + 7 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 1 +176 + 1 + 90 + 6 +176 + 1 + 90 + 2 +176 + 1 + 62 + 7 +176 + 1 + 90 + 3 +176 + 1 + 90 + 0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 13 +176 + 1 + 40 +0.0 +176 + 1 + 90 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 1 +176 + 1 +290 + 1 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 40 +0.0 +176 + 1 + 40 +1.0 +176 + 1 + 90 + 0 +176 + 1 + 62 + 18 +176 + 1 + 90 + 50 +176 + 1 + 90 + 3 +176 + 1 + 62 + 5 +420 + 255 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 + 90 + 50 +176 + 1 +290 + 0 +176 + 1 + 90 + 50 +176 + 1 + 62 + 256 +176 + 0 + 40 +1.0 +176 + 0 + 90 + 2 +176 + 1 + 1 +strokes_ogs.tif +176 + 1 +290 + 0 +176 + 1 + 40 +1.0 +176 + 1 + 40 +1.0 +176 + 1 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +DICTIONARYVAR + 5 +3C +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +0.449704 + 0 +DICTIONARYVAR + 5 +3D +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +1 + 0 +DICTIONARYVAR + 5 +3E +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +1:1 + 0 +DICTIONARYVAR + 5 +3F +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +STANDARD + 0 +DICTIONARYVAR + 5 +40 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +STANDARD + 0 +DICTIONARYVAR + 5 +41 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +Metric50 + 0 +DICTIONARYVAR + 5 +42 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +Metric50 + 0 +DICTIONARYVAR + 5 +43 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +0 + 0 +DICTIONARYVAR + 5 +44 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +0 + 0 +DICTIONARYVAR + 5 +45 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +252 + 0 +DICTIONARYVAR + 5 +46 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +0.000000;0.000000 + 0 +DICTIONARYVAR + 5 +47 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +. + 0 +DICTIONARYVAR + 5 +48 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +0 + 0 +DICTIONARYVAR + 5 +49 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +15 + 0 +DICTIONARYVAR + 5 +4A +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +0 + 0 +DICTIONARYVAR + 5 +4B +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +0 + 0 +DICTIONARYVAR + 5 +4C +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +1.000000 + 0 +DICTIONARYVAR + 5 +4D +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +1 + 0 +DICTIONARYVAR + 5 +4E +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +2 + 0 +DICTIONARYVAR + 5 +4F +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +1 + 0 +DICTIONARYVAR + 5 +50 +102 +{ACAD_REACTORS +330 +3B +102 +} +330 +3B +100 +DictionaryVariables +280 + 0 + 1 +0 + 0 +DICTIONARY + 5 +255 +102 +{ACAD_REACTORS +330 +253 +102 +} +330 +253 +100 +AcDbDictionary +281 + 1 + 0 +DICTIONARY + 5 +254 +102 +{ACAD_REACTORS +330 +253 +102 +} +330 +253 +100 +AcDbDictionary +281 + 1 + 3 +2622071008608 +350 +24E + 3 +2622071008624 +350 +24F + 3 +2622071008640 +350 +250 + 3 +2622071008656 +350 +251 + 3 +2622071008672 +350 +252 + 0 +DICTIONARY + 5 +258 +330 +1D5 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +259 + 0 +DICTIONARY + 5 +F +330 +D +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +FBXASSET +360 +10 + 0 +DICTIONARY + 5 +256 +330 +1D3 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +257 + 0 +DICTIONARY + 5 +1B3 +330 +52 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_ROUNDTRIP_2008_TABLESTYLE_CELLSTYLEMAP +360 +248 + 0 +XRECORD + 5 +24E +102 +{ACAD_REACTORS +330 +254 +102 +} +330 +254 +100 +AcDbXrecord +280 + 1 + 1 +AcDb_Thumbnail_Schema +102 +{ATTRRECORD +341 +24F + 2 +AcDbDs::TreatedAsObjectData +280 + 1 +291 + 1 +102 +ATTRRECORD} +102 +{ATTRRECORD +341 +250 + 2 +AcDbDs::Legacy +280 + 1 +291 + 1 +102 +ATTRRECORD} + 2 +AcDbDs::ID +280 + 10 + 91 + 8 +102 +{ATTRRECORD +341 +251 + 2 +AcDs:Indexable +280 + 1 +291 + 1 +102 +ATTRRECORD} +102 +{ATTRRECORD +341 +252 + 2 +AcDbDs::HandleAttribute +280 + 7 +282 + 1 +102 +ATTRRECORD} + 2 +Thumbnail_Data +280 + 15 + 91 + 0 + 0 +XRECORD + 5 +24F +102 +{ACAD_REACTORS +330 +254 +102 +} +330 +254 +100 +AcDbXrecord +280 + 1 + 1 +AcDbDs::TreatedAsObjectDataSchema + 2 +AcDbDs::TreatedAsObjectData +280 + 1 + 91 + 0 + 0 +XRECORD + 5 +250 +102 +{ACAD_REACTORS +330 +254 +102 +} +330 +254 +100 +AcDbXrecord +280 + 1 + 1 +AcDbDs::LegacySchema + 2 +AcDbDs::Legacy +280 + 1 + 91 + 0 + 0 +XRECORD + 5 +251 +102 +{ACAD_REACTORS +330 +254 +102 +} +330 +254 +100 +AcDbXrecord +280 + 1 + 1 +AcDbDs::IndexedPropertySchema + 2 +AcDs:Indexable +280 + 1 + 91 + 0 + 0 +XRECORD + 5 +252 +102 +{ACAD_REACTORS +330 +254 +102 +} +330 +254 +100 +AcDbXrecord +280 + 1 + 1 +AcDbDs::HandleAttributeSchema + 2 +AcDbDs::HandleAttribute +280 + 7 + 91 + 1 +284 + 1 + 0 +XRECORD + 5 +259 +102 +{ACAD_REACTORS +330 +258 +102 +} +330 +258 +100 +AcDbXrecord +280 + 1 +102 +DISPLAYNAME + 1 +Metric50 +102 +FLAGS + 90 + 0 + 0 +XRECORD + 5 +10 +102 +{ACAD_REACTORS +330 +F +102 +} +330 +F +100 +AcDbXrecord +280 + 1 + 70 + 1 + 90 +650459304 + 71 + 1 + 1 +2EC8FE6F-6B6F-433D-967F-CAB6EDF37F34 +311 +504B0304140006080800FA902C5CC7F4310E2B010000A80100004F00000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F4173736574446174612F446566696E6974696F6E4974657261746F7250726F706572746965732E62696E3590B14EC33010860D03880109241EA00303 +311 +8B89EBB88E8D8450DCC44C48A83C00B8C1B4116E52D50988898C881780B102C1CC23F4CDC0968BA5FFBED3F97CF7CB2F0080DFF57129D870EA5CDC753CD7955E94C55531D53305B67CC5D463650E5D96C4698E19C1900C1206492E18E4A9C410F773C15996522AC9A6EBDB76CAF49D6A4DE3475E94B6D0C6A84AD7ADDD7785 +311 +F58EDE4C356E9732C7FED10E001E9D13F8BFB07ED22438F2261F9DD4EDFCE44C59AB9BD308312E6289091CE2410209A704F23E1130C1026184384B258B46DAD6EDA2D036C2F990C99C4A48850B248E33C86922E1301534CF649CC89844CDB4F55F73E06D8C2B559A08456B0BD7F36A72E44CEE7D8C9E3D979F81BDB7406403 +311 +574DE0E543E0F235F0E73DB0AB02D157E0EA3BF0E63E70FE14F807504B0304140006080800FA902C5C3BFE46D91B010000300200004500000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F4173736574446174612F496E7374616E636550726F706572746965732E62696E75 +311 +51BD4EC33010BE02120B3F7D880E305822B1EB90C9A91D9B07E8CA122591CA40870A8935231BCFC38678061E8047C882D4216AB86B1262847A927DDFDDF77DBE387E0180B60F8430C155E17E8EF9AE5C979B877C99AFCAC76C868DD09A5B67A56352E326384F592C23C7CC424B9B3A1E392E4E4723597820521BCE63361782 +311 +3321C38069A7531644FCC64863E2858D51B69F0BD7F7AF1FDF579F0AF311F62A5C43BDCF5863D48AC8CE01304D604A6517B364400772AD7AE2171C10E218C039C74857A364707DF5C79C8D9487E87F8ECCE0F1043D2CDE92FF4DBFD37D0375E848E1531EAED50956F47217B896CFD953BE627A93AD8BB220A655D000ECA099 +311 +C096EEF32776E483A66D2F4141854AAAB7380D1FD253BFD38591FE01504B0304140006080800FA902C5CB5A795FFE3790000DE7900006B00000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75726365732F32454338464536462D364236462D343333442D393637 +311 +462D4341423645444633374633342F7468756D626E61696C2F302F67656E657269635F706E6701DE79218689504E470D0A1A0A0000000D49484452000001000000010008030000006BAC58540000000467414D410000B18F0BFC6105000000017352474200AECE1CE900000192504C5445818181B3B3B35A5A5A4848486060 +311 +605C5C5C6464648383835E5E5E6262624E4E4EAFAFAF4A4A4AB5B5B54C4C4CB1B1B1858585B7B7B7585858ADADAD7C7C7C464646787878ABABAB747474A7A7A7686868707070B9B9B96E6E6E6A6A6A8B8B8B666666545454565656A5A5A5505050A1A1A1BBBBBB8F8F8F9F9F9F4242425252527676764040403E3E3E9B9B9B +311 +7A7A7A8989897E7E7E9393939797974444448787873C3C3C727272BDBDBD3A3A3A6C6C6CA9A9A9A3A3A32020209D9D9DBFBFBF8D8D8D9595959191912626269999992222222424241E1E1EC1C1C1282828C3C3C32C2C2C2A2A2A2E2E2E303030C5C5C53232321C1C1C363636383838343434C7C7C71A1A1A0E0E0E12121248 +311 +4A484C4E4C1616160A0A0A4A4C4A787A781414147C7E7C9193915E605E464846838583878987B1B3B18587856668665A5C5A626462818381A7A7A5A3A3A1B1B1AFADAFAD7072705C5E5C9D9D9BABADAB7E817EB7B9B7585A58BBBDBB4C4C4A8D8F8D747674B5B5B3B7B7B59FA19F606260ABABA9A5A5A39B9B99A9A9A78F8F +311 +8D6C6C6AC7C7C5451AD12700002000494441547801DCBD89771BD7B5A70B8EE04C702641712605CE034890E220088028C93245451215B713AF388E7DFD9EEDB8DDCE6ABFF4B57D97137BE50FEFEFDBA74049B6AEED74869B7E87404D2814EBB7F76F0F67A8835CEEBFA0E42B854AA5B2BB5B6BCC951A8D52A93657A914FE0B +311 +EEE39FFE2FF395B9B9C6CAD2D4C4606F4B7FFF8D1B37EEDCB97587F7CD9B4343BD134BABE7DB48E3FFA7A228ECD6F6574E4786C0FC8B5FFCE2CD5FFCE297BF7CF3CD5FFC92B52FFE58BFF9E69B776E0EF5F79E55CBBBF9FC3F5D3DFFB07F5898ABAF7CDA3B74E74EC0CE20230561BF096E97E05712BFFCC59BC80539DCE83D +311 +DD6E54FE61B7747DE17FB8980BBBFB2BBD4337DF487881AAE6C5ACC6AF25207877B2B527BFF1CB3B77FA47561ABBD7F7FA7FE146A5B6BD74E3164C7F51449AE95DB412200EC539418717E7F2F11B376FF62E95FEAF1442BED0581DBCA1BD2780D23F506AFA16E1A7AD974EF17876F00DD7BCB187A1A97AE51FCED5BF2BC1F2 +311 +BBE5B3C19BE27B43CF26DE00933658FE129B109C2FFF922CC22C4260FA01BEFB462A77DEBC35F42F600C3F5B0795D2E9E02DAD5E650B4438A92801B65C35CBAB7B1EE5041CE69D3B6F1822DFB873EBD6AD3B6FBC71EBC6C86AE967DFC2DFA4CEBFF1BF54F6276EBC114E2F43FEC60B01A0D440A868B2920E5C4BC10D60931A +311 +DCB871F3268B21D3851B08E1D6AD9BFD4BF57F7577909FAB86F29B982571136AF01DF5FE32AC3BD9406CAAF2440A54CF176EDD01FBADA1FEFEFE21FE4C9858DFF4183458A9FD2B6708A5A5A137E0EE1D11A9EC0C7C58B2C73C0AD6B479BD76B7790CF899E287FA5B06FB7B07C9195B7851FA8794031EF1FC5F9406BBFB2337 +311 +5420286399B631E93B08022A785C4DBF9996EC3551874094D71B6F487E80F6837E50F483BDBDBD83232323AC420A18C68DA196EDDADF68A77F938F78FD972BABBDB7B87FB164AC6FC2CB760365821ACB74AED44FFAD7E7431ECD7E08AC421F391D199998989A383D9D98E8E56F84A318C58D9BFD2DAB73FF5222C8EFAEF4DE +311 +7AF30D756E5108683DA471E70D0502099A7240F19E4089D3FD203E620F1B47BF43501E85031AE44B4B9F2E4D2D9D4D51D8970983FA861B3706FF950CA170DE82F6B312CC4F42C8966295F7D725ED29882415DC055F36DEA1FE96FEC141493F05FAA9A9A5A595B333DED5B3D5A533F62183323032F46EFF13EA0AAFA5FBF7C8 +311 +976F8C10F7280A014832593B90004D52341980D907EAEB73411EB2F1EBC9F507F92746C40E7AE0AFAE54292BAB2BAB67CAE0746264A277B06508168C94BF772BE9765F7BF0B548FE1E07F3B5A521340A5CB5297C4B12811B89E82191ECF3E41B3259C529F135E23CF4C7F961FB13537F5A02ECCAEA76B5BA5D3D3FDF3F2FEF +311 +EFB3AA22053E5008833428DC6C59FA2F770595F311F235D427F379BB8A121BD901B96076A388DC4C3C61C7933CCCD770FF375A6E0CE9F535FE2534BF5ADD3E3FAFD71BF57AA951B6D4CFEBFB8864758A26154430080B06ABFF557610ECC93726224F155D1471041E0D42F82F4891C926C1355B0831649FF365F46FF05300A7 +311 +A790BD8ADEEB0D4AA9569A9BDBADCCD56AA55AE377F5F3F3EA2A34983A1DE91D810543138D7F28E57FF4E2B5335A3928B76EA1CB9B00BF158C8F63A2E788826896D0B5E7C461949ECE089144F8EBEFC7FB4D8C9C4E9DAD60F7FBE572B416C2F2423ECF8B86C439E450DA970634ACFDA977629098D0B2FAF313A36B3869E37A +311 +F7853378CDA1171FBEBA95DF1E44FD5144A420588641B0055A79ED91CC0DC41E27064512FB33F1F04D09D0D2DF0203A646A6CECE80DF28356A348CED8C4F1EF137B9319E1BCD29867CA556AA97F7B757567006A447FD375A26CAAFDED9CFDCFB2BB0BEEE8AA5911BC2C7F85DF88A3775389990AA72219D582409210F85A4E6 +311 +6F2987D875C30848023088FDF77E87F96FD7CBA5B9DCCEF4F4C9FC7C676777577B7B7B67E7ECCCE4E8DEE85E81A6D55AA3BC7FBEB242589CE8ED4770E785D7DDE23FF2587EBF57F50B9E820527316488E5C32D50F979BCA58207297E2B6D658702FFCD211840FE43FC9F3A5BAD9E97E6F21B9FCF16BBBB3A3A5A175B5B1787 +311 +875B5B3B86DFEFFC687A72674F19D46A8DFDF3EACA59E405375ACE76FFA922C817CE86A89BDD92F400F2C55B7462F610459837D3A61ACF50C7471C8F2F2A9D38C3DA2F068007F80EFCDBFBE5DCC674B1D83EBCBEB8BCBCBC3ED0D3D333D0B3DE33BCBEB0D8DA35FBF9F8CECE68AE020BCE61C112A4C1138CD47F9AD13F7DC6 +311 +AB9CF9CFCFAF9D0E01FFE6CD503F5B91C5218E2899CA15098714848B04FCE5654884ABF0E554F11F6C21D73D5D5AADD64B7B9327DDAD8B0B7D7D6D6D07070763BC0F3E38E8EB4310EBEB8BC3DDB347E3E37B5842B97C4E44A0C630427E5CFDFB71E03F471E12CA9FF70E055AE141042DD81234B879EB4606361D9328149037 +311 +D7D76A571A7E974FA20AD0323832713AB5BA7ABE3B3E3D3FBC30307070B0B9B645D93C3CDC3CDCA41CFC6AAC2D64D0D579B4B1B397A7C1BDBEBD7D36657A3CD4B2F44F4909F2B9CA597F4245C59DEC354316F0587020D0C661742BC02869435FD12CF195C422DB3C5A3E2305C000CE6B7B27ED8B7D63079B5B5B878787C787 +311 +C7C7C757C76C51B60ED60EDAFA06D67B965B3B672677080BB5329E60E9B477847AE2E9EB53E35779FD37EFCD2D0DDD68AA355B6B0D81860502B8B68C801F5C697E9AD62F4B406244CB975560BAC756AAA577675B07C6D03778C17E7C95CAF1B3ABABE3E3ADADE3CDB1B1B6B681014470343EBA979F8B90383545727C63E435 +311 +49D14FD0F927E5F1FDEFD7263058FE02EBCD1BDCBCA053496BD58E69BC44F9F854D4D979AE9ADB908824382AC1D4014E9756EAF9CE85B6B54DB01F02F8EA5908E0D9D5F1B3E72188C3C3AB67879B07C8A0A767B8B831FE5E7EB754DEAE5261460243FFF07858D8EF0D658BDC563A2C5EF5833C13C90B69248C4DD97842B61D +311 +FA7F210A2F6108A0F96B62E2D3B3F3DD939EA47E30ABF5AB2B903F4BE5F9B36757CF65021E616DAC6F60A1FB647274B4B05B2E5341B082D43278F67D8DFDA48AFF9A13F22B34C7586C9992BA6E66CABC190E313E7C811AA57304B421A75B289B9D174CC868C24548823E230B9A5A2DCD2CAFE1F98E61C015CA7E96B083FC59 +311 +F3ED06EE60F360B3AD6F79787ED278D0A86FAFE00BA9220EAEFE1D5DE1F7855939C3FCC1332426B377F692406E022C010DB437EF009803F0DCFD3B7C94440571D8F2C328F115F47FD324802070BAB43FBA80EFDB92FCA1F7E7CF9FA875CBB327CF9EB08C4DE4815BC4210E2CB7CF1CEDECEDCED5B757490968286899FAF955 +311 +83BF46F9393CEE6A86D6F618CAAD9BFF0BE22B042412C5CFB50556815CC5BBE33E9F61ECEC26A9BCB8145FD10590078F9C9E953B513FAE1FE387FAC246E14F9E3CE7F5F8194BD6594140876B6B84C5D6799C61A16434201E5237582AFD75C07EEED9863F463284E2E13425A036BD41061259289B6BDC1ED656FC8B8592C9D0 +311 +0701E27CEA749F0D8EF44EAD8C1F80FFF8F8F9D513191F6803384C800097F24069C407CFAE88136B7DCB3D5D4A60B711F19070D83235F77331FD35E715966889038E2E0B346EAB7936C4162043E1A1F144093695443A570144898BC4079CEF1912809A3035A1D3F361235F90FFF1E3E0FB93C7E2750719F88E7D8E68123883 +311 +ADB5B18185AE99F1D11C1238A792DC4BEDE8EC6FF503DF377E0445F68FAF4E08D43082D02170F30131A154206CC559A8D9CFDD762B31273E4947A581E0D9BB71E33FFA07CD02CE2A6BE1EC80167497F2A81CFA3F7EFE58D0CF5D5D170DE4F89070B0BC4040CC17BEAC6B0586C3D3FF0309BC06F44B04A1E13729929B4DF73C +311 +44070692C810B08AC3012E8EE9EAE22067796288C193B2139B970B86F47FAD0F98382B1E035D9C32FD318A4FAFCB274F2E1FA772F94411B0CD42493C23393A685B5FEF3E1ACF554AF5F3552A478383374E6B2FDDFC4F6DFE38F4F4ED7A7FE838F488EA852482F412D3CB07E293D02C9F074F12E84C5AAC423271450572A385 +311 +449844706475FD38DC3C22486A0639E5F1E38B0CFE93CB4B25910EF309A2224BD8DAD40C682C28341AD69047E8539A6AFC14EC573F7FAD10AE0FE6EB13E87B28E093B513B5803514DE408809BC12A14876DE0A25F643009E9176D9F0C330164285A7444DC8CAF0E9FE41429EE0A2F6A6DE91C0856C501272404A8468822E24 +311 +C807030B1D33D40D4AFBDBABB411D093D88C86D7205E05FC57EDD1F805FA4CED5920F0CED39157E007CE21757C5DE440ECBCB46CD283E378029B43FB077B4F47E60E9F61E8D01BE017D7E843EB49F50A2028F1E442FCC90C9EE308E4C0C2C94EAE30B75FAD3A0EAFA57FE9EF960F14BE15638840EAF3BA490BB6850EDB38EE +311 +CAFD21A0C746D0C4234DBD035EFC7EDD121FA585FAB73DB89FE6A03CF833AB0730E5E2F1A36CE3F202A128934B44E396961121E1F2C9F32BFCC0C140CFE22C1CA8E109B182919696BFB98120234F61B59F7BF46EC30CF067B21A33B0FB3E402448EE266CCD93135A8E823DB31F85E677434E608F53F8100BC0098EA2FD6BC0 +311 +1770E0F2F2D1E5452A711C4BB8486248FAD756D852026B6DC90A2AA5C6B69E9068B8F27AFABFFEE8AB36F1D23985D5960014FD711940800B560250D2272CC54FF1D3A660B275AC3881E349689C1616E1E9044129D032313509DE4700BC867C71F128C400159407C761022BA8A040F40A244788808C60B3AD67A17576279F6F +311 +946923191921B0545FC2F12AC0EFEFBD7262B6935679FC7F80629160ABFAEC88E8430E76D82A8DE62ACE50BD4A42FBF03B387B37FD321B37E31C3F063D99703F5160E6C9E5A300CF32A91E0A085A29C0FC507F6C21012303C6104B82C1F1E156DB3229D1A855A32A8352C9077AF733A0AFE0FB3EF81FDF2F0F82C21B0EB069 +311 +98866878B103305E31EC17F4FD43831E570A2118D1667632D4FFFFB125782F96168A833DBE78C3F11F8383A79D49F58F1E3DBC780417AE6581381E8610604888E2913E12492881274822C221AD04CB0B1D273B8542837460898C686864FF6F801E8269F40AD0481DFAF5E6E9C1F3BE391C325004DF0746A4E4448F7B52C0D5 +311 +EAD39EC46896B888C4210D68E99DFA2820DF7FF850EC407EB55C3EBC5028611409BFCB8889C90F1C52355AEF98B18100094C9D0EF6F64FD47E5CBF3FF5293DDFB4B50DDD54F351446FA1F14580DC3902C085F593CB24ACC917B213BBC11B3F0A61042FD8B24F4FB9C4556D0CB9E1A880DE89934CE9607F18F81FDD950DD0E1 +311 +D143F41D56110E227C250621FF098838042BC85B5B6BCBCBC31DD37B34966E9FFD9936A2FEFEA9EBA4182E5CD3E17AE35501FCE0707E5525A7DBC64DFD077825BE37CE0BBE1BBEC061410C660B6E49912665E2B3749C7C9F93834022F74CDE6CA5EB501D9CBC04B768292C5CCB84478F3CA83074092C6082169015E5800D58 +311 +39DC6C1B58EFE83ECA513BDE3EFB8EF1242D2D4B3FD55AFE03D42F8492AF8A3F21444FA2FA9ABBF525EAF84C09F0168527B0138A85D1EC0443C467B28BF844EAF76323BE13D7C11F72FED783837B970FEFDE7D7817E077C17EF7E2A1C2C0FE851FE4C008388C15E818958746129E1009D054B67530D6B3D8DA3D59D82D9D57 +311 +CF70039FF50FFE0DE94089DB269C3655A4F25B38C49D0BD48E59F1526887C18FC5272197F85CA72862A593A4843CD25F920487DDF7AA0441A2C0600D062001F103FCEEA3D8560CEC3EBACB01CAE5A51E420349F602191E5F901893142381351CE17047E764BE50DEAF9E4D8C38B6ECFFACEB141E54A6865A88A60133EE9CBB +311 +4C256930B0B168C1C3AB59FE1743FB422C7166082E934AFA5EFA3E4BCE0B69362FA7041818B7FDECE1DDFB4D022007CA23E521F0700AAEB5888BBBF08023E128B4045381542FA256B0D04E28A0C3804E233A1BFB476A2F48FD135BAF9843BEDA3264EB42BA499601F16B566E72C7EA35908ABCB9176BBED43204C696AFD3D7 +311 +B24B08D3AFA44BE243D88A6D9D0B6562B52F741E1610C0EFBBAF2B0829289A640EC4C8A4FF66A24430786CEBE1E1E61AF9507BFB496EAEB64F8F49B4129EBDEC065EC1F8A3F228A3CD0950883B41BEC6D1944AE06147289600A7726313AC69A3F91197F1438BCB743E76F01F6EF1D1C854071670FFFE43FF1EDED702EE5A14 +311 +C85D0C42DF90B86068800659AC88981855E3E774A71C0CAC2F76754EE7CC87C808D1E1E0F6CF47FD4224731337BE1E39C5010823EE997B1491BBD99FC8D8EF77482BEB5EB2CF66499A8E0F7511B19B3EFBDACB6507BC78731B1B383D02FFDD7BE8DD9256F7D0BA7B46015941097B80018F700FFA024CC08078F51806100ADB +311 +FA163ABA8A3B95B9D2F92AC30BC908ED31FABE0CBEBFFF0279B675868F9AA24E9530B08C174055B7F48E4F58002F3E82F0BDFA003E8B431EB6C4A91E4D9B5FFB791265BA8827BBE5F1BCFA7F789F72F75EC800F8AE43FFAEC42F13009FB905A9A0132015D0068ED7682AC608BA6771038DEDB3B33082891FAB1ABF5614F932 +311 +38079726B833958796B845B731FCB86316713C1DC581B1E19B424EE32674093F80776F7E27C6FBFAC85C536CD955B96EDA2A3FBF770FF4BE11845470EB3E42D022000E0FE07D161811020742162444668308801E133A4C163BE68F6826A5523071CA78B2FED51F28F8C70FE4190073A3E5D3259D7A288CD19BDE623F10021B +311 +AB0C6E327FD507B2741627727EA00D31856492F9F009D7F152D930704E642795C1C1B336E0DEBB7F0FDCB79318543B25341F36802D64A981A690B94259607DE0B19D466BF8C1C5E1CEF9A3FC5C639FD6117B4BAEAB453F8EFBDA500A67E8BAF76C8A06566E36EE1184E8329419161F83D843D5DE7D8221163E145F56921C3E +311 +E383978072129E290A9B7166E63D26BAB1FCDBF710009E4051842390031845F20077CD079407C575F20364C4910ED2A574BC357630B0BCD8DE39335EB175646A698458F6A346F003A93002E846FFE0C459B8006E506D79BF902908A0AA05CB5E73530E33BA1D3C2EF99C712B7C8B41DF4D2A7830BE8707485FCFAEEB85A09A +311 +B6D39BBF7B4F23E00509C20DB04E240822A4B810E04D8D53D10D504C059ED86BB8697F514777717A8F8144D48A4C89077F7EDB00E2D89DC02A7B975640A282C49A4AA84B70B12BFED8EA6584860DFB7EE23FCB00C6BAF7332FF259FA3C9346508813E372F1DDE425065BB61FDF8300F7EEDDBE8D0C6EDF46F7D8823478590A +311 +E23759D60DA6B7A9F125EDE8F4A5D2B37470D0B63C30DCDE3D3D59A8D1501EB1B0A5377517BDD6E301F995E3F955F0F58FAC2E81CE172A8344AC03DC6781939D2484B8FFC15E8F3ACCD3954CE19576B942D0A029188EC7013FE59AE90B71292DE774F1F63D60230180B30A2EDC65291B6211B4081128856001A680015CE000 +311 +708254891851D4B3BED0FA4D7166B466BFF1D2A924885AD12B387FC0FCE6819AC3AE06A7AA4B715F0927B74D119D4A668FB54B8A8C268D8B038A207D10A7B1E95E42195B695BE0240F7408B311257C23F581E987C180140C584A02B1670CB817CEC0A080F259F1360E58452013200E3EC107AC1DF4FD7B0F6D23F33347F952 +311 +7D9F51E6138E31AF35F1BDAAEEEBA3D71BB402E2FB47CECEE96B4DB85536772B07C82A34F3E66D0BCEC207FEB9E70643761276F7B50D5EE963CFF80C7AF4A2130F5BF8C4EBFB5F07B709840480DBD8007FB7EF3F90104908BA457D43AA2A6A02C91422285E5AAC143F3313A0CB74D9D164933B86C25587134E8D342B453FC9 +311 +82860D09FD13ABE72055ED020E85D3E312F74C25CB0293D978A1C4001927C80B86FD06349126EC219F0C735C8053D8F5F310817EA01F1B7851F406144C211C6362C27DD51F1E310C0102280ADB891E9B085CC528A2B1369A46BA195B9A2B351862CE43174BA73FB7CBB430A5798F4C54B7333B96C3224A9863AD02B9FBD8E6 +311 +3092191924E77C199D92887DA594B6DCF0112857162FD0949FE6A441F5E62E42FB2105BC405A2301A3424601DC807912CB2C39C604A27908021CDA30C4C8C2019A883B3A8BD393BB3546136EAF561980FB63E9E035FF73B96D09A905ACB2C11D79571C5159026227DDBDB81396EB03F14100BEB66DE1FA9EF82C3ECCBE3181 +311 +19C4269FD014E66361FC8BB0B4EA9A98EF3D8848A01360430284335004C183CC25BCA82D2302EB03B8419241C64DF4F5ADAF77B533BE786334BFCBB8DA72BDBEFFC36103AFB30608A0B39B58D93F0BF42180841DD26BDC22CF0A770E90240006BAC65197D90920131C7B2EB3CFD3C71C6378A305EE8488FC1FF8D391E2BDDB +311 +0F6E3F45E7C8207C419800DB410073A3173942CA8D5242642A74496FF115832A6314D9FA4257577BF7FCF8F8E8CEE8DEDE5EBE76DD3CF892BA7FB8B90F629431B5525E92A15A3A4A6FEA3FDD73136172060959206591F4C927196CF645AA285CF3014630121754261C0D31E1A7E3DA2DBDB54B04703BDE3A4209F02045C4BB +311 +0F529A14BED07098A2A1CD47513DA64B512F409BC01663090796D787173B5AA141B1B39BB470EEBCF1E30F9D263ACC4D05110797CEF7B923B027F089F74D1D06F0A4D8C0CDA6604023FCA45B76C5CDE0BF3845ECBE13E0C0ED73700A8A753C1AC8AEFFF1B407FC8A20F42F0D94019121DE304077A027D4112283BB8FF00724 +311 +44D68AAD111D6F591BC0061854BBC048EBBE9E81F6A33A95C21BFD13AF3C7E7DCDFFEB0DE8903F77B41DF178E99C289895B0EA8CD640549D68935BA7C5294E0A1D66DA0CC419BD398E6265789CA1241441AC94532A3C19C95340BEFC68703077EFC1D307B71F3C500859C11494838E902203A2BE90EACC5135B80B07880434 +311 +0C920C2300BCC06F7A1C71B875DC572C9BD1D84BD5FB9363CA6BA7D03E5C40FDFC54FC23C9B4B9DDD028787D89219038523BF64E638BB37CC25335937A00DFD32869C5B390C8C32FF25C8C47A7181B4A599A224A9DADB0E0406FEFF9F183B7448F081E3C55024FB33828784AB61704482CD0160C04174F9E33BA9291D58C2F +311 +1F1B1B3B5863B0D9F3E51C35C253D54A23E560E2C0CB3A6F7A81382601C2079CAE96B7B1560D20A341E85A928A4E01083256420576C2ED477E2E565FD9223BCC691CF394D3D8E281501E0EE5C1C8159E92585D255CF30CC854C75318006EA4A01028EC853F9407C6053910BE105348324002260254886C156260F9189EE0F8 +311 +C9A3CBAE9D5A992184568A69D5183A7DB97DB089FDC57AEE54F858FE54F577DBA85309640290F2D220952620750C5811FB772A7876D1E4040FBFC6474D51246D8B3FB378283FB514F8AB3C20B8BF7DBE5DE541C9A5D3D38DDB30E00151E02523081BC89C2214103E0BC1B3D0199A08E002681A2613A2616CEDF0F0F9C5DDC7 +311 +5DA395C25C0309C03DEC8091A4AFD3FEB504AAC6633930556DAC86EE3561941E862C4A75DD6B6BB3A0C59BE153DFA73EDFCBC3CE2188D3D378FC976D0EF9A95B7C8532F527CE3CF539581E0FE501291E9139FFB65EFF5DBD8E0C18DE3077170A64E033FD278F18068028802F156C3809FDEB11B1019C208D020C9BA2870457 +311 +F0F8E1FDC7EDD393E3B9FC9C4308E9315704233F960E554802C14716B0B45DAB5EAB5E25AB7830EBB8D25E6CA94E4AA01794FB1EE164FE9F040FE82C940A4BCEF913075D087E85A7237D3CF29C47E4E676777779528C4781761F0BFBC1D3A77880E40C9A2E5109180D5255317890394229F0F082010354082D574F1E3FBAB7 +311 +D6553C2113DACB97BEB5526C7C6F69F9310A94C46CD89FF8F379AD1AA035FD00FF3F320180F01417A6F255A3A8D86319FE0C0B0E06A0DCD33F79841339C01E5BBE1911AFCFF7C1E0A540BFBDBFCF2372352686D863F83F59CB6865F43104007EE06F52406F680341102048A01BB048823082CBCB0B6AC48C313F3E7CFEF8F2 +311 +D1FDC3D6F6F9F9D9E98D9D7CAE5EADE2A6512FAD7AB526E17F600C85550DDE9ACFE9D97E694513103BC69F8A2813176032C890C1E9C49FC09C61670FF8705B1D7386260E7C8E7122C7F8208A55139E8C8D4763F7EBF5728DF9C34677364E3A3F9AEFDEC9CD95470788834F9FBEC512379890B38C94205B2557987C4186DF5C +311 +0837608DF0F9F3CB87B7EF6E920475752A01460E556919B2B64296FB9FB70DD5F47232A0F77465BF140CD001F00ADCA175090E2665A14E6329B62660E02A1CB50C6025E3DA252A670B3F0FFAA5EAD94A509FE7036B159E0D1D9F2E76B7AE1FD5A606198D3A747AF450023CBDFD162278B9446688111009B4029B0F2180AE20 +311 +A542D40610C073B47FEFE1416B2B12200F3C991C2F54EC2491027A816B0A34A9D05C6F437AC23462385DADD75642EDDA738AF1600DBE07EE8437804D2D011A94DF71C2085EDD40266A407FFA1D1C00B0C03927E60338E3B9D8C47D1F8CAED578E06F7CFAA4BB63B175FA7C301B747CB377F45192003CB8FD34B12009224543 +311 +D8604494011A80C1903CE0518C986208E1C5FDDB8FDA161686873BBABABAE74FA637BEA894A44078C19696F326E057D7F95D061A6B0394A9D5F2DCAAFE4C2388D8A6E9AB7695CB0BDD0A332430F1A9333DA41D1FFB97FA09AE84E738C75C407C260408F8DBD5EDED7DE1570A7BE333C54F16963B46AB0C2B71208EA3D16EF4 +311 +EEDCD7005241166C005A73C03164792151205C007288AE337B4D7103741BDE7B7AC913350B348B2D767515674EC6F72A0402BBCB41C81305AFCF05F2758D3ECAC8D26AB97606DB9581A4B7A8FFB068CD5C0604E6849046B70C2B60FF0CDDF93C13822B4E82FA0479A68220E66D9FD775FB3C1A9CDBDB9829B6AF2F77EC9E06 +311 +78FB20ED8D1B1A1A39D10F9812E20D6281F5673121AACAA9C53424000DAC173F7E18C3052EEE3E78E7F1160F5AAEAFB70E0F7775CFCE4EF384DDEEBEB9C0889D5243BDF557559FEDE5F17AB21E118C4C31A3DF6A96B56AC62180293910ECD6B721047664BCFCC6B2DD3C65CA0F0C823DFEF84083C7ECCDF05898EEF158F4FE +311 +F97EB9C123F1B9D1D1A3D9F9AEC5F5CEDA84A3C96C14A55584D62893D6A54D8D2028D05C8B1F124884543F3223B29D208B04910D3FC43F5C52196AEB5B5F5E58E8E82610F08C21BD443801233C0CE8BD1E40F84A1CA86001990048031ABBAB11EF83F9283EA89F181F2A0D9A9F62D94B7F625FD727E6A93F63F200F614F7CF +311 +100D4511C07DB45FC5F0CB4CA359ABE4774631FDAE85E599EA0878A3C33D5AD6430CF4C055EE5FDB80629000D7855DED3F436F3B61B3DC7FFACEFD2B1BC6FB0696312CFA477CE87A87070C7998E04FBA78AE3F915A065E819FCF35B410321D9ABB308146A11AD5196CDDD7C477A171C8AFC74B45CBC6F641AB53C8D4ADA587 +311 +0C02379BC0470CF83DB55F073E29CF5CE5F7A3F8FD62EB7AEB1774C2C6780B9523F9287193FD23DDB79FBEA513B45200E2E0C1B51350163AC19043C600F2C1DBF7DEBA7BB9B5457BC0D840CF325EB0BBABBB786D301437000020004944415472B491ABCCEDAFC0591201CAC8EBFACBF367FE7B6E40E69F551BBBE7123E3C00 +311 +AC560CE20C62436E8C3C54CC225EE08C0D74CE26148877689EDD004FB2BFBFFFBB984035373A7954EC5EE8591FE531348654514DB1D1C56411DFA2A7C212BE5ED91278F2851A432244C6822C29C85A8B320ADCBDFDD63BF71FD32648E7D098CD018BC35D7FE89E250EF2AC75F96C15271602687965C844B8807C6E7729D93F +311 +22E81D39ABD62A0820C1FE9F11CFA7208125D33E96FD69E83AF6052DD32D49FF0802CD9F9DFD39260389A950887A647CCC99BAB17132DFB5DED35138FB3A060F6295AA5E195BF0BB56495A5A4A8FA440026E46A047D40ED2520A441C302D240F201FB8F7E0EDDB0E12A04D8816215A0579E8FE1B1281E9F19C9900DE79842E +311 +2A7CCD48E9876EB01C75DBA0E0C8D44AB5512947A00BE7CF5DE9E1A6A6BE43CF1A78783DFD5A404E4477336C1ED8B18908B2A847B2AFE9839E891137A6673BBB96FBBA2A4B8E9373B001F08369BA11BE8ABC4302FD2345FD6014A127068427D007BE28B41D9B0D40FFB7EE531FA673C8870A69135B1CEEE8D009C08042A5B4 +311 +EDA314920B635BF941E7487E45256439DFE9D276295F87E698389CD49FB394FE19720412DEDDC40E9CE9C6DD605E0B719FADC416CB15AB3A61F9B5B9B9426E54F81D8B03DD950946D432B40CEDAB7BB5AF11213CBA73C9BCCCDAFBCF06127C7980FE6D1DC9B4DF14832D6568FEAEEBA76FBF438300B541064ED33F3AC0B0D1 +311 +0505306FD370AED02859234402F6C3FED006766DDED2034D90D119057225EEE3DAF787EBF30EC51ACB4F551678BD6728E1944730C095F13E4D81A4DFFBF67C5BEE37E62A85FCCEC6CC6C7BC77A5B477E22223ECA4FCC0F87E2A5E3EB782BDB25B8CFC6736A044DE5A7CDA604526361D650484FE283B77EFBD65D52C1C73C4F +311 +48E7D0D81ACF572F2E2280F98FB230508FA906B42DE240ED651B301CEC83DE1790C9FD96B6CBF986BECF3BD332C18EF627A0B6EECD5B152E02088D03D828AFFAD26B05BF671B4F9A09A8CE0CD2707F67F2A4B3BB75B9ADA331C1305BBAC182FB4A79820B7EEAF73199B8404C0B81231CDCBB871B80FC41FF5860E8E108222A +311 +1A076C29E6E03B6F3FBD4F1F295DC457573C7ADED636D6B7B8C88413DDF3B327E1046AA51040B40CB50C7E3F1D2E44DAD34CFA604029BFFBE714DF0C069908027EB275F1F366C132E1A7450B04011CF82B2B647CE754F650FF6E25BF37AAF65B7BDA16CAA791F1D09F6CAB989EC5AB7809BE145FA459E8D3E4B0FB47DAEF09 +311 +3B946FED585B80FE1A0305FD5330FEDB4FDF79FBF6BDE81D8300CF6815E5F9896552412A03F31FCDCC7CB5E32365550CD9365FDCCEC8752E943161D78047336F8AF6539840A1F2E764FDA2970999F205CD2BD1F5CF496571F76EAEFA0E1CF8FD2A55FD06391F9EEF8B9DC9994E72BEBEE1FC928E2F223EBA0FBFBFB4F2DF13 +311 +7BC894B8087643D64ADE6EDED67F7680FAC9060239E845FC94AE93D880F994FBF71FBCF5F66F9F32C292EA900F9C1E6F1105E81C5B5F58A067A448143842008D7275EA3BBA3D2516FDF02FF79260020D6B3C714711F3CFB61BFF56A826E627E82256F7400FB387FEF23C1C1E77FD6A21EBB1B2B35F2F95E7760BE1FA3ABB3A +311 +981423477517EEE36FF96F122B942F6FB64D9502BD1B9089162532A2FEFED255028FE653C9F46FA321E0B588B7DE79FBED07C44106CC85133CA65190543004D01D02D8181DDDA5A9C91A7110805B7875B689FC3902200FB192E7DFD936B37B57D9C338BD49E99E181F4E5FCAB2ABC1CA7AAB382CBC7D515457CFABE6FBC63D +311 +525E5CDF74B16378B9AD6774A58531912D232DF01BAA913DFB7D3AAFF912984302B84D0500077800D26C60A4742101DE420C610C2E92FA93056022EFBCFD5BB6B38651470CD33BD87630C05831BA864C85997B8754B05167F0706499DC442FCD22592AEC2ABF3FF13F950039BF159FA9B36ABDB2778EFF83F70972B83BFD3F +311 +4899E64DD8346AA495CB155A7499F2CE39B0AAE755125EB84FD8CF8D8E4F4E9FB4B72E8F1DBCCB98B31BC4607C2CFF21C8145FB48EA0F2159F86A3098415609554DEFA7B27EF1301033DD06D274BAF6821D220DEF96FA4CBB60B3CA241C021D38E1AA76B4406B4767576166766A6C7F77273F5F395291BBA19F64F2E3095C1 +311 +4F3E60371827741CB27E89543857D6D96BF9A47C6A9A26057840332EB843717AAD171880217B71FCCC0355AED3D4819911F79D0EA8AD6DA31A83E36C5DC2D470295C011302387069158F6C9966022367ECF1D00BA9BB95C389AE7B6105A1FB640689033A7FCCFFEDB762189103A61C3A4FEFE0D6A6B5A19EC5755A443AE78B +311 +C5E9235B047890A65919A0D2F96AA3C01CEE913BB3ED239C3E0CD8DDAB99E4348BF3F8B977B6C43DEBEFBD7721A839A63B94C06A10DB87FCBFA3C2932F8C26F88B6D6BB30C3C4E09AFE40FAB52EFAA1EC0316920E031A46D65A0FFE45A673432E907FBCF86717AC04F2CD0EF512D665FF53F05BFCDC43489F150890C60A8E0 +311 +314E70A06F619D30D841189CA15D3417F3CD50191AE4396543F0C42BCFD696C58DF163F5B46D708BD5FDDA5E5E5FDF9401BC4F7E00E8A17520833D1CBFF495B5D1CE037C664123EEE74737268B5D1D3DBFDA6AAD8C08DF2C0BC7A737E10AAB2A7B958990CEBF556CDBEE823CB09FB344143463C630CFFF585D330CF0320E92 +311 +1744A7918280FEEF981161008E9FBC78C830217A07B7D6985E83F9A79884ABB5AB383B4D7D788F9FB3D867A2112A43F19042B33A108690CF6F472F8661CFAC971478757F6E6F2F7AEB82FEA85E5715941778B278281F28C268AB24BDB470EF3303E09C359E9DF1CF990D8A096106E6A66C8620DDE7D281DF0B2831F20439A3 +311 +0D68386CE13E002F7EDA8D7806162B205D6A19AA1FABFD6B1B400EC2BFFDD66FDF7E8755B4883C043F43046C1326136680404F1F934EBDDFDD39CB58A98DF1BD7880E0532E671FA1435E9D6EA5E9071000BE8F262E7C4044FD95D5FD526EB40A05A634775F32205C3D779FDC168CD5E56BF982508BF572BDA4F6F57D3304BE +311 +9EB18149461B12F760D7485891CA47CFC44909136FBF4931716A2E100123FC6CCAA6A644F25EDF4AC980B14039009BECE8B798BF69A05DC5B6885CD23F8E13A46FF0C0A986D617F001C52241801E87C2974C31411DA3A5D7B6175472763D637D3E57C33B908F867F4A59CFCA7923375E5F027A983E18BD7BD4E6FDDBB2250C +311 +1529F4202EFAAF979DFFB1F2612E87EBEFEC58581EDB9AA95AD1D7C1905F7305BF8182D5BBB524D47C4E3B81CD843220DE1E6536497C0962C225F75A2D6A998303B23FC501F0B3F736EE1FF01200FC8C99F5515207C9C40081DF304C0A17D06E26CCBC5B3C47459308178301FA8057C2C0AE9D99B05F038828B08400F2E325 +311 +1254DD7EB8BC4853B101F99AB48E387457C96951E5DB670648BAB70A7B04FE93EEC5F5B183F9739C98952C6845C380D401B8FC86E70A20744EC720E09D35955D96A9041720196D183AC2CFE6AEA816652D0234883D788BEC8F5DF2615261DB031C2381092401B48D8D2D870FECEA9C3D99DDB036C8A051058030E321909767 +311 +18C89F031DFBFF2EEA3D88606A8A19BD0AE305BDFD12BA4FF46F1A0002B07137989C748936E9DB2C91F43B07E4E4D16C3779CF5A4FFE8CC981F07C29E34B7C012AF0054FAEA4A6A3D49D3A16D2B3CF220A029003366663053C89B3FB1827080DEC2780076FBFFD8E39810CB0593CC68B5D9009F2D400418028B0BC6CC74067 +311 +E7C9CC0C2690FBB084AA5254A12AF63543B35EB40D17B693F7E3464D5094C00AA9E04E0E0524F5C35C5EC6BA94B21AAF2440725E2A9FF94FE7A8F0E769EB83FDEB039B631B18BF396F5C13CF89ACC02C387DA56DC3B1CD84B96CFAAA37B55FE723B611062258257D331F186AC93D8AD600B4FEF4AD777E4BF68F2168FF08C0 +311 +81A37AC13446C859964803961928476D78F68419390D830C1935B5C2A0A22A3AB17D3D6428BF12DC373B8D464E04C0A496BB3B3B75639DCC2500E0F0B15FB6F47B5A7ED0183A87CAE8D535F2EDBD4B3B7FC762DFE65A07C30B2851DB890082ADC07131EEEFA3DB7DD5CD32C0860CA83CD4B7993A175F422A8149B1C1D94C11 +311 +45059D9C78A8A572A90B7C8B1E3392FF77A80C50220880FF3669004E90F101740D2B808181455A044904674E7482CC3EC85C4BCE339404C0B0BF6A5611E4F9B8157BAB6DE327EC9BFBA1B4557ECB609C1F45326499EFB90EE78F18227F09E563C9E63D847EDB3B68EB9C39E95AC4F7ADCF7D87F6752BB6912040281E4A0D8A +311 +8314E80D60470999B8A51FB1488A66A9F3F81FFA61C83F4FA6969E472288FADFD61B005E0EA4284822E018911828E868614DA0C36E11F3A051070BF2F0840E35F200E2C0C80A776CC9E7E6841C0503D0EDF15ED9AFE527E798D23BEE5F0604E58DFB7099D739BF0BA5D332EF29F1535995BDBD0DE681C4F71DFE6A7AC5A135 +311 +54AE6910963E9ABC9A0DB5B202225545F5CFACC942B5B93C207352B6E5310BF349AF200175D7DFDF78F6D683B7C87E087FA9B35812C4F8F13452CED610A2207541E6D659A739441F3833CD0C9C3C3DC2B0712F62333C4FA9327C9CA1124904B4FDE0FE21C119776CB0C212AAFBA5CAF80EB43772ADFE77CD9FA8A4144C54C2 +311 +FB2304C65F62FC3678E4F6C68F30FEE1BE8383CE7DB86F58B1AE0C51F0F055E188D02F00911DDB0991832228B3172B3E623E513FF1734FF414A611A603163F401BEA790FC9FF7FC3FD3DB02DC00184145B850D01D120424DC03C00FCEB7880EEEE939399F1F18DBD4AA54C939899304D913CC2D5CFBC55E50C7FBE4C0E14AE +311 +EF53D6843DFF56BE2D554637EA047D3C210E2C61077875FB5B40E19F43AB7470CAFE1C0D3ED3B3B4778D1DF6D4F837C08747180FE8394F2CA1E0A46B6DA62CE2B2DABEDE0B1924098580FC16B369730E9E90541D3730D47FDE16EE1FFAD3419CDA05ED1F2715C607F2E81893AFC5936303F40EB776F1D808BDE393A3FA401E +311 +1C706E154C892860AD74A2949C409E28A8FB3349C764D13E4D1D3468952B7B1B35001BF41142CAD58D6011C8B78961EACAB66E9AFBC627673B61FFDA4167950A274145BF11EA17BA9AA60815C2C43AE1F648E3772E53C94E6364AF826019E723069A8AA353A3BF7FB5359281700061FF64C28C10B9AF0B70B0B0D30A31CD1C +311 +FD22F68C76DA1E44558869257892363C091D313EFA46B57C3BEB252E9C6BF5B4799EC58F1910F469E25AA17B343799DB3E33CF410061F96C6D63FA91B1000CEBB7D2971BDD39A2A76361E000F5DBC1688D47CB812DD60F8001AF25B328D173A9E4BAC18CE9F1F628704330741B2649B92E9714447C68559C6CD2F681919367 +311 +E4811100750058809D0230C087A89FF3C80C23C4C60882E481F48D531764BABD5CCECA308DE2F63D3BB50373D630796126803C2D1FBAC148F7592881B395ED7D26B7DD38D7096AF98841CB37592561D9C6565317AFBE9FC4AF7371E060736C7635E0CBA1809FC80F544DBAA1F2F9393D970D44C0615A0C6930E758B9E63AE6 +311 +90F73045F0C8C0731DE9CD80F718E94652383458799E02C06D328010011C7090D8C5E5336A83D4059953877EA1E1D66FBE994F04608C4C991917230FB61F9AEE183A40AB9108D032449FD1A7283DD25ED15360EF7EA9303EDDC0043403531EDEAB10DFF87F5E2FD56DF0F1B701A9F614DB17FA0E0EDF6FD0B1622A81FA3D1D +311 +E5A33F551930335C353A87F9AB05C60455193448246944A232C5D07636D864CDD7A50D0B4440CDCC465D1C418321F50E1648D500294065D869559EF3C40C8FCC6C323E989AD0F0C73142480B200842802C061008B480A9954AF282052B3AF67350FD0DD30D1F4075AC303A5D490250F5400ACF479656861E4C77AFF327F3EB +311 +ECA4B57B6B6C8FF62602BF150744656A87DABD7BC6BED50527B2120C001A0B3718C74F0C65CD34F275164D7968148DDF259AB8AD6CA81CDA4E8819509B996A7F642D987A401A2B04018C01E6C169A8700F9DE3B489DB2BC49C9B7B858A4F50D22AE15428FCA4A1EDB20C83492690CFE361CC7F8C8066FFD0D77AEE797977F4 +311 +68A36E0B0DFC87F90EE6348BC748F7CB73B5B9DD5C6EE7AB19ADBF6DF359F1DC2A0F9E44F213F8041F64274C0859A2AB7C37440FEDDD2F95BE44065F22067E3EA0CC3BD8C0D8194EAB291CCEE20B9CD8E02950AD806080047A279F19024C837C848816719AC4A34DF8F0706CED904E8185753A458A27E4C1E37B5F30A10493 +311 +2BE140E0BF4E400160F320B054A8705042FFC47B4940810173F9C9E97240C7FCC3F3813EA239B745DE9F1B1F3FC2F9330374DBD1A7B475923F9A2ED81716D18D1B577DAAB9D1A0458655AD3CA7E211867AE7C702DCACCD291E0F798013DC01BC326087775C0833E04EA3778FBCB8DA4687A0255CA0AD210C15661E4E92001A +311 +4449031D1DD27D327334BE830B64DAD90CBF537A45FBD4E94A7A88888E715B7E74FCD040E818BDC1BF5AC609CCCC015DED23877080FCDC47BD8EF3A7B783A17D33F3ADEB6D6BC7AD75EA7C7852C5B6FDADA6AFEFC2D181C03F8C40DD8A4AB5024F0B72E34B57BC1182472DC80946789AFB711DB7F1193C03C893B0345F4202 +311 +46114D3EA71D04FBA731C0DAB0D3CD311B218F0D5A15ECC105D02F3AC32F13600084731A83220040019B03180634B5923D438300B05BAC80881F061095FED5D572A3323ABD83F1D37A2301A8C930AB3F66ADF7CBEFED30BAAD7D78A06DEB6A87F15491F5AB7E25842B6B34BEFC12C8A159F187C64B3CBD2356DE5FBAB98BBE +311 +9583F0E3280C0076DA15BF34C15238145742B07080B1EFB83382F9FEF2239D003541041083C5AF9EF3C8944DC2030BC3ADEDDD9D27475800693049E05413BFB3FEB4308731512F13400D06F813368A0101D8D863EB3E75FCCADED124F532AD3F123F131AB46A93DF1ECE7F96CE9EB6C365C6D6A07EEC461FC919FE288AF7AE +311 +1A7D012D291EB073735FF26BBB1C99FB706E972192819B7A34BF22424BEA1CC7958AC2E04BFC8E02DB90A4A1DD04811ACDBC181037864672C78F6C0EC3073A40CC49D5E813593B7002763BC6A909D31AC86F3F6E335C9E1C309BC58F16418642E2AF6B290A34FEDC0CFEE08FCA0F56700699CB73B9C99302AA17BD516D7F1F +311 +D755A2B32B3FBE7134D3BEC813195BD355020A7DBB541539CD2C06E45F46FC0EE08293E6C0E1972176D9B678340AA1A4823404EF79B1E2347E47C35D0A2260730E0B513025DC0BD1C07E3366E9B9D17F767405FB531070700035618606F0B40C73C974CFD321B0C174A80C0F3AA54945FFEF348F5488895713E89B5C98DA50 +311 +1E06D8D24FF04FF0CD7ECD7BAA755A854EC6A180AD13BE094E8D5D63BFD6DFA5F5D3E4DB1BA18FD8473DC6E17FFC9832B71A2A94D96E808BB53F9192955D62C82E282B05168AA0927D54AB20A20A74800B7CC9655C8B15F62377CA4C91641F9F4D0478F4FEFDCE273A002CC0A725EC165CE3A149F0333E8E9600B2C05A7D15 +311 +FD831F0938DBE5D0FF13E3C0F0765965A0961C3FA86DEEB0E28304747BFBA5FCDEE44C23544F7BB7BF7A132DDE34F99E44EC3FEEAE92F667A10F7E90B0E8C6442DF5A5318B0F816311DB2E6DC6F172C363FC800EE09186BB9EC82A24C0117700CD884AA42023B81EA6E0CF8B3056411110D78606EBC5AD5417B45BCC8E61EA +311 +01C4006AC233933E35D860BC1B6CB9C9CCCE7840D2E0C1C1FFC11CCE54D59300F2B47D66A10F09D8E24B71B9BDDF98FB62A3B897C53EC88D16D1FFE8C649B17BB8E760EB20B784F52F992544753F2CBF642CD3C9C70D8722C197142C567E74FB431EE248A8F3FC00377F5142144A82FFC28AC2970A780C85A7EE9146FA4B29 +311 +81F3C93BCB0F3FBCB6DD3DE69C72B6073B99140DE28B8E919D9D9E7C2F5FA99FC1FFD07E9AC0965CDAEA0A945FADE52C791EA989E8E7A21A355FB37E44405D171B98A6E946DB26AE71DBD01FEF07FD378F5B4B518724481820890E7486E3FCE61A60E096D577701890EE07CA5D7F2B086040749FCEF3F81972E510A86359C9 +311 +BB579883035887542090614E5C4461705D7CA1CF84DB564838606CF1597E8119790D021080C935A908324EDE9F60A04B7830A33F0670CB08605B8D01BF9A3D435693FAB4FD84EF6754930640C1F9D74B052A7ABBA9F502B39DA3BF6BC7514EA4BEC71D752BFDC198EDA8DFE8F32B3EF811E4576B0A2074B99B070A069F6017 +311 +3E7427BDF285024E35A4418B7A412914F2800F1965C4F1120A2D5D2C64400563D5942044807BE7C738EBF3034C4A6F4D70C04ED1F97673C039FABC4CFF18866E08200BB66BDC9CCDCC3FFD1E43BEFC52C317F0F5E64900FBFCDA4DEE68768FFF46350E0EDADB7B34DBBEDE3776BC55599AF84E312229F931E700D04478D66A +311 +0D88D09B2276141AF0F8811C5F8067DC04C0F90929F7F1AC9CCD368488AFB965C97B855A3E2E93AE5B4866502E55991B82D4388614F2C36B8484A5FA06E3EFFA984A6AF17D5C2073299D9F12FD63826F67FC460E54030981684E9FBFC22009A3006962285FDF4FC84B699FB5BEF3736C6072F6844C15EDF25883037DE6BB7A +311 +FAD6AE164B367812FA8CFCA6FA25725D99AEC5C6EDEEC64ADDA2BE0056002032E1D7A20A54CF444E360D520A5B69816C0A953CE0434A8A898BF18E2B704588C01BDB2133342F5404FEE698957C200EF54E31BE6DF4E888C9C67F5F3F1B41F922777E7FA6332677C20098C59F762F5DFE4A23F9801A3BB6F8A4F66E0D40EC86 +311 +7E92DEFCE84C714FC7CE8DD3DD3BDBF9C781B1C3B549FAD2C89D711808CAB100E09700BB85240374A7209212F320CA577222A7020E7824500179FC7096C714884BDFD9499E027ABEB3CB0226CD293CAE6E0C41A6788F396606A073E28CBE5CC67D584D36CA39D37974FE1023253E3FFB007A26F657FFC901D851130DDC2BF5 +311 +4884F20D5D40A0B7E5C7BCC7CC87B84F2ED820192CCE1AABA1FF24ADBE1D03635B5B3B53D4A5F84120125FADC36A0E792D3AD7E255792CD5241A4C84171F1104090017DA493D0A7790A7BDE6DF326180398E4B0DEADA5C2763825E43E05C388E184678C88CE6422606C017F030366981353DF03A753DBF6370879F79889DD0 +311 +BF75408724DB53C5B0063AB6568D02DC47AE4627B58D7E367A6000267E7840C23A0940B992DB98ED1C4731B4FB4DCFB6D3EAFB6CAC7646F0335C5031888CD74E2103380260AD47176D703960230370FBBF28813524C17FFFBD6288BB28E4F905ADB4A788B40B4A6201C1878BED224DE9906C4C79EF32EE679B9F5D3B5DFA13 +311 +7327320643909A823F62106CB8F9BFE4BFEAFF0FC7A6393EC7F64A698EFF8ACE31BA05ECE6DAB6DF124118D1D13F892F3D3530602E3F3ED3D59DFB821ECFA3D9AE85B1ADAB9E328DE738BF55D5DFD039445AE76D0194180F57B15BEE5F09C07F952F9A10372BC894CF7DA12CF6507E2A8916E0DF430C519485C55D61EFE209 +311 +912D8C32866214E121611E22A0B1238DB18E86636A3BFAFD5B4EE02FF1E505F902BDF424D0516907BFC95EF3A76B6B3872769D67E25B548F0DA46E2B93DFDFD5F2B9E9EEE1EE1DCC7FBE6380DFBF38A165CAC73DF912AD76A4690D2B766A3EB4AFA2D05BE543EA20B095FB17AE3F1928D84482049B659E671A4763CFA567C0 +311 +8824913D37F2F92F841FC244085C1681225C04AD6DE1684831682CE0D6096B56101C0D4FB3A1BD3F11FC1105AECF5660BD3FEEDF162B0D9DEC6DB55AF27FC98050BDDEDFF63ED14B01336053A19DE9AEF5F5D9E9D9F9E19ECDADCD497BCC57681922F327EB41FF681E17C1921B04FBAE371AC69E53F98183E91B84897A5DB1 +311 +64158BD1D12FF6F6BEF0E02847727BF2628F9FD48B6FB11DF6928C868B29590A0606F92140D0C08850DAA7DD8A5FE8A50389F61288AEB743E9C801BB67DBE0A7F64F63BC87770FDF57AA73FE1F5A84F8DD3AADDFC32087FBC0A7D645C327B97D65E7A8BBA76DFD9BCEE1B1CDE3F5F7CE4E6DF4013ECD7CB60BD1239E8A4E9A +311 +5722AD9C4FAC8F7FF17B214AF8801950430639A08E3ABD05A0D94E253BD5951C885B0CE750309070555FF21F2EF83FF53F4E15038B8D8A244740A5C9CBC120043DA0B323FB1DA0A4EDA268C05A304619505000BE10415DE898809DB6B66896E60AE347ED3D6DC707CB7D5B5BC374A158EDC343D0EA61C217D4878CBBDC1D85 +311 +686782C3CF4272E7DCFB5E9EF628F5A95AC1AC0C6848F5771329EF8DF2BB79EFEDEC8DBEC72EB7F245287FD4B31008AB38EA4D52F2BF57167159E3004CD8950E217DDD6F699FC763E9D1A0AECC701F7BD4430A3E030374066938F883C01DE40E7DAFD609345E33570F4CE6BE467FBD7F793B5AF2A9D331D86DBA7BF9806791 +311 +8F9FCDD609A0384B523F4413B574B818C6889FAEFC5E7B8F90CEFD62BC2C85B2478D54DD076635BE434FCADE68B3ECF1C8708E27863DBEC352D87BCC7A92A8E135700CDE65BC114026DE5DB68275E656D2C0D4087293D43BB4C9C14EA83C0D806783B40DD7CD4F19EE9F33801F55A3F1FD600017A6CD5DE607783D5F74E346 +311 +80E7DAB98D99F6E5B5ABC7F7DF19D8278322F6A97FDB2FADE1539BD945DDF868EE2B8B70D9EDAA45D1BB0A5801198CF1DA891540474745BF0317F8A3703E02510AE94B084221F887FE950272D62D4232781054A87C58D015CD45EBF9B70E60820A2056E9D4D619E8494BBFA68B61EBDD8CF52CCBA124BACD4A4077E8420A7F +311 +36FCDAF661E577B792A7E1B7E337C7CF1FDEBB3B49F501F3C7366C1730E793F51FA20A9C3D2E9F18E63DC277449054CEADA36DA0807467D45F8A744E1BDED725A033868703F1392BBE221158220588F30574A0B0893D0515B0B7C404AD0E7F40C11D504C49BD7DA39A85A19CD7357DFC966E5D92272FF06D59CA5A6A1C8AE3 +311 +0E52F1247C1F1D78F81887F9F3E387075B170F9F5EEE4A7F5BFC69DF02FD8795FCFFAB472E7C88D563DA514861B85BD41594A75F5E866BE69471110A9F75C8609C7E6BF6C7C727431EE3E9E3773D2378C25226E82C08104A57ED273FE0921D6990E02B006BD038263BA360355E8DC446A380F0BA35FA9945A80CF60DFD5405 +311 +4202F91897C241C147D59F8E0FC67CD0F2BF377A3463F8BBBABCFBD6833C57E214AC3F5AE9C2FDE88852968F20337972C7E04EE5658223008AE82D93BC37D8DDD900BD6B16EF221F0D4149045D740A8A215D4FC186C658E01994B8CCD317465828704BB630DA2243B3B4ADD3EA554A97408454148C04A1A0CAAC2E04033C04 +311 +073851F54380E0BF2DFFA43FAD3D6B574F2E1E5EF6E5F4FEFBD1CA87C161FCBCF5C7AAE2F726F814027BAE10F79BC3D765D61D1803952210A9AA07F8C6BB2105B61145B324F96014EF223D4A9261080239F03FF6F4DD4975C183B887E081F7A467A25EAA0C94028FEB808637768B07400A8235D4EF33143253198900E079E3 +311 +FACB0C59B00F827A5785A6FFE2FCF0C0E6F1714F11CDE5140D931D707950631F3DE877F300002000494441540ADFB08704E252AADE1BD4E8DF55796A32B9B6F17737C67702E5C638682737286CB0E0A89B624D5BF28222432848C9AB8C07170C97B814FF492A61072407D638006F7C8400860444C01B1930A522788045633D +311 +FA9507267A3A42BA05925BAD705CDD3792FA23C1075C6EE768A673919EB6C3FCFE7629B7310AA794CC9C0D14A1FB88F95C845BF22543F57996E0B26C9E4C2ADF187F979F8A55F11B47BC26594C52588518D25E6C2B1CCED231EA1B748F093E5726A21A54C91EF95789041030C20FD5AD68613432E19A4D0DA2505B6BD84351 +311 +6E10BB00AF9AC315EE9FDB39CC1F9EA59CD88F9CD071D470C86C4647FDEDDBB1CDAB81DA94034747A779F4CED497CFF817348F69F52E55490840E48840BA72DB71F3E84F6DA2F4717AA928F153DA6E4C7E8E00363CEC9A2E1C8E65F298FC4A52F087FCDEE5CBA38A80CBE11FF7BC2AFF249203FFAB77A128A001B1987BD334 +311 +AD9B901890A8C2005B6B248196AD09C0025ED841325B31845032E327C531C839E66DBAB39566B631C2FF0A1DA5A3CC47E665AD8751B47CFE33899DF047C9F3C365E3B11278D49DF939298E09002F6430F9958803309827A7C791048CA070061B7E9A64C557D235F83EE24822E5EAB805F9862F20FC58F483DC0EF02181F572 +311 +930205107E00E523861895A2811309808F2B6C14B2AA579E893753C155D2F54302007E9FF36AC5FEDBCAD47E182D91A73920CFA5C18E01F8FFF4C3F1FF553BCAD0E58DEF85DD63B91BE38ECE1A9FFC4AD4A1FBA30D462C328C5A0340DFD393D3D3D3C0659195C96990F391EFF4175213BC74C020922D4830FE215E76940962 +311 +BC0713A3B82784C0CB6623DC40D6E1485BAD454F6892200B225096127FBD82D2B12006BAE2E329C771E25FEBC0DAB3B5395289D56D7A8A89081B34EE06F80F819EFE75C67DEEE95D227E283FE98A7B9F1C97D2D05B4D07A469153C3DA3048EA68FA667A6D90E291C7D7E2D063E4D044964D055F2DBF3E31BB851AE9F78A0A7 +311 +314F0AD24901F581D74A6929142039C65AF5830D1C809536CDC05E4BA51038F79D713DA930CF18BA3010E385351CF47F74D439BCBC793556A1F99814926AF12835E251C59BEA3C083EC2B2760FEBDF4304C9EB87B35769E1EB24B648542CFA4EBA9EF93CD42F03C08F249A2C98897D8E2225E90077823F4A52171A61219998 +311 +CED6FA050992B6B0A74A2220ED12123004FB977084208F8E2AFC80F456CB110BCA647A3A0F854085D84FE0052BE31FFE7F925610BAFEC06FC33F9931BF063F39DB3D1BB20EE357F594045F4226131578582CB055A59A073AE0413989D215019B6EB8A21CF154D71164E0D8F4E730C2CD382D098DA5261456A425643686BC83 +311 +01710F2C50665881399156AA2B4C3191BC555728384800CE10040F746A3D8A80A5F0E500A93456FEC52833BBB45203DACCA37FE1D3EE4B9BF0EC27ED47D89B8266F11EA2DB8B5A8BB93EAEDF0C06B7AD0402B9EAC6E787365535AF19F15158308A9D9785C1BC1C01377F8C6B4D07B50DAD25649764A91DC9812C7B34CA9818 +311 +4084F7C01055466B48058CD44085AF26648520C85C41C67805462D8425680425559F4440F3ABBE1F3F81B1EC72708767DDC8FFB6465796C8FE310FEABE0C9B242A74137EC3E0427091967023299BE5D6D4D0C6D15747DC2AEA4ECC57C72856E827D33CBD319D70FF854369EB841282F84B7CA4881447ACFCB257E252E00FBB +311 +3272120A75B99119840858486615636E0E0334031AAA8C08A62E080053A0AAA4158431EC727A084021D41CF5D630C94184F6FE7432E8F5F9A4FCDF3EA7CF136FC2988093F98ED622E38E4976E1BF0CF49D2889E6DF3566719FE1F9B47A2D3BF89C69155DCF24F88C609EE551160F0415900B4C48FB013D8900A9192A700748 +311 +002924771A3686A0A580FE4009E00ACC090253E280B90AC15048E047020483A038A60ED232831F2CC90498648690D960C48E439F18F4DDBEB0B6F5AC7B7B89F6230243B4FA160A7B9327F3AD5D937C8BFFE5FF8B3A5E64283BEF8EAB9F71159514CFED62DBC880614AA1F7994CCFAE7D8C87057F451733699B8DF87056E1F0 +311 +654B5021E38097E4E23221B810DE20559AD183A61C2C88A648DB096081E9801CA00BC1DA0124E08DAAC15FD2936905CA8DA1C40E42B13F1764E0C4015EAD7F8BFEC99A310B1B7C0BCC7746D3C0702759C89EAD57122092122D1F857067684A578F1DAB7EAC400841F493A468113282FFE42316CC74C756B1C880FE78795C69 +311 +2813CF4644480EE9B02991BCA257A71861F00666D9410288487618D120D0E80D7773E2B7DD180E100EC98B221C94BFC4FF531A09B986230F1CD08378A8E4D0FDD7D9B1BC75F5C12EAD7FF83F3ED19EB018620303C217A6A35D826E72ABF2D8E2BB1B783F6E48D2E3F360806E1D192085D022103473A10375B63853EC54F500 +311 +B5B064DBC20945B88160DCF7E4F83A0200BF6FAEAC88E9F54D22D898E43F378D20B51B5D6B1457000922202800DD401A9266483029C0D6D57ED80D42A0E6E08835F0F3AC73D7FAE6D56185F04FC44472B854EB7D9CBF7134DF3DDC35A9F6B38417DD6F508B37C1A718B0D054124176F7222F62DFB327F34D451799D5621688 +311 +0193254FF782D7DDE26C271BF38C6E422E271CE4AB8823C9510F021126A7A944E00DB4031D013C88EA0746C96D4574069BD5439C4110403B40020C30B07A604F1E41D19C21A93FD9002DFC35F23B1E7B98E95E38387E3603FE7393680410D702FF9ED5A3C5E5CE68B5827D721FA78F3A9A0C08A79722D9C9B418F46C0057BB +311 +1640C70AA4A03D29CECF33987596D53CFB27B32C3BE304C540E14BF8464E080918268D254838C91A01F0FFB99154FD8A9C0495EAA6534A6C464440B4A71E16100E7405088122A35F7A511DC003D002E6C8E7E15F6D1D2FD09014139EC11FDC89394621F77B9F88EB5A583C41E2FEDBC8F82334494C0BFA97FF3C3A34ADE603 +311 +85B60E5A30CF036E5E75370BE3B83AE73B3B7DC0BB337DA0045299ED0C66681E4AE223D01B1BC3BD4C921E2005FEB5114739040758189BA8A320067B62A3995E4720055065AC2B4A8006BF8CFCC907C0063EACE41813C5F017065AD46CFDC6FF1BFEE052932CA3478C8E5A6F25DC8503D40F61FC1B047E4DFFE8E84407C81F +311 +1AC7B5C79DA358551CD0D13785A9AEB38D6EB68A0A8087FC6543E7471082873CDCE5CBEA1EFC5CC0579469E225428E9A43D6A6000B4219DE52E8DF00A55F4BF5035960661C2DB88AC1F67C2890A93FC420193C8326409E7B595FBBBA9AE1D1511B3F6D65B09AC10A71C2317201A603E88C56CC68C91279E83F5C147787EFE6 +311 +C675F00941D23EF092920330982DF38C65EDFCA89DA98E8ADDECCD77CB86D85118F3DD9884820B1128010D02F1060F582871CC8FF42024C02239273A1CC3BF71E770DFB7E96081682803188118B50310BD620234F230B12711B063E0F0490FCDA9248B580D3D3DE944A30CFCF2A1E0F6E59E8FBEA289CCCC943785BB8880AD +311 +A9C2FD70F6A13F5418444E3A669273C006C4B4EEEC067827539FFBEA9CFF04D84E7F170480037005AAC8829084329899F90B5E013927F8E646514B4824B01D11F72C012CEACD163B6358A4454A4221D06E68A71062520649BF9E9127D0772D6E5EADED52FF216BC2FC513C7D3C5CC4C8AF009811826AE20203B076A2AA66D8 +311 +D32E317DEE0EFC000FCE16D9E0BEB17C74AB009256C5D8AD1CBABBDA61402612C675FBD72D07E633B1A42F2421208CE01397560811204306617A5141706105C9F4984C459F2D0F6C392FA05BED808512B0B9A8A9FC6CED89640EA347D31F0DF76D3D9E61E800FE9F7601BE4C9614A1C58E6C839F13A12D0EB426DE6386B823 +311 +69A9E6A7F1F9146EB578A2EF4289AA109B4F6CEFEC0463E0072A05CC9DEDEDFE08407B173B8AA65399C80B2911252E6290C82CC1B8909140C11B7AE161B42B93905045D017E00CED6D27AAA15F2C2179F1E83D411A7020B9408D202381E7E5DEE5A9E7E5CDE3B186433F488AC81554BEC09BC579018ADD1DCB3D9D70F02B14 +311 +BF9159A4DA376225FE43DA224FED327941705DA582B2FD1BB5DC0540667B650BECDD1D5DDFB0C7F36DEE2B94F6EE2EE4E426F20A1174C31DF153321A24114C4FFF25E505475F6906D4149B21F1BD9D9DF7B059F8E0FD83323CB97991FE80EE131A9003B81C491B218B1D42C0C0D593D9D548003839DC29A740298B0C23F0CE +311 +14BB167BD61989AEF0B985C8FAC8F923A73F31953989F0F6C96CA6C4D0A9A88184BEDBBBDA3BBADE77CD8E2FFEDEEF46184A86671D7DDC51417477BE9F04804F305AC82C2D018A21EA903866A0F959FBD4139916D036635EE03DDB7408BCF0627A03027AD314C09B0A27F0A79490D53839D0DAF1416995CAB24101FA63F750 +311 +29D57A4CBBA9FB4D120ADB17FB5A999FC9420DFE04FA670430B90FE7F589F7FE8D50A4B5F004CE5F07EB4EA007F8AEAE8E8EF7DB3BE2F81F42166C7246FA9E62D02C8209BA1024414C483498B50229FD923F2414040B2081390AAC353B5283EADA12A30B1080866D746B9ABF5BC107F33C2A015B275480759334B83AB02175 +311 +EFD0DEC785DFC505E0064F4EBA5A97073A74C5C9FEC97BD25D819E28AEE661FD2732B8BBFB1BF13441B3C1F45E8AC1752BBF80C113DE960E0AC7D9D02C58C80505A19BA0E84B14402601A590A4AE00A825E98C3212342302EE10FC5100681F86834A2804BC409D70270A2091DCE874B16BE0706C974EB3D26EFEDFFCA6C457 +311 +9AA4DB781708469F055532A7046C6BEB0CF39F3ED2EC4FBCA3D00EA91CA68FD2B87B5C191E0EB2C300F00A1C9881F263571C6CFD83D079D09F176FAD839340CF030F70458F81F09AEE1329505150CA0A00576B56C06D58070B23086F685E44232D9D53DE3FC3731044F286D19F459351863F749F1104198D6E14BBC68E17CA +311 +E70D7AFD958E350BEBBC70C9C4DFBA075240DA27D40AD7DB063A097DD3F041EDB3E4B682A7A12A548F3393DB01945547175879989302521EEB1431B08759B632B174E0F700E774FCA1BB83F95029ED1A084288C8893520E49415E00DA080AE8027C34206D35491D050A4C6B080F6A20889A2FF82379AB6234F6710C05F9080 +311 +ADF002B9C9F9C583AB220F45D618D7E7F7547FB27CED8A8B7A7D24EDA4988B0C1C2A1AFB53FDC61BF3DE50D63C560F0120B0372F0839DDDAF13E583B868717C1CB8CC71D1D7F440CC82184803144196EFD58BBE00B7EE77DE8C015942357FB06FC906A5E2B8882CCF9FFE184B0035A5CF186A962A63F84B3AAEE3D5A2C8300 +311 +08807568B6A9F424086D2095A3E262DBF124350082C4B5DF4704A9D2C93553DE47BD6766B69349610716999FA25854F759CA9792599D3837ACF6247CE8597B0F960FA3EC45B61715050260C5844FCCFEC9666BC71F875B17E3BCB4CB151405D7D08F846B4CB952248B4603CC402B609E90F0044A007FA800EC46D07A51232B +311 +00E5683C55D5096E1374DA4FCBBDE2C25A5B8D26008227CA7758033D7D70DF12CAF7F247939F93F1CC63047D63ADA0B7CC8771B234D8095FCDB577B586D1834062035670E204B245EC093FCBE15626C10D210CB38A13F50E10A0D5C0814B0C4B30AA9858516001669002229618F100767AA3D6D2528595FE7A398C2D2300ED +311 +0013A0AE60B91644A057327BD3C36BEBF48C91279B45F8BD145494674AFB211A91977CB838DF35DCB3D6D6AA2FB2784B591ED785DFD7DB77747DAC9D2F7674810EFC2895F9ED8007EC7885101679C06F21E4B1C8A6120956F80518D1DAF1717BEBFB5803E20C6F2A11B2E48AFF4AD2810A70054623E341B3D1ACD92DA91150 +311 +DE631EEB2C28882D092049C0DD38E262A7BD6F98549930C9D44B7C37028AEA9F8C5628A2BEF5704C0DCB2B428181B1BE766F43014498D2E57791E4C8DA6BD2ABF5003F0C40202E2E32EDFB02852D16C30B7F646B98FDF86C7891690043128B0A0DE6B4EA27F08C30CA34C9D0AA0852A5997F8D11A6EE84E040B20472020256 +311 +F4AFEBBB74E6705A12083B249089218E6452C8E5A69717E904A3F5EF3D5D08EC1F4D4E85086B238CFFC11AB9AE972CB775616C6D1DE04DDF073B4DE3747C41FBAE6072901CAD0237100670C5A00C2C3CE063610ED824826C1F6650700E88C00B62468903A0D71D3A390255AD7040048348C56C4647413C2C2561216E0C4692 +311 +03EF06A5B101AD40D0E207F78B124747DB5B4BBB4E88B1C373C114E0470B345156EDDBCE1B4DBDF81DBC400746B0B54E05F693707B89A5E430982C2AC7D10DFF11D5B102B9505034B35D07E8E5F585757F088B390F2D4C85CF7218E8418BB4F25B885053D07D5A908326809F31D6CC6B77CC948413B28664484439D118DBAC +311 +27DB5AC40C1AD166F25E6A2F0AE82100C0BF220405323E1FF80DFC518CACA8DE1003F3C9FAE9C7B2D60703A0004F8EAEAD2DE0F5485452D15B77B4B67F4C2403B8D8F9C533558ADE058A9E177A1698F75DC0EB4C800F74C0270178C8579C1FACD025F0560844502D2BBC01E620030CB93636C1041636A693949CD80139FD15 +311 +BE107F905590A292840F8860706D07E2970A2F15E5B13B87C3143CB2930374CC46A6F9B9D7A5CCCC14E11B9E879A49FBE27ADBD6DA82410FBB94FAA8487D61B51F4BE0A03FD08743C31020D6628ED20305A22C2C2FAFA7ED1E7881C438AA5B9035F20759E243C51F34D0D5F02F11403B9E204CC1686C0B6C9000470561519C +311 +BE1B0E4FBEAB37A39EE4B84C05F023858779341991F36D9D9F351E7BB3B5ADF00148D9D05784F9AD8B037D48C01BFA83D4247F03BB768BEEF973A14E610090D4B96B1EEC5C5E66928F28EBEB6CF578B067DD83086081579848E60DFC7684044D8174993C39F886043481F6A2B743B18749E52447CD4D230513032D20D20206 +311 +E536E15BCF7B7D211634F98FF9986287F33F9A94615A5A0A7CACF8DF5DCC1AC6EF9AF1945EB78E0A2FED1DA2ACC00EF983F9A012260BD722EF61C9DBCDD8719703ECF839029010CA0B9F100B1D2842153E01A1A3837AB579516A31982FD2908A09100DAE591016CBCD4B011A2F4DE299E1338CE065DC4841BF9895D8C81714 +311 +800CD08F5AD39601BC929B55D291F6CDCEF2AB40DD5D98F4E6F107C47AEE4A09A079C05316F479DAF4C2BAB83221BCC0CE23FE3D3D4C7BC9AB673D89A3677D6020F6E182332028012FA0FBE0B2668FB85485902A8E7FA0BA2105C213E20BC2169211A4BABA7D693C3F1DA961F203694853137073AD5CD25F1C017DE0477626 +311 +D7BA55B88F83B5EE513C41D814639FD1BF759171F4577D3CAB0C3DFF68B2D3B1F8478C18F67BEBB2598FA76A4545E9E961BACF657E0791D2373030E0EC9FAEDD17BEA7703A738185D08236C407448A4CB504CBF01FF43859D3115488EA01B55078000DF085911805790DE1B41B6F8CB2889C3834FE02AFE07D85143C6C0084 +311 +38A944EA63E047023A7EF37E13B0903AFEA7BBAB9579330FAFDAACD540022980B65A75FBA17D388F1E6576405CCE7032D95BDA420E7DC0EFA320879E5F8B3B04C1D2D9C1114210C19FCC49DC6A855E12010184DB8968109ED016E4683CD552A36B3AFA13BFC2114068935A7E774CD2C7225642B73325938052D8634ABC18DC +311 +9442BF9E0402E85B42F9F3273672DA8E8F1070405D1DC3248487574CD98092B8B956E6AFE1566530B78FAE05B4A0DE51FBAF85DD075C7E11939F80E015A58D1F87E400CFFD2306C4D1D3C634380A201545A92BE01F445800BE12302AB477BD6F62600D211232EB061448A0D2B877BB940D63D059C37E0569A83DE93E214F4B +311 +D86209FF6F479C640AFF8AF6D1BFD987D029A94DB7C329B4184D4BB013BF912FB88FEEF913071A8D82B651BC10DB067A7EC52FE1B421883144C00F64FA23A11CF708BF16CA59F18D4C04B8085964B2D8DA4A855187000BE440BC816FFB13374640B0EB1D0998AF38A1AEF503F14302E2811081FC12EA6CD38A63B33035125F +311 +40F170C0B0AA45E9FCA38FC6D688D48563B5C4B4B7C359D3C7AE0EFB16ACD5E2FAA47EF8307044B4EBE1C71E84E742D81431FB06B90B600B9C239E277A57C94C427EE10E7826980C0136600D916A06058CBE8604DB4D314FBC014EDAACD0820F14BF75449B70339490FE5A0491221BF95F949DF1235380E969AABDBE2D32EB +311 +4403D3FDF17F42F9A0A7C28ED75BE86BDB7C7EC80C76F86B8800F77B305EB88F00A4352E0F8089EF811EA02A3DF08F7DA008F803BE4B4EF5F41E56087099E920708C3D720916444440FDFA013D4E1201414123A09290F5BD7AB729298209C4306D007BB0829FD4EC3A6D7E4F00B67DF38CA0764F832F0448E58439B952CB4F +311 +70DF964AFA74CCFDBABBDF273E2FF4F56D3DBFF2A78D42FFF2755DF307066497F44062AADFC0CC546F6DCCFECECFA232E14F408F05477D311B683A35BC245FCF8A5CD2AF20022C21022266905A5BCC8B20235D6FF04019CC04058AC80023662E25F342063165956320BE50370F2A657BACC817DDA3DDD3EFE04028645780A7 +311 +68FE38DBA88BF2EF3ADADFC7FEACA952E5A77568ECF0C971DF32BF1D24F8486B22A649EC81B1B60315CBEFC026091CA45F858D7D04C1B437079431E63E38F880758842E780A9E03791C0FAAFE10012588C3C592FE35461A6047802BA18686887023A422A49599399893103942CF6DA53A8E387825FA0678B261F139F801E2B +311 +17C901D0F5217E07AC2401A87D0480F753FBED44FE949C93A1D042B879FCE499B3D861AEB23F9C1F372F0C24D0B7D6E70FE1AAF60F84BAE642D82F0A9F53E22783915518494FDBC0AFAE7DA282E5050B703570E06319A015E00D693A6BEFFAE493941C3B08C13B96BD20D0115A9565701DC58568A3009DA13E965765C03091 +311 +F0FF339F7309D44F6E61F837F1B1FF920450EB8FC48F9B40158BE89C81A597CFB0DAF5F5755D3886DC13D4479599B583758CBF35663AA234F133F91D3BCCFCE0A794367F385C59B19431780F1C099131384056616E15A1563B50021D369C593FB292685A68A8B2A50A0A2085CF05434617E05FC24A6B077B990014421A6840 +311 +1AC4D65788EE25F737EB780D08A6E38F060F2ABD889E1B889C44852C2FF368C1E3E710D73B6589EA83F7417B341ADA1F639A23D15298F087AD0326410E116C3A1B325218433C71AE62C07C1480F1C045629724A076A4BB8D622D24690486727F56108D07046DAB065000678E04C4F8C342DE27F4AC102D854F2D08D59B4ED0 +311 +E4F697B0FF62F113646BC5B7F3131D4EA8BF8B265EA3F2026E7061B96F6DF3D993276B2180B8E57067587428579460551049049B074CF8B1066C7E14C705F0B39298C0997C17F701097023BAC31081390196801FB0C2A12380042927503D5A01CA127F9841B460310639C674BC8CDF1A320501448E0068905B07F6E5602F8C +311 +1F07786253438CEC51AE61FDB25FF71B09893AC026A9EAE3F30F369F5D5EAEA5801FBAD3C98B38C13EE017B054F81A56F05259DBDA64FE270B1FC4C77200FE276FE814B916E222575ED717A62A92956504605268408CFE13FD61F84252228376060206802B9550F00B9D47E6AF1022538A752CF4FFF1F5931384A9FF8700ED +311 +D4FFA2B93FCBFABB3EA6C607FF714B0B8B04EBBE83B52B246092AB018C0D0002FC490849F1E214AE6FC42009D6D86616C835B65DB9862EFC4480C14137603C3089D0A5588FA27E693DD184131BA4E88C35045ACEF1CDE1A82323C20B842F2419604821196EE8185BC834AD44F8E9B7549A32900196E9ECBBE20FFB4706861A +311 +ACADBBFD9B56A23FFD3AB8BFACC18B1B5AC0ECD7B6AE2E2E9CCD2BE8AF1B1BC3A813B94107E82DE67A42E7CC7D4A6116700B5B2EE3C338A09B840F07C40A64800D7C605AC42B72227C4C7020AB1F20056E26F542717F56534261DE3766AC10A6ED2D006DD03BA9DBA507AE0510A8B385C92363B9154167F1230C40D76AF6F3 +311 +BE0CA08F8BA2FFBBCEFB09D0986550E0F0EAE2F2780CDF850CB0F88CFC2815FE87BD83909F474F45DD47F1C821DB2107A8817FD45384F57891B65F2543D0C1E20A89B4A8DF806862AC27C60F6A054627FD344250718AC0FA21CDC4E28DBF2650D1B39D8B8A420C348A4F846E2BE824BF8C45E1DB8EEB52F576F47A75FF95F9 +311 +0FCE0FD3A7A08D48D5B9AFBE3EA658E1676FE3372FB57F0AD8D70ED4AEBA3D4C2BE0AAF1C3AD63A6004D12900CFC481A47430C9EACB390038642C8C41B13303166614210592736B8603AD4FAB17189DBB32F3915F0C380795A089A15228460BDE8E52203527D41B5470901B088D84FF8B3FE2BA7F4FD30ACAB3DE0B7E2FF95 +311 +807AB0010FFDE3A048F7360F9F3FB9380EE537F16F8673131325D3351A3F664022020811A0FE8C019CA17370725CBFF64132025DA1BE2555102212E80A907FB43ED80A991A8AAC183932C19AE17524B06590B6AD286EB99BAD18FF4BD64BAB519202F992A963648ED30E7521F909F090C0213E367A77D8836BEB6F34D92EDA +311 +624183070248351F1A079E5D3E7A9EE81F2CE6678F92E299EE312B6C0572C0A7B5EEE07853612403813152C7125E2022A20C18F855DBAFA399817FC97FB6E1CDCA31D348434ACD0012F0D32A5456B4007E6E92D72B1A4E9971223A42C1042819E4049C0C5801300C0013FA48F8944FBAE71DAFC27F1826FA2304ECDF3F6C10 +311 +FF47D5C7E49748DDD687DE8E91C09394EE0682A4F84CFD6067EEDF43E67EA46CB2F4070160439245F00343D03BF25D7E2F26FC400A896DBF19FB8D4D0A66DA669C3D608F9CD048A0533621B25690EE19D5D15248E390F042B12C682511B02BFE3E5700E4C9A9B2107A8F45248FA48234FD23005ED1F4EFE80D1320836F0400 +311 +3BF42856D478D1DCA3ABEEE3C68F9F30C3A16E5C238EA5DE3FF37DACC2F8B7980033F47FAC34421EF0418A045394802CE032D61C70023D788136788613887C0011A4EA316E005718AE191F8D0D841B9C679CD2FC478442D005429166F5A24403B1E6ACF3298F388B6D0BA933D92339D48969A5C11F09B4FF017A9900A4F887 +311 +010C474717E10F36468032FF33F4AD610517777104CD920C3CD15FC5F3B3A0C75BBCA3B00F2724863C10BCD4A0E00736C7981F2F72E4B001438B99714FCFAF713A2603BC710376A1715FC602022202E06FDEBBC680A3DF1C4C095A12C50B554FE7623B50374FB2129DDEA4C392C9188077658C87F55FF92FFA507FF03FC8DF +311 +D3F31BDAB46DD51AEB03F7E1B38B8B87CFF47EA1479C3EBAD5C6B382C221C0F1B358B39D76D9D3142C4A20935F541E492E0EF081BA41B3620A8E172B584EA1485632E22A8221CEDAC6110AFA4B6D43E2B76A18AB240BB24337721C9321D2C033B2D3E2641A55A400A28403C12D1DADE39AD23FC5FC08C47A64DC3FF6DFF76B +311 +5235124022D7E6D6D5F3CB870F9F31C96FE477FAFE54100068A3A87FA5908A2C08011CF31309C10025B089FEF9C510522B8DC07C30AA469841723A10C08E27F00F7FBC181C083F2809EC3B2B328E294AEAD5A071B3A95C81D2DE3F930372D022C9C793535B92FDAD5426E90490C3C81D000017C6494441544698C416520C1C +311 +40C71FC204B22448FD9303782FBA67089A1A7D4CE38E89050FEF5F1E078A4DCCFADA058032C34C1CBC2E1202B1F8962B1A8024F0EB7A11F209E96FB369D4B64202FE7BA230AD24C46413536EAE955B341B726C593B5D4630C0BE822480908522B0D85430230352618DCD4F7BA6D568BF4343801480006658EA3EDCBFFA9702 +311 +B4FDE9022163C43F9B72B58001A23FCE6F0B3FF0E4E1DDFB9801A6FC42FD0132CC1F2224F89933107AD30B6C9131A53818AE944BE25A70810821C38F098411980E46D108F483DC63F49B91B852351604091D60546702F58A3872A1716411B642C7629C267E64E77719F46B0548FD6BFFFC86A38DBFADFCDF700228C124C866 +311 +4FAA02BFB1F92B09800876FCE4F2D1C3FB4FD0A44E0106A8DB8079751CBF0BD9340066C3D52BC64706467C05B5A54401BE4A1B0132A55EAC1CCCB10D378A3DFEB9812022327745EF2102886A9142C812A1A2C9708027BB55B7006357459F9C2080E0BC34489FC629510F3017B62D5073E2A2C64048A0A42580E413BA9E0827 +311 +4091A398EA80B5BF31C87BF5ECF8F1C5DDFB4F22AAC181F070AAFDDAE5650C4000516440D8806786D874215149E69ABEC43FF0EFC820FEA112B0522003C84BE03FB76623513B6D840820358B084119B0CEC8C00AE888826339A54091F5FCA513AFE147975BB1A86FC50618D9D74502F0C7C8815AA306602FEE3A5E79E0D7DE +311 +D1B221001118B73182CD439A092FF801105D1AA14E1918EC282F6260869D55108065988BD67F68E5581720A708051F7C8070F582389C682BE53F2AFD85853F2A013D21564028E06E79B7A71E43212180A81541EBC88F451E02385100491AB0C4A3BC5309A95911E66D04C0B448366988ECD204C2FC930F8CEE8FA410EE4C25 +311 +B58DD1B6EBAD83F6196670F7DE635282C0A56A851AB035831725F0471A10FE52097089C80495804100318405F0DFC2136004B4C40705EC9154315129205EC357930035688F61AC02188250CFA9A980233925F16A117A48CA54DAB6400221976B75D863330942E20EE3B00B08FBB71AA813B0E502FD2B023DF70114E0D7DF2E +311 +2EEEDE7B789504200112075478F2FBD6897835C91F0C20782401E801A2F9142700B74805703426023A81CC0BE88B537D0003E0C5181D29EB8D83050964DD2580910A1E7A8138F76253DC01DC2F3824391AD748276C0B0CDF12366625D038603D0003E0266CB42704C8CE7FA7F11B4D59C0BF454A78F8FCF1E50513715D4696 +311 +07031272358F04E0003C90107223A581218F10008B10247CD20D860FF0BF48801040B361808148714764028EAC137E871501EFDD97C89B52107FF1235B0928C562530082573CE137840EFEF82A0BDC602736C595912FBEC69E6A3A26903B3A300C5A098A9E3F1810CDFFBA019D97B4E7A7A075850F2E92569BD960CA7B8304 +311 +995FD006FC4213BB1448A6F4BFBB3A9F9FC4962D0A1369129B10073771FEDA38B1737B663A71C088D8848027FC3008DAC4E4397A6F76271DFFFCF77D6BD7F1F67DA51E0E08875A6BAFBD6BD7AE52CC04A0B4A2206F650EC412841A48258258E8662C3838FBE21E25172C2A15A4F78D82DCF68A005DCF07047C183E1CE47731 +311 +BBCCB5469D9169E0D588945BEB637E87802A03D88FB82486210D28FB3B858D13DC7CE75F5E6F3B03C1744D30CC58C7C7A256146853A05243060B850072A7010CA47CFBF9A1E24F414037B8781E8E9F219A774B36481CB43E48A79819D638C8760D672FAC19FB9D3FC5EA9158DBD0159C27860409682E8FF2595652FE189D2C +311 +C2D7C023E944158355806FC320087CC74116030CC376C559C098B93A041C5DDA48AF33827D2327DC761D19C17CC62780D82A170E6CE7415A5E7FE825E053048F88D2AC2A561CA4D4C60098DA28EF1A01382772484698F60C8DD24BF396EA76260542810A625978C03580A9CAB91D10249BE579B0377A3DD15749A45F24C4D8 +311 +1FF3D7D7996F6A1690288008C0FF6CC186DA9D5FC95BB09B1301004B016E707FDFED306A1BE8FA208828F00BF342186839839F1F6FA338DC5A0200FF383DE92614C03A4508DA18F4D85F9354F7E867AA77A42FF49BBE6757A1A7454448D0BFC3C220714FE43A3D8F1547BE10F0BC5A05985AC3C28829A06FE24CD062700601 +311 +F4AF12AF99099B08E7071DC4626A97C920C3FF96E190C9D1FD7CB6163E800D79E5F3F10A9306C02B799E80F1AB380E0571A584C0370A220C3125000B500900D96FEA40409F980E2083E4EDF4D8D2480AE5667222E020BCDAD4EF19682120818FE18EC7FD6AAD67C03F7DF1955E697456F517AC4F24700C30171C67E9168B10 +311 +9A4F60AFA60F98BE30941BF776DBC7C70792A2FBE98AAA97224F8BEA39B47BFD14A8CD03320DA2B676E3AA397E652E30A42CE2987B7DA1EF7F75242413800A04C0270C62A13372400B435ACD84B8B5009208F5AC73EB149FFF3508E21C2201E0338BE07E50EB47E7FF6D97724A601028C5519073E7978EC88834410450E074 +311 +DD58AD13A4900103A6444A9CB99103229F0EF8C0C78161EBC68137240734CDCFC349807851E0EB46CE864D2E405ED341B71A390CF2DE20CF5193189E1901E866D0230409684B193D17E2928534D04240937D3C84477494FC5E0FE0B448E35AFC19007926C1C6A6E622FDB8A12E30993C6710E070397C4B26304C0AE38218D1 +311 +9F01FFB15BAE1C0E7E74DF75F2406E373C414E848FF8E500EFAF3C1029C9C0ADAB2313A7426CA9B2C1B9E30032C84EF31A09A88A386F136E8C2F1D582EA0459207015F10F1F001F0B1B7DF7222011EA2001F00BFD36BAEE0850928B08C077030FE3806C880EAA74BCE0863A952812E6008B3A89199C1EE918AF96AF583F1A0 +311 +73B0A355B9D861AF1460DCFB3BFC6B7EFDC834B09700CBED3510E48DC7129041C991F06BA5006CA6B5B34EE21501374E8DFC910042036111EC9C7CFA1C05D48A7270F7F835BF04A4194DA4CF76CEC66718C84CD020D04C412AC848F03E3C61A1C8D50D0EA6838A00376054D3DF61A0E393E1F8B058A6C994093476D601A4A0 +311 +6F0CFD3C0A6BFA910E75CC10400A80FDA93AC9B5EA4303F6C0D188B559086091CC5910137772E14F2376D03181B5CFE74C0EA38440D0AC256D6C4D104CE05302FCC00B60B9CD4D71E08BD40C144A025E60D4C1F45FE846A2105D717EEA84808A5DD90A168E133640311CF05DD870768683F5D2F1800F485AEBE5CABD8FFA3C +311 +0BEB33702493AEB551B1EB035EF5C8E5757FA7832141F88E8578A363802B560007AF93D7D470B478C4D00B412D634C9140C4F9275C00DCE8DFE3C7F8C0AFBC5B2CE82E3C3BDF393D4375D50C43CD1C17E3777CD2C170725B7B42B41DF15BFC344DAD089C1E9118522B4A2C60B794E4E8F33081BB7C8CFCEEA0B2015E49D586 +311 +429C6C78646180B7710E06018A3082243C275F077FBE412C17DE80D3E6B9462C5204C5D980D1DF84A864401C483CD01B143F4A4868087A0F780F37230200A4FBF6AED325114C367C22512750A5C7C3E32D545CE20A0904183BA10015DCAD89864B3E1EE97EBAE8B204266A48E010511838E2FE413FB116E60880C2D8440AC3 +311 +880DDA6DF6618C138CF1CB2A09637E18D00F80CB0DC05322E31EADB8081C29410903F06BFCDF5AB46024E4A75828056440503C707856EF0C037623DD4922A400E8A6BD75E4D2800905F18450A00CEE88860C8964C7B3F90F56528BA18F71CFBBBCD2D05797E168FC37DB26DBE0DD2EAEF39686C18440820013C1444055402A +311 +541400DD362A0A402F1FE51246404E098249FEE30708C10CA0B54601053159480C00BAA9B1223A773234FE72FD5C3BD81804D8D196FE3D5315A0C981D88D04FA01DFC185CA93F9120E1F480B08063364A0A318F08DF95056E4C91F1150D31B011200383502E079EE43CC18603AE2F88FD139C802A739F208E88D06DC78267C +311 +448C27C4113C19B0F51B0E9C1C021CF8F9167C6B1F2E10E461002910105D1042792D1CA303F469714C018C23D72179E165049C40E801CB96CF334562E5807291D1E0C70FE6CAD91656715F0E5C5E70F8D7F83290549B1BAA6F781D25180EBCA93EC84E72A74081CE3020789B3790E1A9E478E658C099BECFF01E530E80EC5F +311 +E31204ACFF70AF8177A03059240CD074978A002A878BF883FEEC81DD684E406CA630ACFDE87292822A11953710F000885D6F68A67ED40CD772B0828359B753F7CE23D9479AB9845771B389D6A77130F8C134EFC83947392029B10E4425440A84AF0E54825228FC1634D369874739C837A9DDC83C20D320C36042610ECDFA75 +311 +0303710224D01202488012CA847424F8D53F78AB6BECE9B3B35A7F32396AC6B7444566327DBB4DF06FD9616744F4D3A397EB3B0A3FBA8D763702883ED742FE5CD24146D8E353ACCF811C806AE09914D8446E93840FF4D6C963FF32BFB6AB015D1D3B0C9A0968776F021F21404B6260CF84A14F35180CE20B5E85BDA2EC91FD +311 +5A7DBA7E5705F4F0F97AF26CE18E3BA078138202400A62930FA6CC7882F911A92F33E547E64990B0F27323D73B6222863F86425153FA8009361C675554C25382CE148420C8DCC47A20122806CA178A0918C14CBD33440289078A00EC6070184CA9907FD0A1270478E0B325B67C2193694EDB7DD0F3C238447C8A11485562FB +311 +4902134E6AC952FD5320A4F7C780882DA9684285CD81D278C0E8FF8DEC9F45D22DC3C2CA99C2728110888799575B6834BF22B0F01EDE72D7F21B672C40F0A972999E2200B7C91403F9BB3D09C01990819238CBAE5E7510D7D57450507E3DB04AAA0A3C280064E0775380C8C16EEA4834346A04BF0CE847B4B3AF760D06D24B +311 +BB267C32E2C9257DE5EB748AD101AF1FD33265E2B674EED8C01A0AC901392211011AC810560F77778E85B13BAFE3E25C95B70919A4862C15928BD8989664AD8638101D009A80F00BDC41AF27602A4BDA0C077E550048E7F1011410F01405045E1C140B4D0E70E0F6E034171C3D6FD12004FCC1FA304312518910356628A4A3 +311 +26EC9ADF5DFFD1B2C0399503F14B4F8E3E0E4E39A06ABCB56A8014687E86E462BDDE5124615ECDB412B7314F62E6E0C76ADEC0F717B360E741960104CF1706CFA18E0605004B01AE007869B095ED92144A807841EFF2811C047889A04901C809062057192688C92346F97F279449F89B113500BAD282D1DA80A55C27EFFE02 +311 +C8D4F395003F285B617BBF0831F49B055342DDDD414378E8888E92C16789F269A27C9A221FAA4A0DFDDB9F935B2ECC04DC51481558A69301E0460B02665AC4DD30C03D480866C3409400051811876014C0F294C542821AB045011A3E3F09001FF304E3A0BED05CC11A811B865001769507FC01ADC611F400CF68C7B093606E +311 +30F3C7E0F00C1D10C31951C1E2D7252181DA00345842A19130715C736EC9ECE686A712FDB31E4D3E50AB336E5666D7B212C0113C4A4406029709B43D0228F3FBAF49921B19CA0C82A2D5BC4A2079809240F37D3E10F9637607C3983F0458508A98B8B4EFC92AC13530180CF55359500080061DF59B98BB3FEACEE881DC8127 +311 +F182A885A86FB12B43C590A4380504E32305E3148BBEEB2D2782029765428092545BA5C2C681FC5F8E869C0EE1034A822FF09A12C94084505AA868080303473F8161F7AA0A6610745E280BE4427FB770106F8800EADABA19F453210435BDB2348471B13B65F2FCB554827632C4C44467333E4127095D22092ED49200993041 +311 +3251B5408345065065E415266E20279A40B3F520370BE2050C8360E6BB4601C1673B9BFE007EF5200B6483CD195400A783E6DEA0653515B0FCE8E86D1618FC1EFC15C2E727F24F2A2DAB57326D8D0877D4E298894E7A0C3C7D9CE8A0E2D17AA2020FA1097D6372F2A9F955060FDD467AD0426368C24A8340FD0D6687A76316 +311 +DEF5179ED9042005A2BF02A5DD810A4DEFA4A8F700EFC50FF4FB8C06410F0303C106ADF8852ACC6A2CA9046E9ED070739339857222CC009E206479886EA26227BF7A341A15C351A8404A6C10080A2140FA4B4E8D9B9A11645899332363FD69887F436A660566964250FD752E787B64BCF8E6C8190DF8EA0C854C062D8A5A13 +311 +46F810414313E606ECA0AC3A01D6928544029D5F42E202C0CB386F880F7842A31287061F32F3CBE09F2950783394F2F2B23D85386C6F51943E99DD10C8A0000BA9569A14805693274BD0E4F4DC3F28E331EEA91C4F33ABE057889BFB92819187840A08E57A276A8BFCB75B0342668C70C565C8059996D209C2800941A21FB8 +311 +2B2F520BC2E6FE6F1A8827043DE17000DACC8193E78BBB8DF1467978C06F6AFE986123E3A95272CAC122046F4C65C4B88FED2F1CD1D918F7CDBF8903BF1A90057D42F4DC133AF804ACBB58446A0DB78806FC053FA1E45D0AF1112613CC0DD976C5E70AD3282F42725C0D02AC8588DE451B1C01ABF063E7748A3882F0DD484B +311 +B78D037F9812240EB88B6034C0AD53E5116D4C6D920C6A89F084E6D0598AD7EB6930CC7B293E27A666E5CDFE9A3FA52FEB3C97976FDAAE9A60008FCA6B33099CF9880D35D419FC687D424378E3099441E110C5B3C6DC311E6653514A67A530D863326C4D8430E0C28024803B5B069B0E60C10EDB6DF087034171DF01F1F340 +311 +4B27B1056D8C0E56E7CA6056E7798147BE4C2F01CED5987E413AC6A724876DE3F599E0601CE7B9CEF3BEB3671E12DCE8AF9631B8031D3F360B6955DC2342B2A0E4632A00264C0DA002220CFEC3E10D9BADC8904D88DC51928593AA16C91DF6FFF82B3234404C7214D0F8608E0052283EFB2B0563F1D072936C4017706010BC +311 +F1B16CDE0C1FA9C777E44E1F5259B0C9BBC8794A82A6C182A3AF56B16921405351FDDC91B5BAAA617860E8D76C97C377FE701A4EB4378FA97C2C8E3CC8950886C6FD93AF70A1F5F676B7ED16CBC56AF5D09110EEB8607CC08A795882358280DDB98AFFE7087C6EB593D62F041CDB4018935238E73F1098100D0C8769818F77 +311 +7057F64C703C6530E142FDF5C837AE1CF66C94C4887D3A3726AB990DEA248F73B5D32C8E04F6714B1E67C53FC52040252E605B322407CBF8C7F05453462A295ABF4D95592DDD76AC23512E9A2DF964715C80DD752CA8E263AC36F02C3C28A133EB22AC8D099BDEFDE28C3E8FFEE3815D5D00C17C00511058354D62443C1A54 +311 +6280E43572A9C661A34FA5891F8E7570608C8DF21DF51DF9D2A84D4501F41B8CD4F4C9DEB2F901E810C0E4CEB6EC08DFB06341C864CF8D0EEE779A606545E1E64AAF30A4324C20FDD3BD558BD966BA994FA915CD162B1978642AD01694E533EC190368A68234657085B5F88E27A0805E04B8BB6A00A51646EE3C10A50FF007 +311 +FF410F1963CA69BE2002F0F902E701AEC995FD41F83A3F0C3809A3288A083003A6CC2A20E6D703EE48E3777AC07ADD51EB6101603A9FCF17B3D5928F6D742EE7E4CF38AE2B03C5FB39C81D7B2978FAFE85AF3D2710B0582C970F0FEB0E4D1103B8BE2B4D560CA10002FC8F334C891C07B44FE06B2E3ACE5E1E2D1FC3220311 +311 +0ABF9CA0E8381F68EC3C06701328E5A38278A5FCD944CEA5283DA933DF2A2448BD23F1C5D8BE04CC2DC3B43B3EEC29F8B5FF926D11D3E97EBF7FA1BD1E5E5F5FE6D3D972F548547783146ECD84873F377C5820F7F9FCE5E07378D6CBCB7E036DF7F7104079A05B77C6942D1BA95D47424BFC3DB6411009A42E207871B7EE9B +311 +06614BBD20F22F7523FB985F3F7068E37600273A3ED0C1CCC380F6EC4AF01CC1CF95E4848B7BF950AD14C44F10460221E02D21D01DAE800F323704C00035DFE97CB37F797D3D1C0E4FBF35EE1E5E9E0E879FBF3DF6F474780A01FB3DAF01FE0C0798218007C2090A3008BA7682A338F4A8804A06CBFE6A80CEC766F49853F1 +311 +5B2F45FCEA3F8250012841315016E75E797EFEEC4ACA6C79F515CF1738F7C36E2406071051043817C9E8C5888D49D0332E800062FF54FA562BF7446CC0BFDFBF8603D1FEFCC9F7FFB5A7F000430755C2D3F72F2D02A022820897ABDD44594475BDCCA4A10AF34C06B08B4AB58BBFAE30999DC66C7CE903A83CF8EB006EEEAA +311 +063430F84B05F0ECF644825F5E95073870E72A0771AB89B080022A0C5A9FAF34C89286257FB7BEA000EC65B59750C68E0815B0D9834B15606328F80709DE09018AC2A7817F83F96DB3D562C10A0A31300230CD4200B87F85808BAF64D04600254047F9C14DE93464009E7F5AABB4FDD6D55142A2C0BF1541FCE19C20C899BF +311 +4F76AB54B84CB97F88F48ECC029FD253F0C70DF4816B9AC94BCBD653B1A283C4001A0337955E4AFED3FB790B6B1F5EA0B5514074103A38D84280EE0F5F9BE974EAB2D16AB1EA969684B6E4166CA28264B300474C7308D20013B204A65F82970718D05678B3315D442E1C0A327E2F56556040C005D2FAB1326A68A07507C9E4 +311 +6A3648555A7080F5F50219A00E6222E3E0862CE95B5680930530742F1D041805E69B788161F015944D041182B861A2C17F3AF01CF5BFDF6C343F9171F5B004BF59C016719164B888EA206A02AD05E8464D06B48E4381A0E9345FD171625AC22198F57C003BEA5510F81FF78D31C9B033D0030000000049454E44AE42608250 +311 +4B0304140006080800FA902C5C28BB58AF800100009E0500003D00000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F536368656D61732F436F6D6D6F6E536368656D612E786D6CBD544D4FC23018BEFB2B96DE15493C78601010A34B880709DEDFB52FD0D8B54BD70DF6EFED +311 +3AC0B12E6442E2716BFB3CEFF3D18E26FB440405EA8C2B1992E1C323095052C5B8DC842437EBFB673219DF8DA659866649B798C078B48AE6410122242F2A4994AC7F93815DF85C049C8564CA0A901499DD886B2EB9B1E02448F358701A9235880C49A0119892A20C89D1B9FD768815CAD268CB5E0355B40B1E47F3E37A2020 +311 +464BED06AA57CE8FCC20C3C3446D46761A2632A8C1283D07031EFF2AE7CCB1BFEEE916E406DFAC8E36FFD99A9D60A6944090EEDC3B670C7DC13DE86B6B2C5C240D6E503BB85ACD579D513F1B9F9A69DC9CC22AFA80C426D40AF0B21EA168559156B6276F0F726A6BFF04DCD513A87A62CAD41FB24FCB2858B3952E3D852084 +311 +DA25B9303C15687973CC8E8AAE11DF2836C38C6A9E765E8C1BA1BFB1DC29CDFE518C8B5A7655A4ED7E77291ABEB80DBD82EC866ADE1B8D05AF9E35CF09D7A061F38A986D9EC412B8F0F65E5D81534D9B231D1E5A8FE577A241F3A5FD01504B0304140006080800FA902C5C1004A04F380500005C1700003E00000030383942 +311 +334632342D433235372D343936342D393134422D3732423032303039384146382F536368656D61732F47656E65726963536368656D612E786D6CED585B6FDB36147EDFAF20F41EC7F69A2005E214768278069665709ABE0A3445D9DCA80B44CA89F7EB7B0E2FBAC4B2A32643D10E33505411A9C373BEF39D1B2F3F3D27926C +311 +79A144964E82D16018109EB22C12E97A12943A3EB9083E5DFD7239558AEB07B6E109BDBA7C5CDC902D959360CE535E0866DF07A7579733AAB85D5AF234E2C51DD5B081CA7A87DEE56E47E2D6689E735AD0947194500A22A249308DB6F82682A3782C52A141BD80E4E54A0A3609622A150F48C16994A57237097451C2DF4627 +311 +38529D3AC5FCFFB5B401988BC78824973CE1A9A628D91CB968BDBAC335B9A4BB379C6ABF5D2474CD7B9F773F7F78C349F055EF13FE2CF856F0A7379CE2BEBCCE6456F8E316A9E66B5E18E4AC77BF5812F5937FDEF0F5BFE3E3C785576D96659253EB54863A87AB5D98ADFEE24C3B8E38FE48BAE2C062631799EDC8BDDD833C +311 +6E88585B9287340B23AEA990CA49B1A473421E81F856D06D9125E45E6F001C4F7F85D6DECA8C6A835753A250DA50DF92F743409CBC3BFA4C6EFCE2618D302A0CEDDB264D93950002937BC66489A18D0A345DD650415124BE376A745EA9F0E016108E328D14C979C1302CD6BC0A4191B2C2C49112FFC0DB51401288D6A44C26 +311 +C1B87A160AB6A11E5BD862514BE8B3DB750607BABFF6F781D6A74EED6EA7AC28FB3BA68C87AC94B2138A99DB41AE7147A71F56659287340123812054CAEC8965690A74E111C5BCA7260158B0963EC50C07E38FEDDFC5C5C70AB6A915F446D44E46C321E46087E23E221E2BC0DA6EB440EE6F44E80CE5AE2E2D2F31AD7AB71B +311 +8B139AF730773909401FE0D8DC3FCCFCC3D438DC1176062076C3CB4A9D953ACC72CA84867CDA0361E0910F4EF3B109A07D332211C72556825745A215835F47678059E337068E3ACB0E2EA2B507175B0818FD1082EB4D26186F85BAD33464988F1420E1B9E43D522F8452A450106B04F01362BFF1B2BF5059B60F687C9F663A +311 +54396722163C7231012E7480FE916910E6572B6D8F4A54CBF92C5CD324A163C8508058D3F16A399B13B348C6830FB5FD47257A1B8D2CF08253EE776B3A72D782D895363D96020B6C18D3C86359B3C6D45E728B4B9D716893D091E4D533045F495D2EFEF633FF5A660A520A5790765FE52E12F0AC82685E7FFA0398D6552885 +311 +0A132894DDE9F837B1DE48F8A74D487795A482C7122A6DAE377BDC5DC212A465ECD8B03E7E2E208EC88DD9DA89456CFBC477FB798C74389668AB1A75C820AB7568FCBE0B5F94DC9AFF0D038D9F77E49D45B8278FC7177D0DDCE732FA0BCDDB42720FA90E87115FF76375C5696F368AF83103F6A5911FFF03561EE06AD10ABE +311 +933AA9DEC398588888137017449E09C377051FCAEED1E8BC3BFA9CB27DA2CFDBF533459F374FC0C4FDECCBF3E06CDC6874E0710421EEAA6CEDBFEE60EB913607436C3F5BBF713F6F42253B9A4A0FD64C08416FA986EB02254B1846D82E7CE2584EBE31E340E9A8247483F07D5B84AE3A5AE0D4C5B202EE585468BA84105B1F +311 +5EC00C16FADB133FB7399F390FCF245CBF9027A137FD26D1D651058D44D9B331A93985CAC2046CB4ED9E0314977128A42C13DB06879A273052525D16BE833B8706BD1269FA69F2B9B109BB55D30D37679986D85848B86F026CF21E74809100180B0D280C36F6015A7DFBD06AEB6F8D503BDCD7DD6DABBBEF54E1FF5EDF0E3A +311 +D53C03509B5B816FE9F51BC8026F44DAB82BA989F200C4220B24166C3037854094FD46C5648D9C42F8B07E53687D824917FED3CE56F3FBA68BE3C6853FCD64F4A00BB85831B1243346654A134805AF5CF39A9DFE22C9906A6EAFE8303A5F4AC4FBE637489CB62EA59B9D529255F326CCC28ECB77F812A7D6E63DF957504B03 +311 +04140006080800FA902C5CF702076DC3010000E60400004500000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F536368656D61732F52656E6465724D6174657269616C536368656D612E786D6CA554CB4EC33010BCF31596EFF405481C9AA2A64851255E4A816BB438DBD492 +311 +6347B15BE0EFF1236982021512B925E39D9D9D59677EF3510A72C05A7325233A1D4D2841C954CE6511D1BDD99E5FD39BC5D97CA9359A0DDB61098BF9CBFA961C4044344599637D0F066B0E22C074BC98C7A0319C58A9B254B2435ED23BC2F388AECB4A6089D280B18D139496815152EDDF046711DD82D048498D902B293E23 +311 +6AEABD7DF74D5D839F69EE1D9F48E1F3BF448FC9E6BF144F351E38BEFF9D662D0D16587B77825FAF2195BF515C395B563BC5197A0AE68DCF363BA831CF7C7C8D7F0DA23D42898037B451BA833673DA92BC82D87F636ACFFB0CEC96F4EA30EF9A0FEAB85D91CAED89348D80E9B178DDC3ACFC71D06F2528A182138DD8672E4D +311 +C6DC57CF91467432BA985E4DBE3DB399079353607C0A5CDA0B70D4E65A122FA41BAEEF6C272908D315B076451BD55EB0FF9E092E11ACF8C6B5306028F9D5F15EB95426D31532BEE5D6EC700FBA0C1E94211D7ADC8341143D429D2671564059C2EC72108B4EE3847890CC4697DDF8A708DB01FD7AD8209A41EFC2DCFD7063A5 +311 +04821C7869545188D6C16DF801342CCE6B276363DC8EFA4AFD0E86ED0677C3B77747C7FD3FD617504B0304140006080800FA902C5CF6BBC05C4F000000570000004700000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F4173736574446174612F41737365745461626C654F +311 +66436F6E74656E74732E62696E53616060307275B670733573D33573021226C6C62EBA9666E66EBACE8E4E66AE2E6EC6E66EC626424075B98925A945998939890505A989458979C9A9404130E00592EEA97940D9E4E0E48CD4DC4400504B0304140006080800FA902C5CC55C66365600000068000000450000003038394233 +311 +4632342D433235372D343936342D393134422D3732423032303039384146382F4173736574446174612F53747265616D56657273696F6E5461626C652E696E665D8CBD0A80300C06F73E4B29FE6CDD8A2E82A083B8B7F209014925C9FBA3AEAEC7DD2555D896CB85E51C2A1BD834F6A1F56EC4494C4695278364ABB24ABD21 +311 +46F88CCEBB89D5321FF8F3F43D672A3B44DF3CB6A1710F504B0304140006080800FA902C5C93ABB57937010000A20400003600000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F4173736574446174612F636E782E786D6CCD94314FC3301085FF4A648931761209A82AC715 +311 +82A51348540C6C57E7D25A75ECC8BE20F8F7D86D0650115387AEA7EFEE9E9FFC4EAE3E075B7C6088C6BB96D5BC62053AED3BE3762D9BA82F17AC582919BCA71F182B1C0CD8B25C664AEE829FC6B9D4610F93CD556BDC612E3EC488B481ADC5E7FED13B42479115DA428C2D8B7A8F037098C877180FBC03025EF380D14F4163 +311 +9A4466C079920E08841D534DD5DC95555DD6CDA65E2CABFBE56DF32E452695DC7A6F67DEA465C18F374DA54F7B99AAA4C88092533033955FC3D45F2AF9D6382912A964A4905C993BE86B4C1D308ED668A0649EF09A90CA04210C529C60254576E197174FD81B6772CB3A4903F2E12509C44006AFD093FFD45EDE9BB58B044E +311 +E3353B72AEF1F23EBC1E7FD1DB2996C7DC5C5F5ACE3572E3FA0B64451CCF498A4EBE2EEA1B504B0304140006080800FA902C5CA8CB9E75E7000000600100006700000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75726365732F32454338464536462D36423646 +311 +2D343333442D393637462D4341423645444633374633342F7468756D626E61696C2F302F636E782E786D6C4D90C16EC4200C447F25B2D4630289D476B522EC4FECA9978A126F8A966004A66AFFBED072D8D358E327CB33EAF27DF8E10B5376145698270903064B9B0BFB0A856FE309868B5689881F3018823970856683567B +311 +A212BBB5E1CD14DF5CEFC2BD9B3B064CCEBEC7B0C360BDC979856C3FF13093294C1BE6FBB41936D33C25CC5492C57A80DD81FD804D681837D08B5C5E46398FF3729D4F67F97A7E5EDE9468A4561F44BEF32E30268A4F8BB454C750FF914A3440AB925CA75A08D00FCF2951975A654E357F87F82756C8C4E89D355C6B126419 +311 +79AC109A43897F582BD1F256F92BA36AEB46FF02504B0304140006080800FA902C5CA233C2345D000000800000006500000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75726365732F32454338464536462D364236462D343333442D393637462D434142364544 +311 +4633374633342F7468756D626E61696C2F636E782E786D6C4D8B490E80201004BF42E6EE76F3C0F216234B883063108CCF170C074F95AE5473F5C4C06E932E4F28601967600677D21E9D8092EDB002539227A2FCCB80E1168D80A6417297A89C5D6963B7129A0D1E8F2EE73AA7B62BBEB8B27DE50B504B0304140006080800 +311 +FA902C5CBE89762363000000880000005B00000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75726365732F32454338464536462D364236462D343333442D393637462D4341423645444633374633342F636E782E786D6C4DCC3B0E80201004D0AB90EDFD75167C +311 +CE820A4A845D83603CBE602CAC26799919AEEEE0D965E2E908050C6D0FCCE04C8BC355404EB6198129C92351FAD580A10E464065907C8D948F8F166375F655BDC3FDC3B4E530A176BE7057BDC43B2A593FE403504B0304140006080800FA902C5CAD5E31BD7F000000A30000003600000030383942334632342D433235372D +311 +343936342D393134422D3732423032303039384146382F5265736F75726365732F636E782E786D6C4D8CCB0AC32014447F45EEDEBE0C2605353489F73F426382D468B1B1F4F3AB258B6EE6C0616644FB591D799BF8B2C14B381F4E408CBF87C9FA4542DA66DA00699588216C7F35207E5C8D84A241892586F4DCD564E631B9 +311 +629DF58F5D5E74DFA0E6487997A3626CA0575E23ED6F1DD703B21A599517C732C9F8FD65967BF505504B0304140006080800FA902C5CFA435F1E0B010000550300003400000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F536368656D61732F636E782E786D6CCD93BD4E04 +311 +2114855F65426239C04CA26E360C5B5858D9A8951D327777C90277C28FD1B717468ADDC44E8BEDE0E4CBCD3907AED87D3ADB7D408806FD4406CA49075EE36CFC612239EDFB0DE9765204C4748691CE2B0713A93291E210302F4D9A61AFB2ADAA35FED4C407740EFD8B3E8253A4D356C53891B85EA9CA096788273AABA4E840 +311 +0344CC414399908C8336410750096622473EDEF57CE887F175D86CF9FDF6767C13AC9252BC23DAC61B9F20E07233728DE5E88B212E5805A4C8C134AAA620F2DC1D2D7D08560829620AA58546A6AFA5906A59ACD12A95B2D80AFE3052B01AF622F2237808465F6BE60B7BFF16FA19FC0CE1A9BC5430CA5E6BF6DF5CFEAD02B6 +311 +6E40F9067521E437504B0304140006080800FA902C5CE3603EBE7A000000C20000002C00000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F636E782E786D6C6DCD410EC2201085E1AB90D9DBEACE05D09878023D01A1D34A8419C380F1F82DA68B9AB8FDFEC93C3D7C52546F +311 +CC12980C9CBA232824CF63A0D9402DD3E10C6AB03A3397DD192872090D3406ABE7CCF5B5D18893ABB1690CF4DCF02282E5EA8A5BB96FFE536F285CB347F95BEFFE81C9ED5AFF9D5B1FB575BB00504B0304140006080800FA902C5CAD30C3DC7E000000A300000007000000636E782E786D6C4D8CD10AC22018465F45FE7BCB +311 +99350575CC60EF319A1B92D3B0397AFC3476D1D50787EF1CD97D568F769BDE2E0605CD8900B2E11127171605799B3107D4699962DCFE6E80C2B85A051583964B8AF975A0C9CE63F6957A179E07245C98CB4019BED36B8B99B8312C1A66704B0DA18408DE0FBC18E7AA94F9F5CAD6BCFE02504B0304140006080800FA902C5C +311 +CA1DF9C9A900000073010000130000005B436F6E74656E745F54797065735D2E786D6CA590410EC2300C04BF12E5DEBA70400835E500FC800F84E0B411AD13252E2ABF27A55740421CEDDDD9B55CEFA7A117778CC979527255565220197F75D42A39B22DB652EC9BFAFC089844F65252B2630E3B80643A1C742A7D40CA8AF5 +311 +71D09CC7D842D0E6A65B8475556DC07862242E78CE904D7D44ABC79EC569CAEBA537E3521C16DF5CA5A40EA17746733E0B6615DE7217475F386F18B9481C510F1F021CD9FF027EA0E1F5C4E609504B0304140006080800FA902C5C3DEE336E64000000790000001B0000006175746F6465736B2D64657369676E2D7061636B +311 +6167652E786D6C35CBC10E83200C00D05F21DCA56CA76D41FC96062B120735B69A7DBE268BB7777961F8D5AF396893C2ADB70FE7ADA196782C2DF776D7A97B5933C430F15651E5469C55D70F80A4992A3ADC954792C525AE70A1E4D6AD9816CC044FEFDF01FE3FDE907802504B0304140006080800FA902C5C296A043AF800 +311 +0000960100003700000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F4173736574446174612F636F72652E786D6C8550CB6E833010FC15B477037680A0C8380A89F8829E7AB36C875A0936F2A3EAE7D70E546A4F3DED6A76766677E8F96B79169FCA796DCD00B8ACA1504658 +311 +A9CD3C400C77D4437166D4591B7ED1A0307C51036418189D9D8DEB0E096B8232193556AA1DE4DEAB008578A666002F3ED4C24B1E4362F847B972F1E0B32A71B9F1188D51CB7D55CBA4A6EF5A396097AEC1538D6BD435ED849AE36D4497911CD0B51FA79160D2B6E44AABBCCC68D0CB8FBB708A072581919A74A8C6089337DC +311 +9FEAE3A925EFB4CA4C467D70E9E7DD347F97ECF2D5371E38ADB6E91FD5B8CAFF55A336E14076D56DC303C3E9C8D780D12AA794CA2BC25473A2EC1B504B0304140006080800FA902C5C5D6B965CF30000008E0100006800000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F52 +311 +65736F75726365732F32454338464536462D364236462D343333442D393637462D4341423645444633374633342F7468756D626E61696C2F302F636F72652E786D6C8550CB6E833010FC15B47783ED004191711452F1053DF5661987580936F2A3EAE7D70E546A4F3DED6A76667677D8F96B79169FCA796D4D0FA4C4502823 +311 +EDA4CDDC430C37D44171E6CC591B7ED1A03062513D6418389B9D8DEB0E496B8232193576523B28BC57010AF94C4D0F5EDED5224A114362F847B90AF910B32A49B9F1388B514FBB544FC94DDFB472C02F6D4D464C306AEB6644F5F16D4097811ED0B51BC68112DA34F4CAAA2CE62CE8E567BB744A043501A798B6081344E83B +311 +E94EF8786AE807AB3293331F5CFA795F9ABF038E59B5A17FDCE23AFDEF16B50907BABB6D0A0F9CA4E35E03CEAA9C4E2AAFE852CD49F26F504B0304140006080800FA902C5C49A43538F9000000960100006600000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75 +311 +726365732F32454338464536462D364236462D343333442D393637462D4341423645444633374633342F7468756D626E61696C2F636F72652E786D6C8550CB6E833010FC15B47783ED004191711452F1053DF5E68243AC808DFC88FAF9B50395DA534FBB9A9D99DD1D76FE5AE6EC29AD5346B740720C99D48319959E5A08FE +311 +861AC8CE9C5963FC2F1A645A2CB285040367933561DDA1C1682F7542B519E50E0AE7A4876C9863D3821BEE7211B9083E32DC235FC5F01093CC49BEF1380B418DBB548DD14DDD94B4C02F75497A4C30AACBAA47E5F1AD43978E1ED0B5E9FA8E125A55F4CA8A24E6CCABE567FB60A5F072044E31AD112688D077D29CF0F154D1 +311 +0F56242667CEDBF8F3BE347D07DCDFC3F2A9859A59B14DFFB88675FCDF3528ED0F7477DD140E388947BE069C1529A5585E11C69A12E5DF504B0304140006080800FA902C5C2C0549AD0D010000B10100005C00000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75 +311 +726365732F32454338464536462D364236462D343333442D393637462D4341423645444633374633342F636F72652E786D6C8550CB6EC32010FC158B3BB6C13676234CE447F8829E7A4336715062B00C54FDFC42E24AEDA997DDD530B3C30E3D7FAD8FE453EE5619DD0294E620917A32B3D24B0BBCBBC2062467467763DC2F +311 +1A48B458650B220C185D76E3B7039A8C765247549B591EA0B0563A904C8F30B4C04E37B98A54781718F69E6E62BA8B45A6287DF118F55ECD8754CD619BBA2AB903D69112F11CE590941587653DF6B0EB710187A6E73D46B8AAF040B32866D4A9F5C77DDAA57072060CE798C01C4184DF5173CAEB53853F6816998C5AB7879B +311 +0FD3785DA05F86865F0887A40FA52C8A11BE919AC3A1EBC965E445CD8B92662FE11F43BFCDFF1B7AA55D810FC397C20286C2FF9F0F8C6631C0D09EE9861EC366DF504B0304140006080800FA902C5CBD366367FA000000960100003700000030383942334632342D433235372D343936342D393134422D3732423032303039 +311 +384146382F5265736F75726365732F636F72652E786D6C8550CB6EC23010FC9568EF4E6C430021C78850E503AA9E7AB39C25B52076E447D5CFAF0DA9D49E7ADAD5ECCCECEE88D3D77CAF3ED107E36C07ACA650A1D56E3476EA20C52B39407592C23B177FD1A0B26AC60E0A0C524CDEA56585B4B3116D41AD1B7105550818A1 +311 +D2F7DC7410F407CEAA56296646B8D58BD2373561CDEA274F8A94CCB84ACD98DDCCD5A00779DE6DD9401925BB6D3B90EDFEA527E79E6FC8E5D00F3D67BC6DF94534452C4534F3CF76ED51451C4172CA778432C2F81B3B1CE9FED8F277D114A61421FAFCF3BAB47C07F215834B5E6310CD73FAC7352DE3FFAEC9D8B8E1ABEB53 +311 +1140B27CE46320455352CAE51161AE2551F90D504B0304140006080800FA902C5C67081977F7000000940100003500000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F536368656D61732F636F72652E786D6C8550CB6E833010FC15B47783ED008922E328A4E207DA536F96 +311 +71A89560233FAA7E7E6DA0527BEA6957B333B3BBC32E5FF3B3F854CE6B6B3A202586421969476DA60E62B8A3131417CE9CB5E1170D0A2366D5418681B3C9D9B8EC90B4262893516347B583C27B15A090CFD474E0E5879A452962480CFF2817211F62522529371E6731EA7197EA31B9E9BB560EF8B5ADC98009466DDD0CA83E +311 +BEF4E8DAD303BA9DFAA1A784360DBDB12A8B390B7AFED92E9D12418DC029A62DC20411FA464E677C3C37F49D5599C9990F2EFDBC2FCDDF017F5DEFF4ACDA667F3CE332FEEF19B50907BA7B6E0A0F9CA413D7016755CE289535C054739EFC1B504B0304140006080800FA902C5C9C0AD79602010000D80100002D0000003038 +311 +3942334632342D433235372D343936342D393134422D3732423032303039384146382F636F72652E786D6C9591C16E842010865FC5CC1D05D45DDD209BDA649FA0A7DEA8CC5AB22B18C1A68F5FA8366D6FED09F2F3FD33FC33E2FC3EDDB3375CBC71B6039653C8D00E4E1B3B76B0862B69203B4BB138177E60905935610749 +311 +0629C6C5ADF32E0DCE06B449B54EE32E2AEF314036DCE3A5033FBCE2A472B58648F85B3EABE1A646CC59BE715204337D59870555400D92537E209411C69F5873A2C753CD9F45914829566343C9F76638BDA0CEDC1C62249075298AED3962ABD13B6474FCA4B91A5C40D2A6EDCB0BAFC823AF8FA46A0F156959D59323EF29A7 +311 +B46D1E2E4D2C12CD52F8B0C4D1EC45D210FE6ADF8CBFA2ADB3FE67B4CDE141B2EF50459AB314C5E712E29976223F00504B0304140006080800FA902C5C4218199307010000B201000008000000636F72652E786D6C8D50C16E842014FC15F2EE28B0EA9A0DB259B7F10B7AEA8D0A6BC92A18C14DFBF785D526EDADA74766E6 +311 +BD19869F3FA7113DF4E28DB30DD08C00D2B677CAD8A18135DC700DE82CF8E25CF8250364E5A41B4830083E2C6E9D77A87736689B50EB94DE41E9BD0E80FA313E1AF0FD879E6426D71015FE9ECDB2BFCB416734DB74820733FDACF68B96412B108CB00A138A297BA5F5891C4F257BE379520ABEAE46ED5646457773337A0171 +311 +A90ADA114A7055941D2E8E2F2DBEB4EC80AF75DBB58CB2B264579EA765C17D58E29FF7233167405E3E922FCF374AF077E7C65D104329E4ECF80582F03C117F42AFB3FA476863C381ED07B70D0F82C6404F221AA706E378D61B676A5B7C03504B01021400140006080800FA902C5CC7F4310E2B010000A80100004F00000000 +311 +0000000000000000000000000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F4173736574446174612F446566696E6974696F6E4974657261746F7250726F706572746965732E62696E504B01021400140006080800FA902C5C3BFE46D91B0100003002000045000000000000 +311 +000000000000009801000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F4173736574446174612F496E7374616E636550726F706572746965732E62696E504B01021400140006080800FA902C5CB5A795FFE3790000DE7900006B000000000000000000000000001603000030 +311 +383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75726365732F32454338464536462D364236462D343333442D393637462D4341423645444633374633342F7468756D626E61696C2F302F67656E657269635F706E67504B01021400140006080800FA902C5C28BB58AF80 +311 +0100009E0500003D00000000000000000000000000827D000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F536368656D61732F436F6D6D6F6E536368656D612E786D6C504B01021400140006080800FA902C5C1004A04F380500005C1700003E000000000000000000000000 +311 +005D7F000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F536368656D61732F47656E65726963536368656D612E786D6C504B01021400140006080800FA902C5CF702076DC3010000E60400004500000000000000000000000000F184000030383942334632342D433235372D +311 +343936342D393134422D3732423032303039384146382F536368656D61732F52656E6465724D6174657269616C536368656D612E786D6C504B01021400140006080800FA902C5CF6BBC05C4F0000005700000047000000000000000000000000001787000030383942334632342D433235372D343936342D393134422D3732 +311 +423032303039384146382F4173736574446174612F41737365745461626C654F66436F6E74656E74732E62696E504B01021400140006080800FA902C5CC55C663656000000680000004500000000000000000000000000CB87000030383942334632342D433235372D343936342D393134422D373242303230303938414638 +311 +2F4173736574446174612F53747265616D56657273696F6E5461626C652E696E66504B01021400140006080800FA902C5C93ABB57937010000A204000036000000000000000000000000008488000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F4173736574446174612F63 +311 +6E782E786D6C504B01021400140006080800FA902C5CA8CB9E75E70000006001000067000000000000000000000000000F8A000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75726365732F32454338464536462D364236462D343333442D393637462D43414236 +311 +45444633374633342F7468756D626E61696C2F302F636E782E786D6C504B01021400140006080800FA902C5CA233C2345D0000008000000065000000000000000000000000007B8B000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75726365732F324543384645 +311 +36462D364236462D343333442D393637462D4341423645444633374633342F7468756D626E61696C2F636E782E786D6C504B01021400140006080800FA902C5CBE89762363000000880000005B000000000000000000000000005B8C000030383942334632342D433235372D343936342D393134422D373242303230303938 +311 +4146382F5265736F75726365732F32454338464536462D364236462D343333442D393637462D4341423645444633374633342F636E782E786D6C504B01021400140006080800FA902C5CAD5E31BD7F000000A30000003600000000000000000000000000378D000030383942334632342D433235372D343936342D39313442 +311 +2D3732423032303039384146382F5265736F75726365732F636E782E786D6C504B01021400140006080800FA902C5CFA435F1E0B0100005503000034000000000000000000000000000A8E000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F536368656D61732F636E782E78 +311 +6D6C504B01021400140006080800FA902C5CE3603EBE7A000000C20000002C00000000000000000000000000678F000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F636E782E786D6C504B01021400140006080800FA902C5CAD30C3DC7E000000A300000007000000000000 +311 +000000000000002B900000636E782E786D6C504B01021400140006080800FA902C5CCA1DF9C9A9000000730100001300000000000000000000000000CE9000005B436F6E74656E745F54797065735D2E786D6C504B01021400140006080800FA902C5C3DEE336E64000000790000001B00000000000000000000000000A891 +311 +00006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800FA902C5C296A043AF80000009601000037000000000000000000000000004592000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F4173736574446174612F636F72652E +311 +786D6C504B01021400140006080800FA902C5C5D6B965CF30000008E01000068000000000000000000000000009293000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75726365732F32454338464536462D364236462D343333442D393637462D43414236454446 +311 +33374633342F7468756D626E61696C2F302F636F72652E786D6C504B01021400140006080800FA902C5C49A43538F90000009601000066000000000000000000000000000B95000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F5265736F75726365732F3245433846453646 +311 +2D364236462D343333442D393637462D4341423645444633374633342F7468756D626E61696C2F636F72652E786D6C504B01021400140006080800FA902C5C2C0549AD0D010000B10100005C000000000000000000000000008896000030383942334632342D433235372D343936342D393134422D37324230323030393841 +311 +46382F5265736F75726365732F32454338464536462D364236462D343333442D393637462D4341423645444633374633342F636F72652E786D6C504B01021400140006080800FA902C5CBD366367FA0000009601000037000000000000000000000000000F98000030383942334632342D433235372D343936342D39313442 +311 +2D3732423032303039384146382F5265736F75726365732F636F72652E786D6C504B01021400140006080800FA902C5C67081977F70000009401000035000000000000000000000000005E99000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F536368656D61732F636F7265 +311 +2E786D6C504B01021400140006080800FA902C5C9C0AD79602010000D80100002D00000000000000000000000000A89A000030383942334632342D433235372D343936342D393134422D3732423032303039384146382F636F72652E786D6C504B01021400140006080800FA902C5C4218199307010000B201000008000000 +311 +00000000000000000000F59B0000636F72652E786D6C504B0506000000001A001A00210B0000229D00000000 +310 +504B0304140006080800FA902C5C000000000000000000000000370000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F617474726962757465732E62696E504B0304140006080800FA902C5C000000000000000000000000350000006662782F4534453236334132 +310 +2D433737452D344133342D383533342D4442354433303643464437452F76657274696365732E62696E504B0304140006080800FA902C5CF270F1330600000004000000360000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F747269616E676C65732E62696E6366 +310 +60600000504B0304140006080800FA902C5CB5A795FFE3790000DE790000420000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F7265736F75726365732F322F305F67656E657269632E706E6701DE79218689504E470D0A1A0A0000000D49484452000001000000 +310 +010008030000006BAC58540000000467414D410000B18F0BFC6105000000017352474200AECE1CE900000192504C5445818181B3B3B35A5A5A4848486060605C5C5C6464648383835E5E5E6262624E4E4EAFAFAF4A4A4AB5B5B54C4C4CB1B1B1858585B7B7B7585858ADADAD7C7C7C464646787878ABABAB747474A7A7A768 +310 +6868707070B9B9B96E6E6E6A6A6A8B8B8B666666545454565656A5A5A5505050A1A1A1BBBBBB8F8F8F9F9F9F4242425252527676764040403E3E3E9B9B9B7A7A7A8989897E7E7E9393939797974444448787873C3C3C727272BDBDBD3A3A3A6C6C6CA9A9A9A3A3A32020209D9D9DBFBFBF8D8D8D9595959191912626269999 +310 +992222222424241E1E1EC1C1C1282828C3C3C32C2C2C2A2A2A2E2E2E303030C5C5C53232321C1C1C363636383838343434C7C7C71A1A1A0E0E0E121212484A484C4E4C1616160A0A0A4A4C4A787A781414147C7E7C9193915E605E464846838583878987B1B3B18587856668665A5C5A626462818381A7A7A5A3A3A1B1B1AF +310 +ADAFAD7072705C5E5C9D9D9BABADAB7E817EB7B9B7585A58BBBDBB4C4C4A8D8F8D747674B5B5B3B7B7B59FA19F606260ABABA9A5A5A39B9B99A9A9A78F8F8D6C6C6AC7C7C5451AD12700002000494441547801DCBD89771BD7B5A70B8EE04C702641712605CE034890E220088028C93245451215B713AF388E7DFD9EEDB8DD +310 +CE6ABFF4B57D97137BE50FEFEFDBA74049B6AEED74869B7E87404D2814EBB7F76F0F67A8835CEEBFA0E42B854AA5B2BB5B6BCC951A8D52A93657A914FE0BEEE39FFE2FF395B9B9C6CAD2D4C4606F4B7FFF8D1B37EEDCB97587F7CD9B4343BD134BABE7DB48E3FFA7A228ECD6F6574E4786C0FC8B5FFCE2CD5FFCE297BF7CF3 +310 +CD5FFC92B52FFE58BFF9E69B776E0EF5F79E55CBBBF9FC3F5D3DFFB07F5898ABAF7CDA3B74E74EC0CE20230561BF096E97E05712BFFCC59BC80539DCE83DDD6E54FE61B7747DE17FB8980BBBFB2BBD4337DF487881AAE6C5ACC6AF25207877B2B527BFF1CB3B77FA47561ABBD7F7FA7FE146A5B6BD74E3164C7F51449AE95D +310 +B412200EC539418717E7F2F11B376FF62E95FEAF1442BED0581DBCA1BD2780D23F506AFA16E1A7AD974EF17876F00DD7BCB187A1A97AE51FCED5BF2BC1F2BBE5B3C19BE27B43CF26DE00933658FE129B109C2FFF922CC22C4260FA01BEFB462A77DEBC35F42F600C3F5B0795D2E9E02DAD5E650B4438A92801B65C35CBAB7B +310 +1EE5041CE69D3B6F1822DFB873EBD6AD3B6FBC71EBC6C86AE967DFC2DFA4CEBFF1BF54F6276EBC114E2F43FEC60B01A0D440A868B2920E5C4BC10D60931ADCB871F3268B21D3851B08E1D6AD9BFD4BF57F7577909FAB86F29B982571136AF01DF5FE32AC3BD9406CAAF2440A54CF176EDD01FBADA1FEFEFE21FE4C9858DFF4 +310 +183458A9FD2B6708A5A5A137E0EE1D11A9EC0C7C58B2C73C0AD6B479BD76B7790CF899E287FA5B06FB7B07C9195B7851FA8794031EF1FC5F9406BBFB23375420286399B631E93B08022A785C4DBF9996EC3551874094D71B6F487E80F6837E50F483BDBDBD83232323AC420A18C68DA196EDDADF68A77F938F78FD972BABBD +310 +B7B87FB164AC6FC2CB760365821ACB74AED44FFAD7E7431ECD7E08AC421F391D199998989A383D9D98E8E56F84A318C58D9BFD2DAB73FF5222C8EFAEF4DE7AF30D756E5108683DA471E70D0502099A7240F19E4089D3FD203E620F1B47BF43501E85031AE44B4B9F2E4D2D9D4D51D8970983FA861B3706FF950CA170DE82F6 +310 +B312CC4F42C8966295F7D725ED29882415DC055F36DEA1FE96FEC141493F05FAA9A9A5A595B333DED5B3D5A533F62183323032F46EFF13EA0AAFA5FBF7C8976F8C10F7280A014832593B90004D52341980D907EAEB73411EB2F1EBC9F507F92746C40E7AE0AFAE54292BAB2BAB67CAE0746264A277B06508168C94BF772BE9 +310 +765F7BF0B548FE1E07F3B5A521340A5CB5297C4B12811B89E82191ECF3E41B3259C529F135E23CF4C7F961FB13537F5A02ECCAEA76B5BA5D3D3FDF3F2FEFEFB3AA22053E5008833428DC6C59FA2F770595F311F235D427F379BB8A121BD901B96076A388DC4C3C61C7933CCCD770FF375A6E0CE9F535FE2534BF5ADD3E3FAF +310 +D71BF57AA951B6D4CFEBFB8864758A26154430080B06ABFF557610ECC93726224F155D1471041E0D42F82F4891C926C1355B0831649FF365F46FF05300A7A790BD8ADEEB0D4AA9569A9BDBADCCD56AA55AE377F5F3F3EA2A34983A1DE91D810543138D7F28E57FF4E2B5335A3928B76EA1CB9B00BF158C8F63A2E788826896 +310 +D0B5E7C461949ECE089144F8EBEFC7FB4D8C9C4E9DAD60F7FBE572B416C2F2423ECF8B86C439E450DA970634ACFDA977629098D0B2FAF313A36B3869E37AF7853378CDA1171FBEBA95DF1E44FD5144A420588641B0055A79ED91CC0DC41E27064512FB33F1F04D09D0D2DF0203A646A6CECE80DF28356A348CED8C4F1EF137 +310 +B9319E1BCD29867CA556AA97F7B757567006A447FD375A26CAAFDED9CFDCFB2BB0BEEE8AA5911BC2C7F85DF88A3775389990AA72219D582409210F85A4E66F2987D875C30848023088FDF77E87F96FD7CBA5B9DCCEF4F4C9FC7C676777577B7B7B67E7ECCCE4E8DEE85E81A6D55AA3BC7FBEB242589CE8ED4770E785D7DDE2 +310 +3FF2587EBF57F50B9E820527316488E5C32D50F979BCA58207297E2B6D658702FFCD211840FE43FC9F3A5BAD9E97E6F21B9FCF16BBBB3A3A5A175B5B1787875B5B3B86DFEFFC687A72674F19D46A8DFDF3EACA59E405375ACE76FFA922C817CE86A89BDD92F400F2C55B7462F610459837D3A61ACF50C7471C8F2F2A9D38C3 +310 +DA2F068007F80EFCDBFBE5DCC674B1D83EBCBEB8BCBCBC3ED0D3D333D0B3DE33BCBEB0D8DA35FBF9F8CECE68AE020BCE61C112A4C1138CD47F9AD13F7DC6AB9CF9CFCFAF9D0E01FFE6CD503F5B91C5218E2899CA15098714848B04FCE5654884ABF0E554F11F6C21D73D5D5AADD64B7B9327DDAD8B0B7D7D6D6D07070763BC +310 +0F3E38E8EB4310EBEB8BC3DDB347E3E37B5842B97C4E44A0C630427E5CFDFB71E03F471E12CA9FF70E055AE141042DD81234B879EB4606361D9328149037D7D76A571A7E974FA20AD0323832713AB5BA7ABE3B3E3D3FBC30307070B0B9B645D93C3CDC3CDCA41CFC6AAC2D64D0D579B4B1B397A7C1BDBEBD7D36657A3CD4B2 +310 +F44F4909F2B9CA597F4245C59DEC354316F0587020D0C661742BC02869435FD12CF195C422DB3C5A3E2305C000CE6B7B27ED8B7D63079B5B5B878787C787C7C7C757C76C51B60ED60EDAFA06D67B965B3B672677080BB5329E60E9B477847AE2E9EB53E35779FD37EFCD2D0DDD68AA355B6B0D81860502B8B68C801F5C697E +310 +9AD62F4B406244CB975560BAC756AAA577675B07C6D03778C17E7C95CAF1B3ABABE3E3ADADE3CDB1B1B6B681014470343EBA979F8B90383545727C63E43549D14FD0F927E5F1FDEFD7263058FE02EBCD1BDCBCA053496BD58E69BC44F9F854D4D979AE9ADB908824382AC1D4014E9756EAF9CE85B6B54DB01F02F8EA5908E0 +310 +D9D5F1B3E72188C3C3AB67879B07C8A0A767B8B831FE5E7EB754DEAE5261460243FFF07858D8EF0D658BDC563A2C5EF5833C13C90B69248C4DD97842B61DFA7F210A2F6108A0F96B62E2D3B3F3DD939EA47E30ABF5AB2B903F4BE5F9B36757CF65021E616DAC6F60A1FB647274B4B05B2E5341B082D43278F67D8DFDA48AFF +310 +9A13F22B34C7586C9992BA6E66CABC190E313E7C811AA57304B421A75B289B9D174CC868C24548823E230B9A5A2DCD2CAFE1F98E61C015CA7E96B083FC59F3ED06EE60F360B3AD6F79787ED278D0A86FAFE00BA9220EAEFE1D5DE1F7855939C3FCC1332426B377F692406E022C010DB437EF009803F0DCFD3B7C94440571D8 +310 +F2C328F115F47FD324802070BAB43FBA80EFDB92FCA1F7E7CF9FA875CBB327CF9EB08C4DE4815BC4210E2CB7CF1CEDECEDCED5B757490968286899FAF95583BF46F9393CEE6A86D6F618CAAD9BFF0BE22B042412C5CFB50556815CC5BBE33E9F61ECEC26A9BCB8145FD10590078F9C9E953B513FAE1FE387FAC246E14F9E3C +310 +E7F5F8194BD6594140876B6B84C5D6799C61A16434201E5237582AFD75C07EEED9863F463284E2E13425A036BD41061259289B6BDC1ED656FC8B8592C9D00701E27CEA749F0D8EF44EAD8C1F80FFF8F8F9D513191F6803384C800097F24069C407CFAE88136B7DCB3D5D4A60B711F19070D83235F77331FD35E71596688903 +310 +8E2E0B346EAB7936C4162043E1A1F144093695443A570144898BC4079CEF1912809A3035A1D3F361235F90FFF1E3E0FB93C7E2750719F88E7D8E68123883ADB5B18185AE99F1D11C1238A792DC4BEDE8EC6FF503DF377E0445F68FAF4E08D43082D02170F30131A154206CC559A8D9CFDD762B31273E4947A581E0D9BB71E3 +310 +3FFA07CD02CE2A6BE1EC80167497F2A81CFA3F7EFE58D0CF5D5D170DE4F89070B0BC4040CC17BEAC6B0586C3D3FF0309BC06F44B04A1E13729929B4DF73C44070692C810B08AC3012E8EE9EAE22067796288C193B2139B970B86F47FAD0F98382B1E035D9C32FD318A4FAFCB274F2E1FA772F94411B0CD42493C23393A685B +310 +5FEF3E1ACF554AF5F3552A478383374E6B2FDDFC4F6DFE38F4F4ED7A7FE838F488EA852482F412D3CB07E293D02C9F074F12E84C5AAC423271450572A385449844706475FD38DC3C22486A0639E5F1E38B0CFE93CB4B25910EF309A2224BD8DAD40C682C28341AD69047E8539A6AFC14EC573F7FAD10AE0FE6EB13E87B28E0 +310 +93B513B5803514DE408809BC12A14876DE0A25F643009E9176D9F0C330164285A7444DC8CAF0E9FE41429EE0A2F6A6DE91C0856C501272404A8468822E24C807030B1D33D40D4AFBDBABB411D093D88C86D7205E05FC57EDD1F805FA4CED5920F0CED39157E007CE21757C5DE440ECBCB46CD283E378029B43FB077B4F47E6 +310 +0E9F61E8D01BE017D7E843EB49F50A2028F1E442FCC90C9EE308E4C0C2C94EAE30B75FAD3A0EAFA57FE9EF960F14BE15638840EAF3BA490BB6850EDB38EECAFD21A0C746D0C4234DBD035EFC7EDD121FA585FAB73DB89FE6A03CF833AB0730E5E2F1A36CE3F202A128934B44E396961121E1F2C9F32BFCC0C140CFE22C1CA8 +310 +E109B182919696BFB98120234F61B59F7BF46EC30CF067B21A33B0FB3E402448EE266CCD93135A8E823DB31F85E677434E608F53F8100BC0098EA2FD6BC01770E0F2F2D1E5452A711C4BB8486248FAD756D852026B6DC90A2AA5C6B69E9068B8F27AFABFFEE8AB36F1D23985D5960014FD711940800B560250D2272CC54FF1 +310 +D3A660B275AC3881E349689C1616E1E9044129D032313509DE4700BC867C71F128C400159407C761022BA8A040F40A244788808C60B3AD67A17576279F6F946923191921B0545FC2F12AC0EFEFBD7262B6935679FC7F80629160ABFAEC88E8430E76D82A8DE62ACE50BD4A42FBF03B387B37FD321B37E31C3F063D99703F51 +310 +60E6C9E5A300CF32A91E0A085A29C0FC507F6C21012303C6104B82C1F1E156DB3229D1A855A32A8352C9077AF733A0AFE0FB3EF81FDF2F0F82C21B0EB06998866878B103305E31EC17F4FD43831E570A2118D1667632D4FFFFB125782F96168A833DBE78C3F11F8383A79D49F58F1E3DBC780417AE6581381E8610604888E2 +310 +913E12492881274822C221AD04CB0B1D273B8542837460898C686864FF6F801E8269F40AD0481DFAF5E6E9C1F3BE391C325004DF0746A4E4448F7B52C0D5EAD39EC46896B888C4210D68E99DFA2820DF7FF850EC407EB55C3EBC5028611409BFCB8889C90F1C52355AEF98B18100094C9D0EF6F64FD47E5CBF3FF5293DDFB4 +310 +B50DDD54F351446FA1F14580DC3902C085F593CB24ACC917B213BBC11B3F0A61042FD8B24F4FB9C4556D0CB9E1A880DE89934CE9607F18F81FDD950DD0E1D143F41D56110E227C250621FF098838042BC85B5B6BCBCBC31DD37B34966E9FFD9936A2FEFEA9EBA4182E5CD3E17AE35501FCE0707E5525A7DBC64DFD077825BE +310 +37CE0BBE1BBEC061410C660B6E49912665E2B3749C7C9F93834022F74CDE6CA5EB501D9CBC04B768292C5CCB84478F3CA83074092C6082169015E5800D5839DC6C1B58EFE83ECA513BDE3EFB8EF1242D2D4B3FD55AFE03D42F8492AF8A3F21444FA2FA9ABBF525EAF84C09F0168527B0138A85D1EC0443C467B28BF844EAF7 +310 +6323BE13D7C11F72FED783837B970FEFDE7D7817E077C17EF7E2A1C2C0FE851FE4C008388C15E818958746129E1009D054B67530D6B3D8DA3D59D82D9D57CF70039FF50FFE0DE94089DB269C3655A4F25B38C49D0BD48E59F1526887C18FC5272197F85CA72862A593A4843CD25F920487DDF7AA0441A2C0600D062001F103 +310 +FCEEA3D8560CEC3EBACB01CAE5A51E420349F602191E5F901893142381351CE17047E764BE50DEAF9E4D8C38B6ECFFACEB141E54A6865A88A60133EE9CBB4C256930B0B168C1C3AB59FE1743FB422C7166082E934AFA5EFA3E4BCE0B69362FA7041818B7FDECE1DDFB4D022007CA23E521F0700AAEB5888BBBF08023E128B4 +310 +045381542FA256B0D04E28A0C3804E233A1BFB476A2F48FD135BAF9843BEDA3264EB42BA499601F16B566E72C7EA35908ABCB9176BBED43204C696AFD3D7B24B08D3AFA44BE243D88A6D9D0B6562B52F741E1610C0EFBBAF2B0829289A640EC4C8A4FF66A24430786CEBE1E1E61AF9507BFB496EAEB64F8F49B4129EBDEC06 +310 +5EC1F8A3F228A3CD0950883B41BEC6D1944AE06147289600A7726313AC69A3F91197F1438BCB743E76F01F6EF1D1C854071670FFFE43FF1EDED702EE5A14C85D0C42DF90B86068800659AC88981855E3E774A71C0CAC2F76754EE7CC87C808D1E1E0F6CF47FD4224731337BE1E39C5010823EE997B1491BBD99FC8D8EF7748 +310 +2BEB5EB2CF66499A8E0F7511B19B3EFBDACB6507BC78731B1B383D02FFDD7BE8DD9256F7D0BA7B46015941097B80018F700FFA024CC08078F51806100ADBFA163ABA8A3B95B9D2F92AC30BC908ED31FABE0CBEBFFF0279B675868F9AA24E9530B08C174055B7F48E4F58002F3E82F0BDFA003E8B431EB6C4A91E4D9B5FFB79 +310 +1265BA8827BBE5F1BCFA7F789F72F75EC800F8AE43FFAEC42F13009FB905A9A0132015D0068ED7682AC608BA6771038DEDB3B33082891FAB1ABF5614F93238079726B833958796B845B731FCB86316713C1DC581B1E19B424EE32674093F80776F7E27C6FBFAC85C536CD955B96EDA2A3FBF770FF4BE11845470EB3E42D022 +310 +000E0FE07D161811020742162444668308801E133A4C163BE68F6826A5523071CA78B2FED51F28F8C70FE4190073A3E5D3259D7A288CD19BDE623F10021BAB0C6E327FD507B2741627727EA00D31856492F9F009D7F152D930704E642795C1C1B336E0DEBB7F0FDCB79318543B25341F36802D64A981A690B94259607DE0B1 +310 +9D466BF8C1C5E1CEF9A3FC5C639FD6117B4BAEAB453F8EFBDA500A67E8BAF76C8A06566E36EE1184E8329419161F83D843D5DE7D8221163E145F56921C3EE383978072129E290A9B7166E63D26BAB1FCDBF710009E4051842390031845F20077CD079407C575F20364C4910ED2A574BC357630B0BCD8DE39335EB175646A69 +310 +8458F6A346F003A93002E846FFE0C459B8006E506D79BF902908A0AA05CB5E73530E33BA1D3C2EF99C712B7C8B41DF4D2A7830BE8707485FCFAEEB85A09AB6D39BBF7B4F23E00509C20DB04E240822A4B810E04D8D53D10D504C059ED86BB8697F514777717A8F8144D48A4C89077F7EDB00E2D89DC02A7B975640A282C49A +310 +4AA84B70B12BFED8EA6584860DFB7EE23FCB00C6BAF7332FF259FA3C9346508813E372F1DDE425065BB61FDF8300F7EEDDBE8D0C6EDF46F7D8823478590AE23759D60DA6B7A9F125EDE8F4A5D2B37470D0B63C30DCDE3D3D59A8D1501EB1B0A5377517BDD6E301F995E3F955F0F58FAC2E81CE172A8344AC03DC6781939D24 +310 +84B8FFC15E8F3ACCD3954CE19576B942D0A029188EC7013FE59AE90B71292DE774F1F63D60230180B30A2EDC65291B6211B4081128856001A680015CE000708254891851D4B3BED0FA4D7166B466BFF1D2A924885AD12B387FC0FCE6819AC3AE06A7AA4B715F0927B74D119D4A668FB54B8A8C268D8B038A207D10A7B1E95E +310 +42195B695BE0240F7408B311257C23F581E987C180140C584A02B1670CB817CEC0A080F259F1360E58452013200E3EC107AC1DF4FD7B0F6D23F33347F9527D9F51E6138E31AF35F1BDAAEEEBA3D71BB402E2FB47CECEE96B4DB85536772B07C82A34F3E66D0BCEC207FEB9E70643761276F7B50D5EE963CFF80C7AF4A2130F +310 +5BF8C4EBFB5F07B709840480DBD8007FB7EF3F90104908BA457D43AA2A6A02C91422285E5AAC143F3313A0CB74D9D164933B86C25587134E8D342B453FC982860D09FD13ABE72055ED020E85D3E312F74C25CB0293D978A1C4001927C80B86FD06349126EC219F0C735C8053D8F5F310817EA01F1B7851F406144C211C6362 +310 +C27DD51F1E310C0102280ADB891E9B085CC528A2B1369A46BA195B9A2B351862CE43174BA73FB7CBB430A5798F4C54B7333B96C3224A9863AD02B9FBD8E63092191924E77C199D92887DA594B6DCF0112857162FD0949FE6A441F5E62E42FB2105BC405A2301A3424601DC807912CB2C39C604A27908021CDA30C4C8C2019A +310 +883B3A8BD393BB3546136EAF561980FB63E9E035FF73B96D09A905ACB2C11D79571C5159026227DDBDB81396EB03F14100BEB66DE1FA9EF82C3ECCBE318119C4269FD014E66361FC8BB0B4EA9A98EF3D8848A01360430284335004C183CC25BCA82D2302EB03B8419241C64DF4F5ADAF77B533BE786334BFCBB8DA72BDBEFF +310 +C36103AFB30608A0B39B58D93F0BF42180841DD26BDC22CF0A770E90240006BAC65197D90920131C7B2EB3CFD3C71C6378A305EE8488FC1FF8D391E2BDDB0F6E3F45E7C8207C419800DB410073A3173942CA8D5242642A74496FF115832A6314D9FA4257577BF7FCF8F8E8CEE8DEDE5EBE76DD3CF892BA7FB8B90F629431B5 +310 +525E92A15A3A4A6FEA3FDD73136172060959206591F4C927196CF645AA285CF3014630121754261C0D31E1A7E3DA2DBDB54B04703BDE3A4209F02045C4BB0F529A14BED07098A2A1CD47513DA64B512F409BC01663090796D787173B5AA141B1B39BB470EEBCF1E30F9D263ACC4D05110797CEF7B923B027F089F74D1D06F0 +310 +A4D8C0CDA6604023FCA45B76C5CDE0BF3845ECBE13E0C0ED73700A8A753C1AC8AEFFF1B407FC8A20F42F0D94019121DE304077A027D4112283BB8FF0072444D68AAD111D6F591BC0061854BBC048EBBE9E81F6A33A95C21BFD13AF3C7E7DCDFFEB0DE8903F77B41DF178E99C289895B0EA8CD640549D68935BA7C5294E0A1D +310 +66DA0CC419BD398E6265789CA1241441AC94532A3C19C95340BEFC68703077EFC1D307B71F3C500859C11494838E902203A2BE90EACC5135B80B078804340C920C2300BCC06F7A1C71B875DC572C9BD1D84BD5FB9363CA6BA7D03E5C40FDFC54FC23C9B4B9DDD028787D89219038523BF64E638BB37CC25335937A00DFD328 +310 +69C5B390C8C32FF25C8C47A7181B4A599A224A9DADB0E0406FEFF9F183B7448F081E3C55024FB33828784AB61704482CD0160C04174F9E33BA9291D58C2F1F1B1B3B5863B0D9F3E51C35C253D54A23E560E2C0CB3A6F7A81382601C2079CAE96B7B1560D20A341E85A928A4E01083256420576C2ED477E2E565FD9223BCC69 +310 +1CF394D3D8E281501E0EE5C1C8159E92585D255CF30CC854C75318006EA4A01028EC853F9407C6053910BE105348324002260254886C156260F9189EE0F8C9A3CBAE9D5A992184568A69D5183A7DB97DB089FDC57AEE54F858FE54F577DBA85309640290F2D220952620750C5811FB772A7876D1E4040FBFC6474D51246D8B +310 +3FB378283FB514F8AB3C20B8BF7DBE5DE541C9A5D3D38DDB30E00151E02523081BC89C2214103E0BC1B3D0199A08E002681A2613A2616CEDF0F0F9C5DDC75DA395C25C0309C03DEC8091A4AFD3FEB504AAC6633930556DAC86EE3561941E862C4A75DD6B6BB3A0C59BE153DFA73EDFCBC3CE2188D3D378FC976D0EF9A95B7C +310 +8532F527CE3CF539581E0FE501291E9139FFB65EFF5DBD8E0C18DE3077170A64E033FD278F18068028802F156C3809FDEB11B1019C208D020C9BA2870457F0F8E1FDC7EDD393E3B9FC9C4308E9315704233F960E554802C14716B0B45DAB5EAB5E25AB7830EBB8D25E6CA94E4AA01794FB1EE164FE9F040FE82C940A4BCEF9 +310 +13075D087E85A7237D3CF29C47E4E676777779528C4781761F0BFBC1D3A77880E40C9A2E5109180D5255317890394229F0F082010354082D574F1E3FBAB7D6553C2113DACB97BEB5526C7C6F69F9310A94C46CD89FF8F379AD1AA035FD00FF3F320180F01417A6F255A3A8D86319FE0C0B0E06A0DCD33F79841339C01E5BBE +310 +1911AFCFF7C1E0A540BFBDBFCF2372352686D863F83F59CB6865F43104007EE06F52406F680341102048A01BB048823082CBCB0B6AC48C313F3E7CFEF8F2D1FDC3D6F6F9F9D9E98D9D7CAE5EADE2A6512FAD7AB526E17F600C85550DDE9ACFE9D97E694513103BC69F8A2813176032C890C1E9C49FC09C61670FF8705B1D73 +310 +86260E7C8E7122C7F8208A55139E8C8D4763F7EBF5728DF9C34677364E3A3F9AEFDEC9CD95470788834F9FBEC512379890B38C94205B2557987C4186DF5C0837608DF0F9F3CB87B7EF6E920475752A01460E556919B2B64296FB9FB70DD5F47232A0F77465BF140CD001F00ADCA175090E2665A14E6329B62660E02A1CB50C +310 +6025E3DA252A670B3F0FFAA5EAD94A509FE7036B159E0D1D9F2E76B7AE1FD5A606198D3A747AF450023CBDFD162278B9446688111009B4029B0F2180AE20A542D40610C073B47FEFE1416B2B12200F3C991C2F54EC2491027A816B0A34A9D05C6F437AC23462385DADD75642EDDA738AF1600DBE07EE8437804D2D011A94DF +310 +71C2085EDD40266A407FFA1D1C00B0C03927E60338E3B9D8C47D1F8CAED578E06F7CFAA4BB63B175FA7C301B747CB377F45192003CB8FD34B12009224543D8604494011A80C1903CE0518C986208E1C5FDDB8FDA161686873BBABABAE74FA637BEA894A44078C19696F326E057D7F95D061A6B0394A9D5F2DCAAFE4C2388D8 +310 +A6E9AB7695CB0BDD0A332430F1A9333DA41D1FFB97FA09AE84E738C75C407C260408F8DBD5EDED7DE1570A7BE333C54F16963B46AB0C2B71208EA3D16EF4EEDCD7005241166C005A73C03164792151205C007288AE337B4D7103741BDE7B7AC913350B348B2D767515674EC6F72A0402BBCB41C81305AFCF05F2758D3ECAC8 +310 +D26AB97606DB9581A4B7A8FFB068CD5C0604E6849046B70C2B60FF0CDDF93C13822B4E82FA0479A68220E66D9FD775FB3C1A9CDBDB9829B6AF2F77EC9E0678FB20ED8D1B1A1A39D10F9812E20D6281F5673121AACAA9C53424000DAC173F7E18C3052EEE3E78E7F1160F5AAEAFB70E0F7775CFCE4EF384DDEEBEB9C0889D52 +310 +43BDF557559FEDE5F17AB21E118C4C31A3DF6A96B56AC62180293910ECD6B721047664BCFCC6B2DD3C65CA0F0C823DFEF84083C7ECCDF05898EEF158F4FEF97EB9C123F1B9D1D1A3D9F9AEC5F5CEDA84A3C96C14A55584D62893D6A54D8D2028D05C8B1F124884543F3223B29D208B04910D3FC43F5C52196AEB5B5F5E58E8 +310 +E82610F08C21BD443801233C0CE8BD1E40F84A1CA86001990048031ABBAB11EF83F9283EA89F181F2A0D9A9F62D94B7F625FD727E6A93F63F200F614F7CF100D4511C07DB45FC5F0CB4CA359ABE4774631FDAE85E599EA0878A3C33D5AD6430CF4C055EE5FDB80629000D7855DED3F436F3B61B3DC7FFACEFD2B1BC6FB0696 +310 +312CFA477CE87A87070C7998E04FBA78AE3F915A065E819FCF35B410321D9ABB308146A11AD5196CDDD7C477A171C8AFC74B45CBC6F641AB53C8D4ADA5870C02379BC0470CF83DB55F073E29CF5CE5F7A3F8FD62EB7AEB1774C2C6780B9523F9287193FD23DDB79FBEA513B45200E2E0C1B51350163AC19043C600F2C1DBF7 +310 +DEBA7BB9B5457BC0D840CF325EB0BBABBB786D301437000020004944415472B491ABCCEDAFC0591201CAC8EBFACBF367FE7B6E40E69F551BBBE7123E3C00AC560CE20C62436E8C3C54CC225EE08C0D74CE26148877689EDD004FB2BFBFFFBB984035373A7954EC5EE8591FE531348654514DB1D1C56411DFA2A7C212BE5ED9 +310 +1278F2851A432244C6822C29C85A8B320ADCBDFDD63BF71FD32648E7D098CD018BC35D7FE89E250EF2AC75F96C15271602687965C844B8807C6E7729D93F22E81D39ABD62A0820C1FE9F11CFA7208125D33E96FD69E83AF6052DD32D49FF0802CD9F9DFD39260389A950887A647CCC99BAB17132DFB5DED35138FB3A060F62 +310 +95AA5E195BF0BB56495A5A4A8FA440026E46A047D40ED2520A441C302D240F201FB8F7E0EDDB0E12A04D8816215A0579E8FE1B1281E9F19C9900DE79842E2A7CCD48E9876EB01C75DBA0E0C8D44AB5512947A00BE7CF5DE9E1A6A6BE43CF1A78783DFD5A404E4477336C1ED8B18908B2A847B2AFE9839E891137A6673BBB96 +310 +FBBA2A4B8E9373B001F08369BA11BE8ABC4302FD2345FD6014A127068427D007BE28B41D9B0D40FFB7EE531FA673C8870A69135B1CEEE8D009C08042A5B4EDA314920B635BF941E7487E45256439DFE9D276295F87E698389CD49FB394FE19720412DEDDC40E9CE9C6DD605E0B719FADC416CB15AB3A61F9B5B9B9426E54F8 +310 +1D8B03DD950946D432B40CEDAB7BB5AF11213CBA73C9BCCCDAFBCF06127C7980FE6D1DC9B4DF14832D6568FEAEEBA76FBF438300B541064ED33F3AC0B0D10505306FD370AED02859234402F6C3FED006766DDED2034D90D119057225EEE3DAF787EBF30EC51ACB4F551678BD6728E1944730C095F13E4D81A4DFFBF67C5BEE +310 +37E62A85FCCEC6CC6C7BC77A5B477E22223ECA4FCC0F87E2A5E3EB782BDB25B8CFC6736A044DE5A7CDA604526361D650484FE283B77EFBD65D52C1C73C4F48E7D0D81ACF572F2E2280F98FB230508FA906B42DE240ED651B301CEC83DE1790C9FD96B6CBF986BECF3BD332C18EF627A0B6EECD5B152E02088D03D828AFFAD2 +310 +6B05BF671B4F9A09A8CE0CD2707F67F2A4B3BB75B9ADA331C1305BBAC182FB4A79820B7EEAF73199B8404C0B81231CDCBB871B80FC41FF5860E8E108222A1A076C29E6E03B6F3FBD4F1F295DC457573C7ADED636D6B7B8C88413DDF3B327E1046AA51040B40CB50C7E3F1D2E44DAD34CFA604029BFFBE714DF0C069908027E +310 +B275F1F366C132E1A7450B04011CF82B2B647CE754F650FF6E25BF37AAF65B7BDA16CAA791F1D09F6CAB989EC5AB7809BE145FA459E8D3E4B0FB47DAEF093B946FED585B80FE1A0305FD5330FEDB4FDF79FBF6BDE81D8300CF6815E5F9896552412A03F31FCDCC7CB5E32365550CD9365FDCCEC8752E943161D78047336F8A +310 +F6539840A1F2E764FDA2970999F205CD2BD1F5CF496571F76EAEFA0E1CF8FD2A55FD06391F9EEF8B9DC9994E72BEBEE1FC928E2F223EBA0FBFBFB4F2DF137BC894B8087643D64ADE6EDED67F7680FAC9060239E845FC94AE93D880F994FBF71FBCF5F66F9F32C292EA900F9C1E6F1105E81C5B5F58A067A448143842008D72 +310 +75EA3BBA3D2516FDF02FF79260020D6B3C714711F3CFB61BFF56A826E627E82256F7400FB387FEF23C1C1E77FD6A21EBB1B2B35F2F95E7760BE1FA3ABB3A981423477517EEE36FF96F122B942F6FB64D9502BD1B9089162532A2FEFED255028FE653C9F46FA321E0B588B7DE79FBED07C44106CC85133CA65190543004D01D +310 +02D8181DDDA5A9C91A7110805B7875B689FC3902200FB192E7DFD936B37B57D9C338BD49E99E181F4E5FCAB2ABC1CA7AAB382CBC7D515457CFABE6FBC63D525E5CDF74B16378B9AD6774A58531912D232DF01BAA913DFB7D3AAFF912984302B84D0500077800D26C60A4742101DE420C610C2E92FA93056022EFBCFD5BB6B3 +310 +8651470CD33BD87630C05831BA864C85997B8754B05167F0706499DC442FCD22592AEC2ABF3FF13F950039BF159FA9B36ABDB2778EFF83F70972B83BFD3F4899E64DD8346AA495CB155A7499F2CE39B0AAE755125EB84FD8CF8D8E4F4E9FB4B72E8F1DBCCB98B31BC4607C2CFF21C8145FB48EA0F2159F86A3098415609554 +310 +DEFA7B27EF1301033DD06D274BAF6821D220DEF96FA4CBB60B3CA241C021D38E1AA76B4406B4767576166766A6C7F77273F5F395291BBA19F64F2E3095C14F3E60371827741CB27E89543857D6D96BF9A47C6A9A26057840332EB843717AAD171880217B71FCCC0355AED3D4819911F79D0EA8AD6DA31A83E36C5DC2D47029 +310 +5C011302387069158F6C9966022367ECF1D00BA9BB95C389AE7B6105A1FB640689033A7FCCFFEDB762189103A61C3A4FEFE0D6A6B5A19EC5755A443AE78BC5E9235B047890A65919A0D2F96AA3C01CEE913BB3ED239C3E0CD8DDAB99E4348BF3F8B977B6C43DEBEFBD7721A839A63B94C06A10DB87FCBFA3C2932F8C26F88B +310 +6D6BB30C3C4E09AFE40FAB52EFAA1EC0316920E031A46D65A0FFE45A673432E907FBCF86717AC04F2CD0EF512D665FF53F05BFCDC43489F150890C60A8E0314E70A06F619D30D841189CA15D3417F3CD50191AE4396543F0C42BCFD696C58DF163F5B46D708BD5FDDA5E5E5FDF9401BC4F7E00E8A17520833D1CBFF495B5D1 +310 +CE037C664123EEE74737268B5D1D3DBFDA6AAD8C08DF2C0BC7A737E10AAB2A7B958990CEBF556CDBEE823CB09FB344143463C630CFFF585D330CF0320E921744A7918280FEEF981161008E9FBC78C830217A07B7D6985E83F9A79884ABB5AB383B4D7D788F9FB3D867A2112A43F19042B33A108690CF6F472F8661CFAC9714 +310 +78757F6E6F2F7AEB82FEA85E5715941778B278281F28C268AB24BDB470EF3303E09C359E9DF1CF990D8A096106E6A66C8620DDE7D281DF0B2831F20439A30D68386CE13E002F7EDA8D7806162B205D6A19AA1FABFD6B1B400EC2BFFDD66FDF7E8755B4883C043F43046C1326136680404F1F934EBDDFDD39CB58A98DF1BD78 +310 +80E0532E671FA1435E9D6EA5E9071000BE8F262E7C4044FD95D5FD526EB40A05A634775F32205C3D779FDC168CD5E56BF982508BF572BDA4F6F57D3304BE9EB18149461B12F760D7485891CA47CFC44909136FBF4931716A2E100123FC6CCAA6A644F25EDF4AC980B14039009BECE8B798BF69A05DC5B6885CD23F8E13A46F +310 +F0C0A986D617F001C52241801E87C2974C31411DA3A5D7B6175472763D637D3E57C33B908F867F4A59CFCA7923375E5F027A983E18BD7BD4E6FDDBB2250C1529F4202EFAAF979DFFB1F2612E87EBEFEC58581EDB9AA95AD1D7C1905F7305BF8182D5BBB524D47C4E3B81CD843220DE1E6536497C0962C225F75A2D6A998303 +310 +B23FC501F0B3F736EE1FF01200FC8C99F5515207C9C40081DF304C0A17D06E26CCBC5B3C47459308178301FA8057C2C0AE9D99B05F038828B08400F2E3251254DD7EB8BC4853B101F99AB48E387457C96951E5DB670648BAB70A7B04FE93EEC5F5B183F9739C98952C6845C380D401B8FC86E70A20744EC720E09D35955D96 +310 +A9041720196D183AC2CFE6AEA816652D0234883D788BEC8F5DF2615261DB031C2381092401B48D8D2D870FECEA9C3D99DDB036C8A051058030E32190976718C89F031DFBFF2EEA3D88606A8A19BD0AE305BDFD12BA4FF46F1A0002B07137989C748936E9DB2C91F43B07E4E4D16C3779CF5A4FFE8CC981F07C29E34B7C012A +310 +F0054FAEA4A6A3D49D3A16D2B3CF220A029003366663053C89B3FB1827080DEC2780076FBFFD8E39810CB0593CC68B5D9009F2D400418028B0BC6CC74067E7C9CC0C2690FBB084AA5254A12AF63543B35EB40D17B693F7E3464D5094C00AA9E04E0E0524F5C35C5EC6BA94B21AAF2440725E2A9FF94FE7A8F0E769EB83FDEB +310 +039B631B18BF396F5C13CF89ACC02C387DA56DC3B1CD84B96CFAAA37B55FE723B611062258257D331F186AC93D8AD600B4FEF4AD777E4BF68F2168FF08C081A37AC13446C859964803961928476D78F68419390D830C1935B5C2A0A22A3AB17D3D6428BF12DC373B8D464E04C0A496BB3B3B75639DCC2500E0F0B15FB6F47B +310 +5A7ED0183A87CAE8D535F2EDBD4B3B7FC762DFE65A07C30B2851DB890082ADC07131EEEFA3DB7DD5CD32C0860CA83CD4B7993A175F422A8149B1C1D94C1145059D9C78A8A572A90B7C8B1E3392FF77A80C50220880FF3669004E90F101740D2B808181455A044904674E7482CC3EC85C4BCE339404C0B0BF6A5611E4F9B815 +310 +7BAB6DE327EC9BFBA1B4557ECB609C1F45326499EFB90EE78F18227F09E563C9E63D847EDB3B68EB9C39E95AC4F7ADCF7D87F6752BB6912040281E4A0D8A8314E80D60470999B8A51FB1488A66A9F3F81FFA61C83F4FA6969E472288FADFD61B005E0EA4284822E018911828E868614DA0C36E11F3A051070BF2F0840E35F2 +310 +00E2C0C80A776CC9E7E6841C0503D0EDF15ED9AFE527E798D23BEE5F0604E58DFB7099D739BF0BA5D332EF29F1535995BDBD0DE681C4F71DFE6A7AC5A13554AE6910963E9ABC9A0DB5B202225545F5CFACC942B5B93C207352B6E5310BF349AF200175D7DFDF78F6D683B7C87E087FA9B35812C4F8F13452CED610A2207541 +310 +E6D659A739441F3833CD0C9C3C3DC2B0712F62333C4FA9327C9CA1124904B4FDE0FE21C119776CB0C212AAFBA5CAF80EB43772ADFE77CD9FA8A4144C54C2FB2304C65F62FC3678E4F6C68F30FEE1BE8383CE7DB86F58B1AE0C51F0F055E188D02F00911DDB0991832228B3172B3E623E513FF1734FF414A611A603163F401B +310 +EA790FC9FF7FC3FD3DB02DC00184145B850D01D120424DC03C00FCEB7880EEEE939399F1F18DBD4AA54C939899304D913CC2D5CFBC55E50C7FBE4C0E14AEEF53D6843DFF56BE2D554637EA047D3C210E2C61077875FB5B40E19F43AB7470CAFE1C0D3ED3B3B4778D1DF6D4F837C08747180FE8394F2CA1E0A46B6DA62CE2B2 +310 +DABEDE0B1924098580FC16B369730E9E90541D3730D47FDE16EE1FFAD3419CDA05ED1F2715C607F2E81893AFC5936303F40EB776F1D808BDE393A3FA401E1C706E154C892860AD74A2949C409E28A8FB3349C764D13E4D1D3468952B7B1B35001BF41142CAD58D6011C8B78961EACAB66E9AFBC627673B61FFDA4167950A27 +310 +4145BF11EA17BA9AA60815C2C43AE1F648E3772E53C94E6364AF826019E723069A8AA353A3BF7FB5359281700061FF64C28C10B9AF0B70B0B0D30A31CD1CFD22F68C76DA1E44558869257892363C091D313EFA46B57C3BEB252E9C6BF5B4799EC58F1910F469E25AA17B343799DB3E33CF410061F96C6D63FA91B1000CEBB7 +310 +D2971BDD39A2A76361E000F5DBC1688D47CB812DD60F8001AF25B328D173A9E4BAC18CE9F1F628704330741B2649B92E9714447C68559C6CD2F681919367E4811100750058809D0230C087A89FF3C80C23C4C60882E481F48D531764BABD5CCECA308DE2F63D3BB50373D630796126803C2D1FBAC148F7592881B395ED7D26 +310 +B7DD38D7096AF98841CB37592561D9C6565317AFBE9FC4AF7371E060736C7635E0CBA1809FC80F544DBAA1F2F9393D970D44C0615A0C6930E758B9E63AE690F73045F0C8C0731DE9CD80F718E94652383458799E02C06D328010011C7090D8C5E5336A83D4059953877EA1E1D66FBE994F04608C4C991917230FB61F9AEE18 +310 +3A40AB9108D032449FD1A7283DD25ED15360EF7EA9303EDDC0043403531EDEAB10DFF87F5E2FD56DF0F1B701A9F614DB17FA0E0EDF6FD0B1622A81FA3D1DE5A33F551930335C353A87F9AB05C60455193448246944A232C5D07636D864CDD7A50D0B4440CDCC465D1C418321F50E1648D500294065D869559EF3C40C8FCC6C +310 +323E989AD0F0C73142480B200842802C061008B480A9954AF282052B3AF67350FD0DD30D1F4075AC303A5D490250F5400ACF479656861E4C77AFF327F3EBECA4B57B6B6C8FF62602BF150744656A87DABD7BC6BED50527B2120C001A0B3718C74F0C65CD34F275164D7968148DDF259AB8AD6CA81CDA4E8819509B996A7F64 +310 +2D987A401A2B04018C01E6C169A8700F9DE3B489DB2BC49C9B7B858A4F50D22AE15428FCA4A1EDB20C83492690CFE361CC7F8C8066FFD0D77AEE797977F468A36E0B0DFC87F90EE6348BC748F7CB73B5B9DD5C6EE7AB19ADBF6DF359F1DC2A0F9E44F213F8041F64274C0859A2AB7C37440FEDDD2F95BE44065F22067E3EA0 +310 +CC3BD8C0D8194EAB291CCEE20B9CD8E02950AD806080047A279F19024C837C848816719AC4A34DF8F0706CED904E8185753A458A27E4C1E37B5F30A104932BE140E0BF4E400160F320B054A8705042FFC47B4940810173F9C9E97240C7FCC3F3813EA239B745DE9F1B1F3FC2F9330374DBD1A7B475923F9A2ED81716D18D1B +310 +577DAAB9D1A0458655AD3CA7E211867AE7C702DCACCD291E0F798013DC01BC326087775C0833E04EA3778FBCB8DA4687A0255CA0AD210C15661E4E92001A4449031D1DD27D327334BE830B64DAD90CBF537A45FBD4E94A7A88888E715B7E74FCD040E818BDC1BF5AC609CCCC015DED23877080FCDC47BD8EF3A7B783A17D33 +310 +F3ADEB6D6BC7AD75EA7C7852C5B6FDADA6AFEFC2D181C03F8C40DD8A4AB5024F0B72E34B57BC1182472DC80946789AFB711DB7F1193C03C893B0345F420246114D3EA71D04FBA731C0DAB0D3CD311B218F0D5A15ECC105D02F3AC32F13600084731A83220040019B03180634B5923D438300B05BAC80881F061095FED5D572 +310 +A3323ABD83F1D37A2301A8C930AB3F66ADF7CBEFED30BAAD7D78A06DEB6A87F15491F5AB7E25842B6B34BEFC12C8A159F187C64B3CBD2356DE5FBAB98BBE9583F0E3280C0076DA15BF34C15238145742B07080B1EFB83382F9FEF2239D003541041083C5AF9EF3C8944DC2030BC3ADEDDD9D27475800693049E05413BFB3FE +310 +B4308731512F13400D06F813368A0101D8D863EB3E75FCCADED124F532AD3F123F131AB46A93DF1ECE7F96CE9EB6C365C6D6A07EEC461FC919FE288AF7AE1A7D012D291EB073735FF26BBB1C99FB706E972192819B7A34BF22424BEA1CC7958AC2E04BFC8E02DB90A4A1DD04811ACDBC181037864672C78F6C0EC3073A40CC +310 +49D5E813593B7002763BC6A909D31AC86F3F6E335C9E1C309BC58F16418642E2AF6B290A34FEDC0CFEE08FCA0F56700699CB73B9C99302AA17BD516D7F1FD755A2B32B3FBE7134D3BEC813195BD355020A7DBB541539CD2C06E45F46FC0EE08293E6C0E1972176D9B678340AA1A4823404EF79B1E2347E47C35D0A2260730E +310 +0B513025DC0BD1C07E3366E9B9D17F767405FB531070700035618606F0B40C73C974CFD321B0C174A80C0F3AA54945FFEF348F5488895713E89B5C98DA501E06D8D24FF04FF0CD7ECD7BAA755A854EC6A180AD13BE094E8D5D63BFD6DFA5F5D3E4DB1BA18FD8473DC6E17FFC9832B71A2A94D96E808BB53F9192955D62C82E +310 +282B05168AA0927D54AB20A20A74800B7CC9655C8B15F62377CA4C91641F9F4D0478F4FEFDCE273A002CC0A725EC165CE3A149F0333E8E9600B2C05A7D15FD831F0938DBE5D0FF13E3C0F0765965A0961C3FA86DEEB0E28304747BFBA5FCDEE44C23544F7BB7BF7A132DDE34F99E44EC3FEEAE92F667A10F7E90B0E8C6442D +310 +F5A5318B0F816311DB2E6DC6F172C363FC800EE09186BB9EC82A24C0117700CD884AA42023B81EA6E0CF8B3056411110D78606EBC5AD5417B45BCC8E61EA01C4006AC233933E35D860BC1B6CB9C9CCCE7840D2E0C1C1FFC11CCE54D59300F2B47D66A10F09D8E24B71B9BDDF98FB62A3B897C53EC88D16D1FFE8C649B17BB8 +310 +E760EB20B784F52F992544753F2CBF642CD3C9C70D8722C197142C567E74FB431EE248A8F3FC00377F5142144A82FFC28AC2970A780C85A7EE9146FA4B2981F3C93BCB0F3FBCB6DD3DE69C72B6073B99140DE28B8E919D9D9E7C2F5FA99FC1FFD07E9AC0965CDAEA0A945FADE52C791EA989E8E7A21A355FB37E44405D171B +310 +98A6E946DB26AE71DBD01FEF07FD378F5B4B518724481820890E7486E3FCE61A60E096D577701890EE07CA5D7F2B086040749FCEF3F81972E510A86359C9BB579883035887542090614E5C4461705D7CA1CF84DB564838606CF1597E8119790D021080C935A908324EDE9F60A04B7830A33F0670CB08605B8D01BF9A3D4356 +310 +93FAB4FD84EF6754930640C1F9D74B052A7ABBA9F502B39DA3BF6BC7514EA4BEC71D752BFDC198EDA8DFE8F32B3EF811E4576B0A2074B99B070A069F60173E7427BDF285024E35A4418B7A412914F2800F1965C4F1120A2D5D2C64400563D5942044807BE7C738EBF3034C4A6F4D70C04ED1F97673C039FABC4CFF18866E08 +310 +200BB66BDC9CCDCC3FFD1E43BEFC52C317F0F5E64900FBFCDA4DEE68768FFF46350E0EDADB7B34DBBEDE3776BC55599AF84E312229F931E700D04478D66A0D88D09B2276141AF0F8811C5F8067DC04C0F90929F7F1AC9CCD368488AFB965C97B855A3E2E93AE5B4866502E55991B82D4388614F2C36B8484A5FA06E3EFFA98 +310 +4A6AF17D5C2073299D9F12FD63826F67FC460E54030981684E9FBFC22009A3006962285FDF4FC84B699FB5BEF3736C6072F6844C15EDF25883037DE6BB7AFAD6AE164B367812FA8CFCA6FA25725D99AEC5C6EDEEC64ADDA2BE0056002032E1D7A20A54CF444E360D520A5B69816C0A953CE0434A8A898BF18E2B704588C01B +310 +DB2133342F5404FEE698957C200EF54E31BE6DF4E888C9C67F5F3F1B41F922777E7FA6332677C20098C59F762F5DFE4A23F9801A3BB6F8A4F66E0D40EC867E92DEFCE84C714FC7CE8DD3DD3BDBF9C781B1C3B549FAD2C89D711808CAB100E09700BB85240374A7209212F320CA577222A7020E7824500179FC7096C714884B +310 +DFD9499E027ABEB3CB0226CD293CAE6E0C41A6788F396606A073E28CBE5CC67D584D36CA39D37974FE1023253E3FFB007A26F657FFC901D851130DDC2BF54884F20D5D40A0B7E5C7BCC7CC87B84F2ED820192CCE1AABA1FF24ADBE1D03635B5B3B53D4A5F84120125FADC36A0E792D3AD7E255792CD5241A4C84171F110409 +310 +0017DA493D0A7790A7BDE6DF326180398E4B0DEADA5C2763825E43E05C388E184678C88CE6422606C017F030366981353DF03A753DBF6370879F79889DD0BF75408724DB53C5B0063AB6568D02DC47AE4627B58D7E367A6000267E7840C23A0940B992DB98ED1C4731B4FB4DCFB6D3EAFB6CAC7646F0335C5031888CD74E21 +310 +03380260AD47176D703960230370FBBF28813524C17FFFBD6288BB28E4F905ADB4A788B40B4A6201C1878BED224DE9906C4C79EF32EE679B9F5D3B5DFA137327320643909A823F62106CB8F9BFE4BFEAFF0FC7A6393EC7F64A698EFF8ACE31BA05ECE6DAB6DF124118D1D13F892F3D3530602E3F3ED3D59DFB821ECFA3D9AE +310 +85B1ADAB9E328DE738BF55D5DFD039445AE76D0194180F57B15BEE5F09C07F952F9A10372BC894CF7DA12CF6507E2A8916E0DF430C519485C55D61EFE209912D8C32866214E121611E22A0B1238DB18E86636A3BFAFD5B4EE02FF1E505F902BDF424D0516907BFC95EF3A76B6B3872769D67E25B548F0DA46E2B93DFDFD5F2 +310 +B9E9EEE1EE1DCC7FBE6380DFBF38A165CAC73DF912AD76A4690D2B766A3EB4AFA2D05BE543EA20B095FB17AE3F1928D84482049B659E671A4763CFA567C08824913D37F2F92F841FC244085C1681225C04AD6DE1684831682CE0D6096B56101C0D4FB3A1BD3F11FC1105AECF5660BD3FEEDF162B0D9DEC6DB55AF27FC98050 +310 +BDDEDFF63ED14B01336053A19DE9AEF5F5D9E9D9F9E19ECDADCD497BCC57681922F327EB41FF681E17C1921B04FBAE371AC69E53F98183E91B84897A5DB164158BD1D12FF6F6BEF0E02847727BF2628F9FD48B6FB11DF6928C868B29590A0606F92140D0C08850DAA7DD8A5FE8A50389F61288AEB743E9C801BB67DBE0A7F6 +310 +4F63BC87770FDF57AA73FE1F5A84F8DD3AADDFC32087FBC0A7D645C327B97D65E7A8BBA76DFD9BCEE1B1CDE3F5F7CE4E6DF4013ECD7CB60BD1239E8A4E9A5722AD9C4FAC8F7FF17B214AF8801950430639A08E3ABD05A0D94E253BD5951C885B0CE750309070555FF21F2EF83FF53F4E15038B8D8A244740A5C9CBC120043D +310 +A0B323FB1DA0A4EDA268C05A304619505000BE10415DE898809DB6B66896E60AE347ED3D6DC707CB7D5B5BC374A158EDC343D0EA61C217D4878CBBDC1D85686782C3CF4272E7DCFB5E9EF628F5A95AC1AC0C6848F5771329EF8DF2BB79EFEDEC8DBEC72EB7F245287FD4B31008AB38EA4D52F2BF57167159E3004CD8950E21 +310 +7DDD6F699FC763E9D1A0AECC701F7BD4430A3E030374066938F883C01DE40E7DAFD609345E33570F4CE6BE467FBD7F793B5AF2A9D331D86DBA7BF98067918F9FCDD609A0384B523F4413B574B818C6889FAEFC5E7B8F90CEFD62BC2C85B2478D54DD076635BE434FCADE68B3ECF1C8708E27863DBEC352D87BCC7A92A8E135 +310 +700CDE65BC114026DE5DB68275E656D2C0D4087293D43BB4C9C14EA83C0D806783B40DD7CD4F19EE9F33801F55A3F1FD600017A6CD5DE607783D5F74E34680E7DAB98D99F6E5B5ABC7F7DF19D8278322F6A97FDB2FADE1539BD945DDF868EE2B8B70D9EDAA45D1BB0A5801198CF1DA891540474745BF0317F8A3703E02510A +310 +E94B084221F887FE950272D62D4232781054A87C58D015CD45EBF9B70E60820A2056E9D4D619E8494BBFA68B61EBDD8CF52CCBA124BACD4A4077E8420A7F36FCDAF661E577B792A7E1B7E337C7CF1FDEBB3B49F501F3C7366C1730E793F51FA20A9C3D2E9F18E63DC277449054CEADA36DA0807467D45F8A744E1BDED725A0 +310 +33868703F1392BBE221158220588F30574A0B0893D0515B0B7C404AD0E7F40C11D504C49BD7DA39A85A19CD7357DFC966E5D92272FF06D59CA5A6A1C8AE30E52F1247C1F1D78F81887F9F3E387075B170F9F5EEE4A7F5BFC69DF02FD8795FCFFAB472E7C88D563DA514861B85BD41594A75F5E866BE69471110A9F75C8609C +310 +7E6BF6C7C727431EE3E9E3773D2378C25226E82C08104A57ED273FE0921D6990E02B006BD038263BA360355E8DC446A380F0BA35FA9945A80CF60DFD54054202F91897C241C147D59F8E0FC67CD0F2BF377A3463F8BBBABCFBD6833C57E214AC3F5AE9C2FDE88852968F20337972C7E04EE5658223008AE82D93BC37D8DDD9 +310 +00BD6B16EF221F0D4149045D740A8A215D4FC186C658E01994B8CCD317465828704BB630DA2243B3B4ADD3EA554A97408454148C04A1A0CAAC2E04033C04073851F54380E0BF2DFFA43FAD3D6B574F2E1E5EF6E5F4FEFBD1CA87C161FCBCF5C7AAE2F726F814027BAE10F79BC3D765D61D1803952210A9AA07F8C6BB2105B6 +310 +1145B324F96014EF223D4A9261080239F03FF6F4DD4975C183B887E081F7A467A25EAA0C94028FEB808637768B07400A8235D4EF33143253198900E079E3FACB0C59B00F827A5785A6FFE2FCF0C0E6F1714F11CDE5140D931D707950631F3DE877F300002000494441540ADFB08704E252AADE1BD4E8DF55796A32B9B6F177 +310 +37C67702E5C638682737286CB0E0A89B624D5BF28222432848C9AB8C07170C97B814FF492A61072407D638006F7C8400860444C01B1930A522788045633DFA9507267A3A42BA05925BAD705CDD3792FA23C1075C6EE768A673919EB6C3FCFE7629B7310AA794CC9C0D14A1FB88F95C845BF22543F57996E0B26C9E4C2ADF18 +310 +7F979F8A55F11B47BC26594C52588518D25E6C2B1CCED231EA1B748F093E5726A21A54C91EF95789041030C20FD5AD68613432E19A4D0DA2505B6BD843516E10BB00AF9AC315EE9FDB39CC1F9EA59CD88F9CD071D470C86C4647FDEDDBB1CDAB81DA94034747A779F4CED497CFF817348F69F52E55490840E48840BA72DB71 +310 +F3E84F6DA2F4717AA928F153DA6E4C7E8E00363CEC9A2E1C8E65F298FC4A52F087FCDEE5CBA38A80CBE11FF7BC2AFF249203FFAB77A128A001B1987BD334AD9B901890A8C2005B6B248196AD09C0025ED841325B31845032E327C531C839E66DBAB39566B631C2FF0A1DA5A3CC47E665AD8751B47CFE33899DF047C9F3C365 +310 +E3B11278D49DF939298E09002F6430F9958803309827A7C791048CA070061B7E9A64C557D235F83EE24822E5EAB805F9862F20FC58F483DC0EF02181F572930205107E00E523861895A2811309808F2B6C14B2AA579E893753C155D2F54302007E9FF36AC5FEDBCAD47E182D91A73920CFA5C18E01F8FFF4C3F1FF553BCAD0 +310 +E58DEF85DD63B91BE38ECE1A9FFC4AD4A1FBA30D462C328C5A0340DFD393D3D3D3C0659195C96990F391EFF4175213BC74C020922D4830FE215E76940962BC0713A3B82784C0CB6623DC40D6E1485BAD454F6892200B225096127FBD82D2B12006BAE2E329C771E25FEBC0DAB3B5395289D56D7A8A89081B34EE06F80F819E +310 +FE75C67DEEE95D227E283FE98A7B9F1C97D2D05B4D07A469153C3DA3048EA68FA667A6D90E291C7D7E2D063E4D044964D055F2DBF3E31BB851AE9F78A0A7314F0AD24901F581D74A6929142039C65AF5830D1C809536CDC05E4BA51038F79D713DA930CF18BA3010E385351CF47F74D439BCBC793556A1F99814926AF12835 +310 +E251C59BEA3C083EC2B2760FEBDF4304C9EB87B35769E1EB24B648542CFA4EBA9EF93CD42F03C08F249A2C98897D8E2225E90077823F4A52171A61219998CED6FA050992B6B0A74A2220ED12123004FB977084208F8E2AFC80F456CB110BCA647A3A0F854085D84FE0052BE31FFE7F925610BAFEC06FC33F9931BF063F39DB +310 +3D1BB20EE357F594045F4226131578582CB055A59A073AE0413989D215019B6EB8A21CF154D71164E0D8F4E730C2CD382D098DA5261456A425643686BC8301710F2C50665881399156AA2B4C3191BC555728384800CE10040F746A3D8A80A5F0E500A93456FEC52833BBB45203DACCA37FE1D3EE4B9BF0EC27ED47D89B8266 +310 +F11EA2DB8B5A8BB93EAEDF0C06B7AD0402B9EAC6E787365535AF19F15158308A9D9785C1BC1C01377F8C6B4D07B50DAD25649764A91DC9812C7B34CA98184084F7C01055466B48058CD44085AF26648520C85C41C67805462D8425680425559F4440F3ABBE1F3F81B1EC72708767DDC8FFB6465796C8FE310FEABE0C9B242A +310 +74137EC3E0427091967023299BE5D6D4D0C6D15747DC2AEA4ECC57C72856E827D33CBD319D70FF854369EB841282F84B7CA4881447ACFCB257E252E00FBB3272120A75B99119840858486615636E0E0334031AAA8C08A62E080053A0AAA4158431EC727A084021D41CF5D630C94184F6FE7432E8F5F9A4FCDF3EA7CF136FC2 +310 +988093F98ED622E38E4976E1BF0CF49D2889E6DF3566719FE1F9B47A2D3BF89C69155DCF24F88C609EE551160F0415900B4C48FB013D8900A9192A700748002924771A3686A0A580FE4009E00ACC090253E280B90AC15048E047020483A038A60ED232831F2CC90498648690D960C48E439F18F4DDBEB0B6F5AC7B7B89F623 +310 +0243B4FA160A7B9327F3AD5D937C8BFFE5FF8B3A5E64283BEF8EAB9F71159514CFED62DBC880614AA1F7994CCFAE7D8C87057F451733699B8DF87056E1F0654B5021E38097E4E23221B810DE20559AD183A61C2C88A648DB096081E9801CA00BC1DA0124E08DAAC15FD2936905CA8DA1C40E42B13F1764E0C4015EAD7F8BFE +310 +C99A310B1B7C0BCC7746D3C0702759C89EAD57122092122D1F857067684A578F1DAB7EAC400841F493A468113282FFE42316CC74C756B1C880FE78795C692813CF4644480EE9B02991BCA257A71861F00666D9410288487618D120D0E80D7773E2B7DD180E100EC98B221C94BFC4FF531A09B986230F1CD08378A8E4D0FDD7 +310 +D9B1BC75F5C12EAD7FF83F3ED19EB018620303C217A6A35D826E72ABF2D8E2BB1B783F6E48D2E3F360806E1D192085D022103473A10375B63853EC54F500B5B064DBC20945B88160DCF7E4F83A0200BF6FAEAC88E9F54D22D898E43F378D20B51B5D6B1457000922202800DD401A9266483029C0D6D57ED80D42A0E6E08835 +310 +F0F3AC73D7FAE6D56185F04FC44472B854EB7D9CBF7134DF3DDC35A9F6B38417DD6F508B37C1A718B0D054124176F7222F62DFB327F34D451799D56216880193254FF782D7DDE26C271BF38C6E422E271CE4AB8823C9510F021126A7A944E00DB4031D013C88EA0746C96D4574069BD5439C4110403B40020C30B07A604F1E +310 +41D19C21A93FD9002DFC35F23B1E7B98E95E38387E3603FE7393680410D702FF9ED5A3C5E5CE68B5827D721FA78F3A9A0C08A79722D9C9B418F46C0057BB1640C70AA4A03D29CECF33987596D53CFB27B32C3BE304C540E14BF8464E080918268D254838C91A01F0FFB99154FD8A9C0495EAA6534A6C464440B4A71E16100E +310 +7405088122A35F7A511DC003D002E6C8E7E15F6D1D2FD09014139EC11FDC89394621F77B9F88EB5A583C41E2FEDBC8F82334494C0BFA97FF3C3A34ADE60385B60E5A30CF036E5E75370BE3B83AE73B3B7DC0BB337DA0045299ED0C66681E4AE223D01B1BC3BD4C921E2005FEB5114739040758189BA8A320067B62A3995E47 +310 +20055065AC2B4A8006BF8CFCC907C0063EACE41813C5F017065AD46CFDC6FF1BFEE052932CA3478C8E5A6F25DC8503D40F61FC1B047E4DFFE8E84407C81F1AC7B5C79DA358551CD0D13785A9AEB38D6EB68A0A8087FC6543E7471082873CDCE5CBEA1EFC5CC0579469E225428E9A43D6A6000B4219DE52E8DF00A55F4BF503 +310 +5960661C2DB88AC1F67C2890A93FC420193C8326409E7B595FBBBA9AE1D1511B3F6D65B09AC10A71C2317201A603E88C56CC68C91279E83F5C147787EFE6C675F00941D23EF092920330982DF38C65EDFCA89DA98E8ADDECCD77CB86D85118F3DD9884820B1128010D02F1060F582871CC8FF42024C02239273A1CC3BF71E7 +310 +70DFB7E96081682803188118B50310BD620234F230B12711B063E0F0490FCDA9248B580D3D3DE944A30CFCF2A1E0F6E59E8FBEA289CCCC943785BB8880ADA9C2FD70F6A13F5418444E3A669273C006C4B4EEEC067827539FFBEA9CFF04D84E7F170480037005AAC8829084329899F90B5E013927F8E646514B4824B01D11F7 +310 +2C012CEACD163B6358A4454A4221D06E68A71062520649BF9E9127D0772D6E5EADED52FF216BC2FC513C7D3C5CC4C8AF009811826AE20203B076A2AA66D8D32E317DEE0EFC000FCE16D9E0BEB17C74AB009256C5D8AD1CBABBDA61402612C675FBD72D07E633B1A42F2421208CE01397560811204306617A5141706105C9F4 +310 +984C459F2D0F6C392FA05BED808512B0B9A8A9FC6CED89640EA347D31F0DF76D3D9E61E800FE9F7601BE4C9614A1C58E6C839F13A12D0EB426DE6386B82369A9E6A7F1F9146EB578A2EF4289AA109B4F6CEFEC0463E0072A05CC9DEDEDFE08407B173B8AA65399C80B2911252E6290C82CC1B8909140C11B7AE161B42B9390 +310 +5045D017E00CED6D27AAA15F2C2179F1E83D411A7020B9408D202381E7E5DEE5A9E7E5CDE3B186433F488AC81554BEC09BC579018ADD1DCB3D9D70F02B14BF9159A4DA376225FE43DA224FED327941705DA582B2FD1BB5DC0540667B650BECDD1D5DDFB0C7F36DEE2B94F6EE2EE4E426F20A1174C31DF153321A24114C4FFF +310 +25E505475F6906D4149B21F1BD9D9DF7B059F8E0FD83323CB97991FE80EE131A9003B81C491B218B1D42C0C0D593D9D548003839DC29A740298B0C23F0CE14BB167BD61989AEF0B985C8FAC8F923A73F31953989F0F6C96CA6C4D0A9A88184BEDBBBDA3BBADE77CD8E2FFEDEEF46184A86671D7DDC51417477BE9F04804F30 +310 +5AC82C2D018A21EA903866A0F959FBD4139916D036635EE03DDB7408BCF0627A03027AD314C09B0A27F0A79490D53839D0DAF1416995CAB24101FA63F75029D57A4CBBA9FB4D120ADB17FB5A999FC9420DFE04FA670430B90FE7F589F7FE8D50A4B5F004CE5F07EB4EA007F8AEAE8E8EF7DB3BE2F81F42166C7246FA9E62D0 +310 +2C8209BA1024414C483498B50229FD923F2414040B2081390AAC353B5283EADA12A30B1080866D746B9ABF5BC107F33C2A015B275480759334B83AB02175EFD0DEC785DFC505E0064F4EBA5A97073A74C5C9FEC97BD25D819E28AEE661FD2732B8BBFB1BF13441B3C1F45E8AC1752BBF80C113DE960E0AC7D9D02C58C80505 +310 +A19BA0E84B14402601A590A4AE00A825E98C3212342302EE10FC5100681F86834A2804BC409D70270A2091DCE874B16BE0706C974EB3D26EFEDFFCA6C4579AA4DB781708469F055532A7046C6BEB0CF39F3ED2EC4FBCA3D00EA91CA68FD2B87B5C191E0EB2C300F00A1C9881F263571C6CFD83D079D09F176FAD839340CF03 +310 +0F70458F81F09AEE1329505150CA0A00576B56C06D58070B23086F685E44232D9D53DE3FC3731044F286D19F459351863F749F1104198D6E14BBC68E17CAE70D7AFD958E350BEBBC70C9C4DFBA075240DA27D40AD7DB063A097DD3F041EDB3E4B682A7A12A548F3393DB01945547175879989302521EEB1431B08759B632B1 +310 +74E0F700E774FCA1BB83F95029ED1A084288C8893520E49415E00DA080AE8027C34206D35491D050A4C6B080F6A20889A2FF82379AB6234F6710C05F9080ADF002B9C9F9C583AB220F45D618D7E7F7547FB27CED8A8B7A7D24EDA4988B0C1C2A1AFB53FDC61BF3DE50D63C560F0120B0372F0839DDDAF13E583B868717C1CB +310 +8CC71D1D7F440CC82184803144196EFD58BBE00B7EE77DE8C015942357FB06FC906A5E2B8882CCF9FFE184B0035A5CF186A962A63F84B3AAEE3D5A2C830008807568B6A9F424086D2095A3E262DBF124350082C4B5DF4704A9D2C93553DE47BD6766B69349610716999FA25854F759CA9792599D3837ACF6247CE8597B0F96 +310 +0FA3EC45B61715050260C5844FCCFEC9666BC71F875B17E3BCB4CB151405D7D08F846B4CB952248B4603CC402B609E90F0044A007FA800EC46D07A51232B00E5683C55D5096E1374DA4FCBBDE2C25A5B8D26008227CA7758033D7D70DF12CAF7F247939F93F1CC63047D63ADA0B7CC8771B234D8095FCDB577B586D1834062 +310 +035670E204B245EC093FCBE15626C10D210CB38A13F50E10A0D5C0814B0C4B30AA9858516001669002229618F100767AA3D6D2528595FE7A398C2D2300ED0013A0AE60B91644A057327BD3C36BEBF48C91279B45F8BD145494674AFB211A91977CB838DF35DCB3D6D6AA2FB2784B591ED785DFD7DB77747DAC9D2F7674810E +310 +FC2895F9ED8007EC7885101679C06F21E4B1C8A6120956F80518D1DAF1717BEBFB5803E20C6F2A11B2E48AFF4AD2810A70054623E341B3D1ACD92DA91150DE631EEB2C28882D092049C0DD38E262A7BD6F98549930C9D44B7C37028AEA9F8C5628A2BEF5704C0DCB2B428181B1BE766F43014498D2E57791E4C8DA6BD2ABF5 +310 +003F0C40202E2E32EDFB02852D16C30B7F646B98FDF86C7891690043128B0A0DE6B4EA27F08C30CA34C9D0AA0852A5997F8D11A6EE84E040B20472020256F4AFEBBB74E6705A12083B249089218E6452C8E5A69717E904A3F5EF3D5D08EC1F4D4E85086B238CFFC11AB9AE972CB775616C6D1DE04DDF073B4DE3747C41FBAE +310 +6072901CAD0237100670C5A00C2C3CE063610ED824826C1F6650700E88C00B62468903A0D71D3A390255AD7040048348C56C4647413C2C2561216E0C469203EF06A5B101AD40D0E207F78B124747DB5B4BBB4E88B1C373C114E0470B345156EDDBCE1B4DBDF81DBC400746B0B54E05F693707B89A5E430982C2AC7D10DFF11 +310 +D5B102B9505034B35D07E8E5F585757F088B390F2D4C85CF7218E8418BB4F25B885053D07D5A908326809F31D6CC6B77CC948413B28664484439D118DBAC27DB5AC40C1AD166F25E6A2F0AE82100C0BF220405323E1FF80DFC518CACA8DE1003F3C9FAE9C7B2D60703A0004F8EAEAD2DE0F5485452D15B77B4B67F4C2403B8 +310 +D8F9C533558ADE058A9E177A1698F75DC0EB4C800F74C0270178C8579C1FACD025F0560844502D2BBC01E620030CB93636C1041636A693949CD80139FD15BE107F905590A292840F8860706D07E2970A2F15E5B13B87C3143CB2930374CC46A6F9B9D7A5CCCC14E11B9E879A49FBE27ADBD6DA82410FBB94FAA8487D61B51F +310 +4BE0A03FD08743C31020D6628ED20305A22C2C2FAFA7ED1E7881C438AA5B9035F20759E243C51F34D0D5F02F11403B9E204CC1686C0B6C9000470561519CBE1B0E4FBEAB37A39EE4B84C05F023858779341991F36D9D9F351E7BB3B5ADF00148D9D05784F9AD8B037D48C01BFA83D4247F03BB768BEEF973A14E610090D4B9 +310 +6B1EEC5C5E66928F28EBEB6CF578B067DD83086081579848E60DFC7684044D8174993C39F886043481F6A2B743B18749E52447CD4D230513032D20D20206E536E15BCF7B7D211634F98FF9986287F33F9A94615A5A0A7CACF8DF5DCC1AC6EF9AF1945EB78E0A2FED1DA2ACC00EF983F9A012260BD722EF61C9DBCDD8719703 +310 +ECF839029010CA0B9F100B1D2842153E01A1A3837AB579516A31982FD2908A09100DAE591016CBCD4B011A2F4DE299E1338CE065DC4841BF9895D8C81714800CD08F5AD39601BC929B55D291F6CDCEF2AB40DD5D98F4E6F107C47AEE4A09A079C05316F479DAF4C2BAB83221BCC0CE23FE3D3D4C7BC9AB673D89A3677D6020 +310 +F6E182332028012FA0FBE0B2668FB85485902A8E7FA0BA2105C213E20BC2169211A4BABA7D693C3F1DA961F203694853137073AD5CD25F1C017DE0477626D7BA55B88F83B5EE513C41D814639FD1BF759171F4577D3CAB0C3DFF68B2D3B1F8478C18F67BEBB2598FA76A4545E9E961BACF657E0791D2373030E0EC9FAEDD17 +310 +BEA7703A738185D08236C407448A4CB504CBF01FF43859D3115488EA01B55078000DF085911805790DE1B41B6F8CB2889C3834FE02AFE07D85143C6C008438A944EA63E047023A7EF37E13B0903AFEA7BBAB9579330FAFDAACD540022980B65A75FBA17D388F1E6576405CCE7032D95BDA420E7DC0EFA320879E5F8B3B04C1 +310 +D2D9C1114210C19FCC49DC6A855E12010184DB8968109ED016E4683CD552A36B3AFA13BFC2114068935A7E774CD2C7225642B73325938052D8634ABC18DC9442BF9E0402E85B42F9F3273672DA8E8F1070405D1DC3248487574CD98092B8B956E6AFE1566530B78FAE05B4A0DE51FBAF85DD075C7E11939F80E015A58D1F87 +310 +E400CFFD2306C4D1D3C634380A201545A92BE01F445800BE12302AB477BD6F62600D211232EB061448A0D2B877BB940D63D059C37E0569A83DE93E214F4BD86209FF6F479C640AFF8AF6D1BFD987D029A94DB7C329B4184D4BB013BF912FB88FEEF913071A8D82B651BC10DB067A7EC52FE1B421883144C00F64FA23A11CF7 +310 +08BF16CA59F18D4C04B8085964B2D8DA4A855187000BE440BC816FFB13374640B0EB1D0998AF38A1AEF503F14302E2811081FC12EA6CD38A63B33035125F40F170C0B0AA45E9FCA38FC6D688D48563B5C4B4B7C359D3C7AE0EFB16ACD5E2FAA47EF8307044B4EBE1C71E84E742D81431FB06B90B600B9C239E277A57C94C42 +310 +7EE10E7826980C0136600D916A06058CBE8604DB4D314FBC014EDAACD0820F14BF75449B70339490FE5A0491221BF95F949DF1235380E969AABDBE2D32EB4403D3FDF17F42F9A0A7C28ED75BE86BDB7C7EC80C76F86B8800F77B305EB88F00A4352E0F8089EF811EA02A3DF08F7DA008F803BE4B4EF5F41E56087099E92070 +310 +8C3D720916444440FDFA013D4E1201414123A09290F5BD7AB729298209C4306D007BB0829FD4EC3A6D7E4F00B67DF38CA0764F832F0448E58439B952CB4F70DF964AFA74CCFDBABBDF273E2FF4F56D3DBFF2A78D42FFF2755DF307066497F44062AADFC0CC546F6DCCFECECFA232E14F408F05477D311B683A35BC245FCF8A +310 +5CD2AF20022C21022266905A5BCC8B20235D6FF04019CC04058AC80023662E25F342063165956320BE50370F2A657BACC817DDA3DDD3EFE04028645780A768FE38DBA88BF2EF3ADADFC7FEACA952E5A77568ECF0C971DF32BF1D24F8486B22A649EC81B1B60315CBEFC026091CA45F858D7D04C1B437079431E63E38F88075 +310 +8842E780A9E03791C0FAAFE10012588C3C592FE35461A6047802BA18686887023A422A49599399893103942CF6DA53A8E387825FA0678B261F139F801E2B17C901D0F5217E07AC2401A87D0480F753FBED44FE949C93A1D042B879FCE499B3D861AEB23F9C1F372F0C24D0B7D6E70FE1AAF60F84BAE642D82F0A9F53E22783 +310 +915518494FDBC0AFAE7DA282E5050B703570E06319A015E00D693A6BEFFAE493941C3B08C13B96BD20D0115A9565701DC58568A3009DA13E965765C03091F0FF339F7309D44F6E61F837F1B1FF920450EB8FC48F9B40158BE89C81A597CFB0DAF5F5755D3886DC13D4479599B583758CBF35663AA234F133F91D3BCCFCE0A7 +310 +94367F385C59B19431780F1C099131384056616E15A1563B50021D369C593FB292685A68A8B2A50A0A2085CF05434617E05FC24A6B077B990014421A68401AC4D65788EE25F737EB780D08A6E38F060F2ABD889E1B889C44852C2FF368C1E3E710D73B6589EA83F7417B341ADA1F639A23D15298F087AD0326410E116C3A1B +310 +325218433C71AE62C07C1480F1C045629724A076A4BB8D622D24690486727F56108D07046DAB065000678E04C4F8C342DE27F4AC102D854F2D08D59B4ED0E4F697B0FF62F113646BC5B7F3131D4EA8BF8B265EA3F2026E7061B96F6DF3D993276B2180B8E57067587428579460551049049B074CF8B1066C7E14C705F0B392 +310 +98C0997C17F701097023BAC31081390196801FB0C2A12380042927503D5A01CA127F9841B460310639C674BC8CDF1A320501448E0068905B07F6E5602F8C1F07786253438CEC51AE61FDB25FF71B09893AC026A9EAE3F30F369F5D5EAEA5801FBAD3C98B38C13EE017B054F81A56F05259DBDA64FE270B1FC4C77200FE276F +310 +E814B916E222575ED717A62A92956504605268408CFE13FD61F84252228376060206802B9550F00B9D47E6AF1022538A752CF4FFF1F5931384A9FF8700EDD4FFA2B93FCBFABB3EA6C607FF714B0B8B04EBBE83B52B246092AB018C0D0002FC490849F1E214AE6FC42009D6D86616C835B65DB9862EFC4480C14137603C3089 +310 +D0A5588FA27E693DD184131BA4E88C35045ACEF1CDE1A82323C20B842F2419604821196EE8185BC834AD44F8E9B7549A32900196E9ECBBE20FFB4706861AACADBBFD9B56A23FFD3AB8BFACC18B1B5AC0ECD7B6AE2E2E9CCD2BE8AF1B1BC3A813B94107E82DE67A42E7CC7D4A6116700B5B2EE3C338A09B840F07C40A64800D +310 +7C605AC42B72227C4C7020AB1F20056E26F542717F56534261DE3766AC10A6ED2D006DD03BA9DBA507AE0510A8B385C92363B9154167F1230C40D76AF6F3BE0CA08F8BA2FFBBCEFB09D0986550E0F0EAE2F2780CDF850CB0F88CFC2815FE87BD83909F474F45DD47F1C821DB2107A8817FD45384F57891B65F2543D0C1E20A +310 +89B4A8DF806862AC27C60F6A054627FD344250718AC0FA21CDC4E28DBF2650D1B39D8B8A420C348A4F846E2BE824BF8C45E1DB8EEB52F576F47A75FF95F90FCE0FD3A7A08D48D5B9AFBE3EA658E1676FE3372FB57F0AD8D70ED4AEBA3D4C2BE0AAF1C3AD63A6004D12900CFC481A47430C9EACB390038642C8C41B13303166 +310 +614210592736B8603AD4FAB17189DBB32F3915F0C380795A089A15228460BDE8E52203527D41B5470901B088D84FF8B3FE2BA7F4FD30ACAB3DE0B7E2FF95807AB0010FFDE3A048F7360F9F3FB9380EE537F16F8673131325D3351A3F664022020811A0FE8C019CA17370725CBFF64132025DA1BE2555102212E80A907FB43E +310 +D80A991A8AAC183932C19AE17524B06590B6AD286EB99BAD18FF4BD64BAB519202F992A963648ED30E7521F909F090C0213E367A77D8836BEB6F34D92EDA624183070248351F1A079E5D3E7A9EE81F2CE6678F92E299EE312B6C0572C0A7B5EEE07853612403813152C7125E2022A20C18F855DBAFA399817FC97FB6E1CDCA +310 +31D348434ACD0012F0D32A5456B4007E6E92D72B1A4E9971223A42C1042819E4049C0C5801300C0013FA48F8944FBAE71DAFC27F1826FA2304ECDF3F6C10FF47D5C7E49748DDD687DE8E91C09394EE0682A4F84CFD6067EEDF43E67EA46CB2F4070160439245F00343D03BF25D7E2F26FC400A896DBF19FB8D4D0A66DA669C +310 +3D608F9CD048A0533621B25690EE19D5D15248E390F042B12C682511B02BFE3E5700E4C9A9B2107A8F45248FA48234FD23005ED1F4EFE80D1320836F04003BF42856D478D1DCA3ABEEE3C68F9F30C3A16E5C238EA5DE3FF37DACC2F8B7980033F47FAC34421EF0418A045394802CE032D61C70023D788136788613887C0011 +310 +A4EA316E005718AE191F8D0D841B9C679CD2FC478442D005429166F5A24403B1E6ACF3298F388B6D0BA933D92339D48969A5C11F09B4FF017A9900A4F887010C474717E10F36468032FF33F4AD610517777104CD920C3CD15FC5F3B3A0C75BBCA3B00F2724863C10BCD4A0E00736C7981F2F72E4B001438B99714FCFAF713A +310 +2603BC710376A1715FC602022202E06FDEBBC680A3DF1C4C095A12C50B554FE7623B50374FB2129DDEA4C392C9188077658C87F55FF92FFA507FF03FC8DFD3F31BDAB46DD51AEB03F7E1B38B8B87CFF47EA1479C3EBAD5C6B382C221C0F1B358B39D76D9D3142C4A20935F541E492E0EF081BA41B3620A8E172B584EA14856 +310 +32E22A8221CEDAC6110AFA4B6D43E2B76A18AB240BB24337721C9321D2C033B2D3E2641A55A400A28403C12D1DADE39AD23FC5FC08C47A64DC3FF6DFF76B5235124022D7E6D6D5F3CB870F9F31C96FE477FAFE54100068A3A87FA5908A2C08011CF31309C10025B089FEF9C510522B8DC07C30AA469841723A10C08E27F00F +310 +7FBC181C083F2809EC3B2B328E294AEAD5A071B3A95C81D2DE3F930372D022C9C793535B92FDAD5426E90490C3C81D000017C6494441544698C416520C1C40C71FC204B22448FD9303782FBA67089A1A7D4CE38E89050FEF5F1E078A4DCCFADA058032C34C1CBC2E1202B1F8962B1A8024F0EB7A11F209E96FB369D4B64202 +310 +FE7BA230AD24C46413536EAE955B341B726C593B5D4630C0BE822480908522B0D85430230352618DCD4F7BA6D568BF4343801480006658EA3EDCBFFA9702B4FDE9022163C43F9B72B58001A23FCE6F0B3FF0E4E1DDFB9801A6FC42FD0132CC1F2224F89933107AD30B6C9131A53818AE944BE25A70810821C38F098411980E +310 +46D108F483DC63F49B91B852351604091D60546702F58A3872A1716411B642C7629C267E64E77719F46B0548FD6BFFFC86A38DBFADFCDF700228C124C8664FAA02BFB1F92B09800876FCE4F2D1C3FB4FD0A44E0106A8DB8079751CBF0BD9340066C3D52BC64706467C05B5A54401BE4A1B0132A55EAC1CCCB10D378A3DFEB9 +310 +812022327745EF2102886A9142C812A1A2C9708027BB55B7006357459F9C2080E0BC34489FC629510F3017B62D5073E2A2C64048A0A42580E413BA9E08274091A398EA80B5BF31C87BF5ECF8F1C5DDFB4F22AAC181F070AAFDDAE5650C4000516440D8806786D874215149E69ABEC43FF0EFC820FEA112B0522003C84BE03F +310 +B76623513B6D840820358B084119B0CEC8C00AE888826339A54091F5FCA513AFE147975BB1A86FC50618D9D74502F0C7C8815AA306602FEE3A5E79E0D7DED1B221001118B73182CD439A092FF801105D1AA14E1918EC282F6260869D55108065988BD67F68E5581720A708051F7C8070F582389C682BE53F2AFD85853F2A01 +310 +3D21564028E06E79B7A71E43212180A81541EBC88F451E02385100491AB0C4A3BC5309A95911E66D04C0B448366988ECD204C2FC930F8CEE8FA410EE4C25B58DD1B6EBAD83F6196670F7DE635282C0A56A851AB035831725F0471A10FE52097089C80495804100318405F0DFC2136004B4C40705EC9154315129205EC35793 +310 +0035688F61AC02188250CFA9A980233925F16A117A48CA54DAB6400221976B75D863330942E20EE3B00B08FBB71AA813B0E502FD2B023DF70114E0D7DF2E2EEEDE7B789504200112075478F2FBD6897835C91F0C20782401E801A2F9142700B74805703426023A81CC0BE88B537D0003E0C5181D29EB8D83050964DD258091 +310 +0A1E7A8138F76253DC01DC2F3824391AD748276C0B0CDF12366625D038603D0003E0266CB42704C8CE7FA7F11B4D59C0BF454A78F8FCF1E50513715D469607031272358F04E0003C90107223A581218F10008B10247CD20D860FF0BF48801040B361808148714764028EAC137E871501EFDD97C89B52107FF1235B0928C562 +310 +530082573CE137840EFEF82A0BDC602736C595912FBEC69E6A3A26903B3A300C5A098A9E3F1810CDFFBA019D97B4E7A7A075850F2E92569BD960CA7B8304995FD006FC4213BB1448A6F4BFBB3A9F9FC4962D0A1369129B10073771FEDA38B1737B663A71C088D8848027FC3008DAC4E4397A6F76271DFFFCF77D6BD7F1F67D +310 +A51E0E08875A6BAFBD6BD7AE52CC04A0B4A2206F650EC412841A48258258E8662C3838FBE21E25172C2A15A4F78D82DCF68A005DCF07047C183E1CE47731BBCCB5469D9169E0D588945BEB637E87802A03D88FB82486210D28FB3B858D13DC7CE75F5E6F3B03C1744D30CC58C7C7A256146853A05243060B850072A7010CA4 +310 +7CFBF9A1E24F414037B8781E8E9F219A774B36481CB43E48A79819D638C8760D672FAC19FB9D3FC5EA9158DBD0159C27860409682E8FF2595652FE189D2CC2D7C023E944158355806FC320087CC74116030CC376C559C098B93A041C5DDA48AF33827D2327DC761D19C17CC62780D82A170E6CE7415A5E7FE825E053048F88 +310 +D2AC2A561CA4D4C60098DA28EF1A01382772484698F60C8DD24BF396EA76260542810A625978C03580A9CAB91D10249BE579B0377A3DD15749A45F24C4D81FF3D7D7996F6A1690288008C0FF6CC186DA9D5FC95BB09B1301004B016E707FDFED306A1BE8FA208828F00BF342186839839F1F6FA338DC5A0200FF383DE92614 +310 +C03A4508DA18F4D85F9354F7E867AA77A42FF49BBE6757A1A7454448D0BFC3C220714FE43A3D8F1547BE10F0BC5A05985AC3C28829A06FE24CD062700601F4AF12AF99099B08E7071DC4626A97C920C3FF96E190C9D1FD7CB6163E800D79E5F3F10A9306C02B799E80F1AB380E0571A584C0370A220C3125000B500900D96F +310 +EA40409F980E2083E4EDF4D8D2480AE5667222E020BCDAD4EF19682120818FE18EC7FD6AAD67C03F7DF1955E697456F517AC4F24700C30171C67E9168B109A4F60AFA60F98BE30941BF776DBC7C70792A2FBE98AAA97224F8BEA39B47BFD14A8CD03320DA2B676E3AA397E652E30A42CE2987B7DA1EF7F75242413800A04C0 +310 +270C62A13372400B435ACD84B8B5009208F5AC73EB149FFF3508E21C2201E0338BE07E50EB47E7FF6D97724A601028C5519073E7978EC88834410450E074DD58AD13A4900103A6444A9CB99103229F0EF8C0C78161EBC68137240734CDCFC349807851E0EB46CE864D2E405ED341B71A390CF2DE20CF5193189E1901E866D0 +310 +230409684B193D17E2928534D04240937D3C84477494FC5E0FE0B448E35AFC19007926C1C6A6E622FDB8A12E30993C6710E070397C4B26304C0AE38218D19F01FFB15BAE1C0E7E74DF75F2406E373C414E848FF8E500EFAF3C1029C9C0ADAB2313A7426CA9B2C1B9E30032C84EF31A09A88A386F136E8C2F1D582EA0459207 +310 +015F10F1F001F0B1B7DF7222011EA2001F00BFD36BAEE0850928B08C077030FE3806C880EAA74BCE0863A952812E6008B3A89199C1EE918AF96AF583F1A073B0A355B9D861AF1460DCFB3BFC6B7EFDC834B09700CBED3510E48DC7129041C991F06BA5006CA6B5B34EE21501374E8DFC910042036111EC9C7CFA1C05D48A72 +310 +70F7F835BF04A4194DA4CF76CEC66718C84CD020D04C412AC848F03E3C61A1C8D50D0EA6838A00376054D3DF61A0E393E1F8B058A6C994093476D601A4A06F0CFD3C0A6BFA910E75CC10400A80FDA93AC9B5EA4303F6C0D188B559086091CC5910137772E14F2376D03181B5CFE74C0EA38440D0AC256D6C4D104CE05302FC +310 +C00B60B9CD4D71E08BD40C144A025E60D4C1F45FE846A2105D717EEA84808A5DD90A168E133640311CF05DD870768683F5D2F1800F485AEBE5CABD8FFA3C0BEB33702493AEB551B1EB035EF5C8E5757FA7832141F88E8578A363802B560007AF93D7D470B478C4D00B412D634C9140C4F9275C00DCE8DFE3C7F8C0AFBC5B2C +310 +E82E3C3BDF393D4375D50C43CD1C17E3777CD2C170725B7B42B41DF15BFC344DAD089C1E9118522B4A2C60B794E4E8F33081BB7C8CFCEEA0B2015E49D586429C6C78646180B7710E06018A3082243C275F077FBE412C17DE80D3E6B9462C5204C5D980D1DF84A864401C483CD01B143F4A4868087A0F780F37230200A4FBF6 +310 +AED325114C367C22512750A5C7C3E32D545CE20A0904183BA10015DCAD89864B3E1EE97EBAE8B204266A48E010511838E2FE413FB116E60880C2D8440AC3880DDA6DF6618C138CF1CB2A09637E18D00F80CB0DC05322E31EADB8081C29410903F06BFCDF5AB46024E4A75828056440503C707856EF0C037623DD4922A400E8 +310 +A6BD75E4D2800905F18450A00CEE88860C8964C7B3F90F56528BA18F71CFBBBCD2D05797E168FC37DB26DBE0DD2EAEF39686C18440820013C1444055402A541400DD362A0A402F1FE51246404E098249FEE30708C10CA0B54601053159480C00BAA9B1223A773234FE72FD5C3BD81804D8D196FE3D5315A0C981D88D04FA01 +310 +DFC185CA93F9120E1F480B08063364A0A318F08DF95056E4C91F1150D31B011200383502E079EE43CC18603AE2F88FD139C802A739F208E88D06DC78267C448C27C4113C19B0F51B0E9C1C021CF8F9167C6B1F2E10E461002910105D1042792D1CA303F469714C018C23D72179E165049C40E801CB96CF334562E5807291D1 +310 +E0C70FE6CAD91656715F0E5C5E70F8D7F83290549B1BAA6F781D25180EBCA93EC84E72A74081CE3020789B3790E1A9E478E658C099BECFF01E530E80EC5FE31204ACFF70AF8177A03059240CD074978A002A878BF883FEEC81DD684E406CA630ACFDE87292822A11953710F000885D6F68A67ED40CD772B0828359B753F7CE +310 +23D9479AB9845771B389D6A77130F8C134EFC83947392029B10E4425440A84AF0E54825228FC1634D369874739C837A9DDC83C20D320C36042610ECDFA750303710224D01202488012CA847424F8D53F78AB6BECE9B3B35A7F32396AC6B7444566327DBB4DF06FD9616744F4D3A397EB3B0A3FBA8D763702883ED742FE5CD2 +310 +4146D8E353ACCF811C806AE09914D8446E93840FF4D6C963FF32BFB6AB015D1D3B0C9A0968776F021F21404B6260CF84A14F35180CE20B5E85BDA2EC91FD5A7DBA7E5705F4F0F97AF26CE18E3BA078138202400A62930FA6CC7882F911A92F33E547E64990B0F27323D73B6222863F86425153FA8009361C675554C25382CE +310 +148420C8DCC47A20122806CA178A0918C14CBD33440289078A00EC6070184CA9907FD0A1270478E0B325B67C2193694EDB7DD0F3C238447C8A11485562FB4902134E6AC952FD5320A4F7C780882DA9684285CD81D278C0E8FF8DEC9F45D22DC3C2CA99C2728110888799575B6834BF22B0F01EDE72D7F21B672C40F0A97299 +310 +9E2200B7C91403F9BB3D09C01990819238CBAE5E7510D7D57450507E3DB04AAA0A3C280064E0775380C8C16EEA4834346A04BF0CE847B4B3AF760D06D24BBB267C32E2C9257DE5EB748AD101AF1FD33265E2B674EED8C01A0AC901392211011AC810560F77778E85B13BAFE3E25C95B70919A4862C15928BD8989664AD8638 +310 +101D009A80F00BDC41AF27602A4BDA0C077E550048E7F1011410F01405045E1C140B4D0E70E0F6E034171C3D6FD12004FCC1FA304312518910356628A4A326EC9ADF5DFFD1B2C0399503F14B4F8E3E0E4E39A06ABCB56A8014687E86E462BDDE5124615ECDB412B7314F62E6E0C76ADEC0F717B360E741960104CF1706CFA1 +310 +8E0605004B01AE007869B095ED92144A807841EFF2811C047889A04901C809062057192688C92346F97F279449F89B113500BAD282D1DA80A55C27EFFE02C8D4F395003F285B617BBF0831F49B055342DDDD414378E8888E92C16789F269A27C9A221FAA4A0DFDDB9F935B2ECC04DC51481558A69301E0460B02665AC4DD30 +310 +C03D480866C3409400051811876014C0F294C542821AB045011A3E3F09001FF304E3A0BED05CC11A811B865001769507FC01ADC611F400CF68C7B093606E30F3C7E0F00C1D10C31951C1E2D7252181DA00345842A19130715C736EC9ECE686A712FDB31E4D3E50AB336E5666D7B212C0113C4A4406029709B43D0228F3FBAF +310 +49921B19CA0C82A2D5BC4A2079809240F37D3E10F9637607C3983F0458508A98B8B4EFC92AC13530180CF55359500080061DF59B98BB3FEACEE881DC8127F182A885A86FB12B43C590A4380504E32305E3148BBEEB2D2782029765428092545BA5C2C681FC5F8E869C0EE1034A822FF09A12C94084505AA868080303473F81 +310 +61F7AA0A6610745E280BE4427FB770106F8800EADABA19F453210435BDB2348471B13B65F2FCB554827632C4C44467333E4127095D22092ED492009930413251B5408345065065E415266E20279A40B3F520370BE2050C8360E6BB4601C1673B9BFE007EF5200B6483CD195400A783E6DEA0653515B0FCE8E86D1618FC1EFC +310 +15C2E727F24F2A2DAB57326D8D0877D4E298894E7A0C3C7D9CE8A0E2D17AA2020FA1097D6372F2A9F955060FDD467AD0426368C24A8340FD0D6687A76316DEF5179ED9042005A2BF02A5DD810A4DEFA4A8F700EFC50FF4FB8C06410F0303C106ADF8852ACC6A2CA9046E9ED070739339857222CC009E206479886EA26227BF +310 +7A341A15C351A8404A6C10080A2140FA4B4E8D9B9A11645899332363FD69887F436A660566964250FD752E787B64BCF8E6C8190DF8EA0C854C062D8A5A1346F810414313E606ECA0AC3A01D6928544029D5F42E202C0CB386F880F7842A31287061F32F3CBE09F2950783394F2F2B23D85386C6F51943E99DD10C8A0000BA9 +310 +569A14805693274BD0E4F4DC3F28E331EEA91C4F33ABE057889BFB92819187840A08E57A276A8BFCB75B0342668C70C565C8059996D209C2800941A21FB82B2F520BC2E6FE6F1A8827043DE17000DACC8193E78BBB8DF1467978C06F6AFE986123E3A95272CAC122046F4C65C4B88FED2F1CD1D918F7CDBF8903BF1A90057D +310 +42F4DC133AF804ACBB58446A0DB78806FC053FA1E45D0AF1112613CC0DD976C5E70AD3282F42725C0D02AC8588DE451B1C01ABF063E7748A3882F0DD484BB78D037F9812240EB88B6034C0AD53E5116D4C6D920C6A89F084E6D0598AD7EB6930CC7B293E27A666E5CDFE9A3FA52FEB3C97976FDAAE9A60008FCA6B33099CF9 +310 +880D35D419FC687D424378E3099441E110C5B3C6DC311E6653514A67A530D863326C4D8430E0C28024803B5B069B0E60C10EDB6DF087034171DF01F1F3404B27B1056D8C0E56E7CA6056E7798147BE4C2F01CED5987E413AC6A724876DE3F599E0601CE7B9CEF3BEB3671E12DCE8AF9631B8031D3F360B6955DC2342B2A0E4 +310 +632A00264C0DA002220CFEC3E10D9BADC8904D88DC51928593AA16C91DF6FFF82B3234404C7214D0F8608E0052283EFB2B0563F1D072936C4017706010BCF1B16CDE0C1FA9C777E44E1F5259B0C9BBC8794A82A6C182A3AF56B16921405351FDDC91B5BAAA617860E8D76C97C377FE701A4EB4378FA97C2C8E3CC8950886C6 +310 +FD93AF70A1F5F676B7ED16CBC56AF5D09110EEB8607CC08A795882358280DDB98AFFE7087C6EB593D62F041CDB4018935238E73F1098100D0C8769818F777057F64C703C6530E142FDF5C837AE1CF66C94C4887D3A3726AB990DEA248F73B5D32C8E04F6714B1E67C53FC52040252E605B322407CBF8C7F05453462A295ABF +310 +4D95592DDD76AC23512E9A2DF964715C80DD752CA8E263AC36F02C3C28A133EB22AC8D099BDEFDE28C3E8FFEE3815D5D00C17C00511058354D62443C1A546280E43572A9C661A34FA5891F8E7570608C8DF21DF51DF9D2A84D4501F41B8CD4F4C9DEB2F901E810C0E4CEB6EC08DFB06341C864CF8D0EEE779A606545E1E64A +310 +AF30A4324C20FDD3BD558BD966BA994FA915CD162B1978642AD01694E533EC190368A68234657085B5F88E27A0805E04B8BB6A00A51646EE3C10A50FF007FF410F1963CA69BE2002F0F902E701AEC995FD41F83A3F0C3809A3288A083003A6CC2A20E6D703EE48E3777AC07ADD51EB6101603A9FCF17B3D5928F6D742EE7E4 +310 +CF38AE2B03C5FB39C81D7B2978FAFE85AF3D2710B0582C970F0FEB0E4D1103B8BE2B4D560CA10002FC8F334C891C07B44FE06B2E3ACE5E1E2D1FC32203110ABF9CA0E8381F68EC3C06701328E5A38278A5FCD944CEA5283DA933DF2A2448BD23F1C5D8BE04CC2DC3B43B3EEC29F8B5FF926D11D3E97EBF7FA1BD1E5E5F5FE6 +310 +D3D972F548547783146ECD84873F377C5820F7F9FCE5E07378D6CBCB7E036DF7F7104079A05B77C6942D1BA95D47424BFC3DB6411009A42E207871B7EE9B06614BBD20F22F7523FB985F3F7068E37600273A3ED0C1CCC380F6EC4AF01CC1CF95E4848B7BF950AD14C44F10460221E02D21D01DAE800F323704C00035DFE97C +310 +B37F797D3D1C0E4FBF35EE1E5E9E0E879FBF3DF6F474780A01FB3DAF01FE0C0798218007C2090A3008BA7682A338F4A8804A06CBFE6A80CEC766F49853F15B2F45FCEA3F8250012841315016E75E797EFEEC4ACA6C79F515CF1738F7C36E2406071051043817C9E8C5888D49D0332E800062FF54FA562BF7446CC0BFDFBF86 +310 +03D1FEFCC9F7FFB5A7F000430755C2D3F72F2D02A022820897ABDD44594475BDCCA4A10AF34C06B08B4AB58BBFAE30999DC66C7CE903A83CF8EB006EEEAA063430F84B05F0ECF644825F5E95073870E72A0771AB89B080022A0C5A9FAF34C89286257FB7BEA000EC65B59750C68E0815B0D9834B15606328F80709DE09018A +310 +C2A7817F83F96DB3D562C10A0A31300230CD4200B87F85808BAF64D04600254047F9C14DE93464009E7F5AABB4FDD6D55142A2C0BF1541FCE19C20C899BF4F76AB54B84CB97F88F48ECC029FD253F0C70DF4816B9AC94BCBD653B1A283C4001A0337955E4AFED3FB790B6B1F5EA0B5514074103A38D84280EE0F5F9BE974EA +310 +B2D16AB1EA969684B6E4166CA28264B300474C7308D20013B204A65F82970718D05678B3315D442E1C0A327E2F56556040C005D2FAB1326A68A07507C9E46A3648555A7080F5F50219A00E6222E3E0862CE95B5680930530742F1D041805E69B788161F015944D041182B861A2C17F3AF01CF5BFDF6C343F9171F5B004BF59 +310 +C016719164B888EA206A02AD05E8464D06B48E4381A0E9345FD171625AC22198F57C003BEA5510F81FF78D31C9B033D0030000000049454E44AE426082504B0304140006080800FA902C5C51464CB48900000043010000360000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643 +310 +464437452F6469726563746F72792E786D6C9D8F310EC2300C45AF127987122606C71DD918B841D4B851A43646695A717C52A85029031293A5A76FBF6FACEF7DA7264E43906840EF0FA03836E242F406C6DCEE4EA06AC22492573150D1F66C60C640E8938CB705396EEDD86DE9B5042FE27813D640EA63BB001C722AF6E55C +310 +B61E4863F58284D5D3F53DD715CE1C3985E63FD7F1B7EBDD617E9F1E504B0304140006080800FA902C5C358FBC2F47070000541C0000340000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F6F626A656374732E786D6CDD595B6FE23814FE2B56F665F781842440 +310 +CB88326AB98CD0A833A341B3DAB7C80443BD752E729296EEAFDF63C70E711A209D8BB45A2A41EA38C7E77CE77E32797F88187A223CA3497C63B976DF42240E932D8DF7375691EF7AD7167A3F45139E24796D9F85621C911B4B2C5BD3C99E2745AA96B664870BD65C5DDEFD85B290C4C44221C359766365E10389B08D8B3CD9 +310 +92ECD1DEE21CDBFBDDC176ED72A34976CF71FAD0382AC59CC439B00AEB3150511CB8E6BF2092339D386283B1CDEFB6CD3BB3CD91829B8CD238CB711CBEE2AA719C7782ABC671BE3B982FBCE1B8371C0CFCDE60E4B9BDBBE5DDBCE75EF9FDD968361BDF2EC6169A4E3649C22A05A424DE82165FACA93B71C49D4A7C85421BDF +310 +6112C7245468B66DD812459792AC898901AC2B45AB29A494B5B6E07714FEC4B64EA0182C19686BE1F46FDD7A93CDDF0042D6C54A794684956739075D2BEC4B7FE84F9C72D5D00BCD508473C2296688D10DC71C14045B4B05196484B70852486026B5A8E9D57905C3BEEC4B6D5CEE0AC684FF5A53E96901F823C933C919FD87 +310 +F023F7F5D3802790B6A0717EAD84CD5F5220319E3872B1BCE77BEA660924DA31BC076B0131C526DF6BE03513B16035B7A61F979BC35AC487F6C3539EA484E7C2F2A4332BBFD31AAC9916185F07504A5C4DDD1D51F90AD07F02E42B5ED00434C7E961701868D9398EB35DC223D00EEAA35E1FBEFA485CBEBA9A38D5C353848C +310 +58790A5370DB9F84A9218671760DD2E9E4098C3EE1BE126E1D6206367D4F63E1E760288825B004F17EB73958D31504535884A73003E9E16FE2884B043F251D88370D0DB585DF0E8AD20ED3F4B3A3AE3E80CD701A56AA32643C85EFF0A7E07B3B5F7F5C177C874372AF1C7B4E7634A63924D376860CD00D97FFB6FA243DF203 +310 +4B36981D9F36368570CC3E1171A3452D6BA51624F5029C88345C6A46AEDC53F076C6704C922253EB6D712A4C58C283CD4B50BA70EB597F6A1B280F5306D01ACB20B9879CA602136BAAB4550542BB26285818E6CA02F7A556834D11A5018E922216A1F6B52936F98038232C11A84A6ADAB0B5D76AB25BBADB151904AF569233 +310 +0348E5CF9A7069E10388636DFC72B2E31892681207147230384BEB09C6011578E779CE08DB0594B1220A7694411E09229C9EA0DF51827AE67A242FCF09DFB612342D4BFBA4B62101B8025683A4B35519F3954E3979A2A2CC94F94C67036387AA43ADE9E044BA1099A205506D8CD2CCBDC5EC7AB9182D7BA33BF81AF8FEBC37 +310 +1E5D2D7BB3DBBBD162BEF4AF963E90575622113846AB7ABE03558A32C7F0BFFCA1883631A60C6E080A789BBE7B2FB3E78D03A1D1590C16DEC8BFF57AB3ABAB456F70EB0F7AD743F89ADF0DE77E7F345BCEAF160E275952F090648EE7F4036D9269BC3FC555154B45D602F9E15B410A65CDE564A7F5D514E67F1C439B39C150 +310 +E27F358856B1ABA520EC1A44C5A3CD108AC34791A28210AABE56F76904D1261F6D71EE8D71B96FFB7DF971DDB1D71F7BD7E3E1B063D89327FD70A46B932184CEB3C88324C521CDDB536A03998E2CBF29BBD8BE3B2CB1D1DF9E8700AFCEAB1553E73393622AA011DE936087455FD1124A2F49DC9AF5F62CC9321A934CF685AF +310 +EAC506CDBE0DE59799A55BCC9666414472FC3D162B1B8D86174034670174B0B998215CAC232A17503DCB298AA25F86542FE57F09321CA5ACEC8D2F61E07A1A02DD15B559A8605A1CF104F619E03CE86F891C755CA25EB1AF2B8A56AD35A98FBF9BFC09787425F40BE1D147742FB6ECA13B169F6B0843A3A1EB8FAE2A555C42 +310 +4B1F968BDE8F15D0AD862FC133A1FB874EC56937ADD4CABCB210CF4904AD2FCE0BDEC96347104DB46D6981546468B844EDA4371694B2E7D35D1F1C269BBE532571ED18A85D690CB3B14E82BC92A2D588A52EE41C508CBBDEE0D91A9B8B547F3862FEF22ABBEE7E1114875D70A84A60157F8C3ABCB552376AA8EC19E72184D2 +310 +B5FCEDDD81476CC9F6D8CC19E4DACA7A5DD35EAAB85722A44630E5C522D2DE8B0BF61583AAA1E3CE9C0F65A1E794EB2B91DA6C18681FF9309836697DFEB06E508195CE4F7F111891E70605B53A131DF41952DF56C73941838292E8DBEACCE3FF892E442BB0D68DC004394B1885413ED9A23D49207FC3A8A24387C22392C9BC +310 +7CEC6CF45B840E4F3F9573D81C6F98EE8BC2070CC36CA6FAB72284412AE4CC1B4BADA3DF60742AA69772A0653F42EBA66298850A4E6F2CB0D89C4287666F600426078E927A63C4098E8DE3BDC8F8E553D5FFC7C75E756CD59E2EB828C90C6782523895EF16A0EE2B6F4C27DF2FBA6607E11C2E37455E09735C384AA340D02F +310 +114AE16052F8A8E03D4049715E2ED7967B8C26B6D334FFAC1D94547B39E67B3992AFD9E4EDFC8B23A6E9ABCF2865C55EA8F35CC76C50EA894E9D15E5E46A0286A1C44CB1A82267EF9C2F3C81D752115A523002F4FBE17AF487334BA22889CB25E756BDDC42EB077855B575F498105AFFBEE73B7272A05E05041B9C111B6FB3 +310 +475800D5722AE6A925C4860154D1B466005A234217F098B17F3547AA3AAA4D55EA6157C023DF03207024F1FE47B84D7D436D6809BE005CC99BC70BBD3071380CCEA7FF02504B0304140006080800FA902C5CB95A924FE2000000550100003C0000006662782F45344532363341322D433737452D344133342D383533342D44 +310 +42354433303643464437452F7265736F75726365732F322F636E782E786D6C4D90CD6AC33010845FC52CF4685936A40D41565E22A75E822A6D5411596BF453DAB78F94AAD0D32E331FCBEC88F3F7E6872F8CC9515861661C060C9A8C0B7685926FE31186B3149128FFC360086AC3159A0C52D84865EF92C19B2ABEA9DE857B +310 +17F9D562C0E8F4750F1606ED554A2B24FD899B62AA643298EECCA8ACD8CC22262A51633D91DD86FD848EA8321A900B5F5E473E8FF372998F27FE763A2CEF626AA4141F44BEF32E648CB4BF2C5C535D434DC4C5D400294A749D6A6F54E32F1EABF1C4546D29528EB5838EE59FBD626E5316A727F2EB4A31B527EB783650672B +310 +443E00504B0304140006080800FA902C5CFF15A4A45D000000800000003A0000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F7265736F75726365732F636E782E786D6C4D8B3B0E80201005AF42B6F75B59F0390B113044D83508C6E30BC6C26AF226F3B8BA6360 +310 +974DA7271430F523308B2B198F9B80925DB700539227A2FCCB80A18E5640D320F996A81C9F32D6E9129A0D1EF74FCE750E6D57BC7165FBCA07504B0304140006080800FA902C5C20A839114201000056050000300000006662782F45344532363341322D433737452D344133342D383533342D444235443330364346443745 +310 +2F636E782E786D6CCD94C14A033110865F650978DCCDEE825A4A36050F3E8107F196CD4ED7D86CB22413B16F6F52D35691A287427B0B932FF0FF337F86AD3E265DBC83F3CA9A8E34554D0A30D20ECA8C1D09B82E17A45871E6ACC56F18298C98A023A94C381B9D0D732E0DB01641A7AA5666938B02D1A93E207852482DBCEF +310 +8897AF30894A04B403F84D350814555339F0363809F13DAA09F27BE940200C84B7757B57D64DD9B44FCD6259DF2F6FDB174613C9596FADCEBC3208CECE376D2D6D3C9A28A76634019C05A732953C107ED456F5CA301AEF39F351AF193387DB3971F3AC9514181B45AD44C03242202646BF60CE6872FCC3F7E3C3F351433C0D +310 +CA8144EBB6176B4373AA0D0769554CC4FFBAB003FF326FFBB768F972733F69380B3B9BDD7D727D8CEEEF24C43C0933EA6BFC000769E7CF7F5C2CA8E4359ADE2B3B9367BA5B8171F06923F24F504B0304140006080800FA902C5CCD468AE07F000000A30000000B0000006662782F636E782E786D6C4D8C410E83201444AF42 +310 +FE9ED60A8A0BC058A1F730150D294243A5E9F10B8D8B6EE6252F33C3FBCFE6D0DBC4970D5EC0E5540132FE1E66EB5701695F7007A8973C86B0FFD500F96933028A06C9D718D2F350B359A6E48A75D63F0EA9A9AE5B32D478644C633A108ABB2687BA368A54ED78534CE7C5B94C327E7F99E55E7E01504B0304140006080800 +310 +FA902C5CA6D797065F0000008200000007000000636E782E786D6C4DCB3B0E80201045D1AD90E9FD7516806B51190811670C8A61F982B1B0BAC9C97B72CA7B1037C6D3332918DA1E04D2CAC69353902EDB8C20262D23F3F59B81A079470595414B17391D1F19B4730A5583A7ED43BBE4025D9592775E5ADFFA01504B030414 +310 +0006080800FA902C5CECFD112DA800000026010000130000005B436F6E74656E745F54797065735D2E786D6C7D4F4B0EC22010BD0A61DF525D18634ABB506FE00510A79458060253536F2FD89D5197F3FED3F68B9BD80362B21E25DFD40D6780DADF2C1AC9671AAA3D677DD75E9E0112CB5A4C928F44E12044D22338956A1F +310 +003333F8E814E5331A1194BE2B0362DB343BA13D122055543278D79E6050F344ECBC6478EDCD76CE8EABAE5449AE4298AC56946789C28AAFBEABC53F3EAF09A84A1441B91F0101CD4780756578C173A578FFDDBD00504B0304140006080800FA902C5C3DEE336E64000000790000001B0000006175746F6465736B2D646573 +310 +69676E2D7061636B6167652E786D6C35CBC10E83200C00D05F21DCA56CA76D41FC96062B120735B69A7DBE268BB7777961F8D5AF396893C2ADB70FE7ADA196782C2DF776D7A97B5933C430F15651E5469C55D70F80A4992A3ADC954792C525AE70A1E4D6AD9816CC044FEFDF01FE3FDE907802504B0304140006080800FA90 +310 +2C5CB43C57B6F40000008E0100003D0000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F7265736F75726365732F322F636F72652E786D6C8550CB6E833010FC15B47703860056641C35A4FD829E7AB36C87580936F2A3EAE7D70E546A4F3DED6A76667677E8E96B +310 +79149FCA796DCD08B8ACA1504658A9CD3C420C5744A03831EAAC0DBF685018BEA811320C8CCECEC67587843541998C1A2BD50E72EF5580423C5233821737B5F092C79018FE5EAE5CDCF9AC4A5C6E3C4663D472976A99DCF4552B07EC65A82FEDD47688E0AE438733191079EB7BD44EA43F4FEDE1F5D24DB4CA6246835E7EB6 +310 +0BA77850125853373DAA31C2CD3B26C77A3876CD07AD3293511F5CFA795F9ABF4B745A6DE81FB7B8CAFFDDA236A16D76B74DE181E174DC73C06895D349E5195DAA3949F60D504B0304140006080800FA902C5C60CF858EF9000000960100003B0000006662782F45344532363341322D433737452D344133342D383533342D +310 +4442354433303643464437452F7265736F75726365732F636F72652E786D6C8550CB6E833010FC15B4770386F050641C35A4FD829E7AB3CC86580936F2A3EAE7D70E546A4F3DED6A76667677D8E96B79649F689D327A009A9790A19666527A1E20F82BE9213B71668DF1BF689069B1E0000906CE666BC2BA43D2688F3AA1DA +310 +4CB883C239F490C9476C0670F2868BC845F091E1EEF92AE45DCC98D37CE37116829A76A99AA29BBA2AB4C05FBAF2528F75437ADA34E470EE3BD2BFB52DA9C7BE3D8FF5E1F5D28CAC4862CEBC5A7EB64B8BC2E304BC2AAB969494D0EA9DF6C7B23B36D5072B129333E76DFC795F9ABE036ED19960253A566CD33FAE619DFE77 +310 +0D4AFBBADA5D3785034EE391CF0167454A29966784B1A644F937504B0304140006080800FA902C5CBA1C25D9F2000000B1010000310000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F636F72652E786D6C8D50C96EC32014FC15EBDDBD80B728C24469EC7E414F +310 +BD21200E4A0C164BD5CF2FC4AED4DE72E1A161869937E4F4BD3CB22F699D327A0054549049CD8D507A1E20F86B7E80EC448935C6FFA141A6D92207483050325B13D61DE2467BA913AA8D903BC89C931E32FE8897011CBFC985152CF8C870F76265FCCE6659A062E351E2D5F22BE556322F05505CE12EAF508EF0073A1CABFE +310 +D8E24F522626252128B15B2911DDD555490B746A26DCD5679C5FFA7ECA9B73DDE487361EE35B3BD65577791FFB8994494C89F336EEBC7F92B67B55BE09FF650EAB7821B3D2BEC6BBE1A6704051CCF37CA0A44C05C6F16C37CE5436FD01504B0304140006080800FA902C5C3B72EF9C54010000DD0200000C0000006662782F +310 +636F72652E786D6C8D52CB6EC32010FC15C41D3F63C7AA3051E3B45FD0536F041317C5060B8395CF2FF821D787A695258C6677677646E0D3A36BC1C8F520942C611C441070C9542D6453426B6EA880E044B056CAFC688340D28E97D0C390E0462BDB2F1053D270E951A96ABE807418B88180B5EE52C2817DF18E06D41AD731 +310 +DC839EB23B6D781007731FC1D68A7A1915B5631337C13524AFC7E8925669868A38CBD0E15C1C51F19EE728AD8AFC5CA587B74B56E1D00F136C44B7AA33CDA9E135244994E4288A519C7CC4C54B747CC9924F1CFA4E8207A39DE745D4BB83E4767DE070C6777CB6AFFFE6B3429A3459F8E6890192D8AD3715080E7D3EEE3785 +310 +B7CFD009BBFC0CBDB6AB85BB8346CE8CD20757A995DD4A236D2D77D411983E1CCE55C73C11FCC6933CE179CEE182A2B271AB51E3AE576BBCFA7EA79E6B349A07904A77B4DD969B57DCCE4D6867691D67AA55FA3FD3ABD535CCD03F4CF20D504B0304140006080800FA902C5C82B832EB08010000B201000008000000636F72 +310 +652E786D6C8D50CB6EC32010FC15B4776CB0E387224CD438ED17F4D41B35C445B1C13210B57F5F885DA9BDF5B4686676671876FA9C277457ABD3D6744033024899C14A6DC60E82BFE216D089B3D55AFF4B06C88859759060E06C5C6D587668B0C62B935063A5DA41E19CF28086293E3A70C3879A4526828F0A77CB1631DCC4 +310 +A8329A6D3ACEBC9E7F56875509AF24F08214352614D3E295B647D21CABE28DE549C959085AEE565A46777DD56A05FED4904BD997156E6955E1C3B96D70FB52D7B8ECDBFADC9787E74BD5B33C2D73E6FC1AFFBC1F89393D72E29E7C59BE519CBD5B3BED82184A226BA62FE084E589F8133A2CF21FA1B5F165B11FDC361C701A +310 +033D88689C1A8CE3516F9CA96DFE0D504B01021400140006080800FA902C5C0000000000000000000000003700000000000000000000000000000000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F617474726962757465732E62696E504B010214001400060808 +310 +00FA902C5C0000000000000000000000003500000000000000000000000000550000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F76657274696365732E62696E504B01021400140006080800FA902C5CF270F13306000000040000003600000000000000000000 +310 +000000A80000006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F747269616E676C65732E62696E504B01021400140006080800FA902C5CB5A795FFE3790000DE7900004200000000000000000000000000020100006662782F45344532363341322D433737452D3441 +310 +33342D383533342D4442354433303643464437452F7265736F75726365732F322F305F67656E657269632E706E67504B01021400140006080800FA902C5C51464CB489000000430100003600000000000000000000000000457B00006662782F45344532363341322D433737452D344133342D383533342D44423544333036 +310 +43464437452F6469726563746F72792E786D6C504B01021400140006080800FA902C5C358FBC2F47070000541C00003400000000000000000000000000227C00006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F6F626A656374732E786D6C504B0102140014000608 +310 +0800FA902C5CB95A924FE2000000550100003C00000000000000000000000000BB8300006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F7265736F75726365732F322F636E782E786D6C504B01021400140006080800FA902C5CFF15A4A45D000000800000003A0000 +310 +0000000000000000000000F78400006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F7265736F75726365732F636E782E786D6C504B01021400140006080800FA902C5C20A8391142010000560500003000000000000000000000000000AC8500006662782F45344532 +310 +363341322D433737452D344133342D383533342D4442354433303643464437452F636E782E786D6C504B01021400140006080800FA902C5CCD468AE07F000000A30000000B000000000000000000000000003C8700006662782F636E782E786D6C504B01021400140006080800FA902C5CA6D797065F000000820000000700 +310 +000000000000000000000000E4870000636E782E786D6C504B01021400140006080800FA902C5CECFD112DA8000000260100001300000000000000000000000000688800005B436F6E74656E745F54797065735D2E786D6C504B01021400140006080800FA902C5C3DEE336E64000000790000001B00000000000000000000 +310 +000000418900006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800FA902C5CB43C57B6F40000008E0100003D00000000000000000000000000DE8900006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F7265736F7572 +310 +6365732F322F636F72652E786D6C504B01021400140006080800FA902C5C60CF858EF9000000960100003B000000000000000000000000002D8B00006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F7265736F75726365732F636F72652E786D6C504B010214001400 +310 +06080800FA902C5CBA1C25D9F2000000B101000031000000000000000000000000007F8C00006662782F45344532363341322D433737452D344133342D383533342D4442354433303643464437452F636F72652E786D6C504B01021400140006080800FA902C5C3B72EF9C54010000DD0200000C0000000000000000000000 +310 +0000C08D00006662782F636F72652E786D6C504B01021400140006080800FA902C5C82B832EB08010000B201000008000000000000000000000000003E8F0000636F72652E786D6C504B050600000000120012002D0600006C9000000000 + 0 +XRECORD + 5 +257 +102 +{ACAD_REACTORS +330 +256 +102 +} +330 +256 +100 +AcDbXrecord +280 + 1 +102 +DISPLAYNAME + 1 +Metric50 +102 +FLAGS + 90 + 0 + 0 +CELLSTYLEMAP + 5 +248 +102 +{ACAD_REACTORS +330 +1B3 +102 +} +330 +1B3 +100 +AcDbCellStyleMap + 90 + 3 +300 +CELLSTYLE + 1 +TABLEFORMAT_BEGIN + 90 + 5 +170 + 1 + 91 + 0 + 92 + 32768 + 62 + 257 + 93 + 1 +300 +CONTENTFORMAT + 1 +CONTENTFORMAT_BEGIN + 90 + 0 + 91 + 0 + 92 + 512 + 93 + 0 +300 + + 40 +0.0 +140 +1.0 + 94 + 5 + 62 + 0 +340 +30 +144 +0.25 +309 +CONTENTFORMAT_END +171 + 1 +301 +MARGIN + 1 +CELLMARGIN_BEGIN + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.18 + 40 +0.18 +309 +CELLMARGIN_END + 94 + 6 + 95 + 1 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 2 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 4 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 8 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 16 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 32 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END +309 +TABLEFORMAT_END + 1 +CELLSTYLE_BEGIN + 90 + 1 + 91 + 1 +300 +_TITLE +309 +CELLSTYLE_END +300 +CELLSTYLE + 1 +TABLEFORMAT_BEGIN + 90 + 5 +170 + 1 + 91 + 0 + 92 + 0 + 62 + 257 + 93 + 1 +300 +CONTENTFORMAT + 1 +CONTENTFORMAT_BEGIN + 90 + 0 + 91 + 0 + 92 + 512 + 93 + 0 +300 + + 40 +0.0 +140 +1.0 + 94 + 5 + 62 + 0 +340 +30 +144 +0.18 +309 +CONTENTFORMAT_END +171 + 1 +301 +MARGIN + 1 +CELLMARGIN_BEGIN + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.18 + 40 +0.18 +309 +CELLMARGIN_END + 94 + 6 + 95 + 1 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 2 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 4 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 8 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 16 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 32 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END +309 +TABLEFORMAT_END + 1 +CELLSTYLE_BEGIN + 90 + 2 + 91 + 1 +300 +_HEADER +309 +CELLSTYLE_END +300 +CELLSTYLE + 1 +TABLEFORMAT_BEGIN + 90 + 5 +170 + 1 + 91 + 0 + 92 + 0 + 62 + 257 + 93 + 1 +300 +CONTENTFORMAT + 1 +CONTENTFORMAT_BEGIN + 90 + 0 + 91 + 0 + 92 + 512 + 93 + 0 +300 + + 40 +0.0 +140 +1.0 + 94 + 2 + 62 + 0 +340 +30 +144 +0.18 +309 +CONTENTFORMAT_END +171 + 1 +301 +MARGIN + 1 +CELLMARGIN_BEGIN + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.18 + 40 +0.18 +309 +CELLMARGIN_END + 94 + 6 + 95 + 1 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 2 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 4 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 8 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 16 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 32 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +0 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END +309 +TABLEFORMAT_END + 1 +CELLSTYLE_BEGIN + 90 + 3 + 91 + 2 +300 +_DATA +309 +CELLSTYLE_END + 0 +ENDSEC + 0 +SECTION + 2 +ACDSDATA + 70 + 2 + 71 + 8 + 0 +ACDSSCHEMA + 90 + 0 + 1 +AcDb_Thumbnail_Schema + 2 +AcDbDs::ID +280 + 10 + 91 + 8 + 2 +Thumbnail_Data +280 + 15 + 91 + 0 +101 +ACDSRECORD + 95 + 0 + 90 + 1 + 2 +AcDbDs::TreatedAsObjectData +280 + 1 +291 + 1 +101 +ACDSRECORD + 95 + 0 + 90 + 2 + 2 +AcDbDs::Legacy +280 + 1 +291 + 1 +101 +ACDSRECORD + 1 +AcDbDs::ID + 90 + 3 + 2 +AcDs:Indexable +280 + 1 +291 + 1 +101 +ACDSRECORD + 1 +AcDbDs::ID + 90 + 4 + 2 +AcDbDs::HandleAttribute +280 + 7 +282 + 1 + 0 +ACDSSCHEMA + 90 + 1 + 1 +AcDbDs::TreatedAsObjectDataSchema + 2 +AcDbDs::TreatedAsObjectData +280 + 1 + 91 + 0 + 0 +ACDSSCHEMA + 90 + 2 + 1 +AcDbDs::LegacySchema + 2 +AcDbDs::Legacy +280 + 1 + 91 + 0 + 0 +ACDSSCHEMA + 90 + 3 + 1 +AcDbDs::IndexedPropertySchema + 2 +AcDs:Indexable +280 + 1 + 91 + 0 + 0 +ACDSSCHEMA + 90 + 4 + 1 +AcDbDs::HandleAttributeSchema + 2 +AcDbDs::HandleAttribute +280 + 7 + 91 + 1 +284 + 1 + 0 +ACDSRECORD + 90 + 0 + 2 +AcDbDs::ID +280 + 10 +320 +14 + 2 +Thumbnail_Data +280 + 15 + 94 + 1321 +310 +89504E470D0A1A0A0000000D49484452000001000000009208030000009D75E4A800000300504C5445FFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000330000660000990000CC0000FF0033000033330033660033990033CC0033FF0066000066330066660066990066CC0066FF0099 +310 +000099330099660099990099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF0000FF3300FF6600FF9900FFCC00FFFF3300003300333300663300993300CC3300FF3333003333333333663333993333CC3333FF3366003366333366663366993366CC3366FF3399003399333399663399993399CC3399FF33CC00 +310 +33CC3333CC6633CC9933CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF6600006600336600666600996600CC6600FF6633006633336633666633996633CC6633FF6666006666336666666666996666CC6666FF6699006699336699666699996699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066 +310 +FF3366FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF9933009933339933669933999933CC9933FF9966009966339966669966999966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC3399CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFFCC0000CC00 +310 +33CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFFCCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0000FF0033FF0066FF0099FF00CCFF00FFFF3300FF3333 +310 +FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFFFFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF0000000D0D0D1A1A1A2828283535354343435050505D5D5D6B6B6B787878868686939393A1A1A1AEAEAEBB +310 +BBBBC9C9C9D6D6D6E4E4E4F1F1F1FFFFFF000000000000000000000000000000000000000000000000000000000000AD4AB4E4000001774944415478DAEDDC516EC2301045516FA1FBDF9D57C0122A51A018DB058454D0BC73BF22483E7CE399F19884D600000000000000000000000080D7F97A851202DE742D01047C9480 +310 +FE2C045413B0FEB26F3E6F0410408024584FC0F69CC334435242E022A01140000104941670788EB475401BCA7F5E08F4F41C4000010410400001D102D2B7C5AFF6C67E8E6C89114040C124D8EFE6C3C2DDA010100242400810701CD8ED28D77E0AF702FD916EA8E20C98EE769A80F398FB22060204DC09015580800C01B30B +310 +655012CC5D075CAF0453D601AAC0C245CC3A40129404E79A2F09862E8597CDD0F0A094194040E1666873E2D81D0594C1A912A475830B01CA60ED1C30DCF94D0E30031272C06645D4639AA19D80E43DC1CBE7A705714B16703C8814A01708797576F716EDB9256EE139A015CD01D313227FC4BF1C90F18CD06F8B70FABD60DE +310 +1630032A0998E2FD760F6018BC1940404D010F5F65065413F0FFD71240C0A70848FF4F51000000000000000000E0ED7C037133B47F981BFC610000000049454E44AE426082A03C807F27C1640ED8ED0E0FE53F4930F5EF05EE4640E1EBB926429DBDC147002D1A1D0881690104996EF344980973844098EA7B277436CC8500 +310 +0000246A85FF2E0E981BC0277F22000000F04600D5FF7293888888883E5BDF338781D35A19A8F60000000049454E44AE426082 + 0 +ACDSRECORD + 90 + 0 + 2 +AcDbDs::ID +280 + 10 +320 +1C + 2 +Thumbnail_Data +280 + 15 + 94 + 1054 +310 +89504E470D0A1A0A0000000D49484452000000B40000010008030000002D3FACD700000300504C5445FFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000330000660000990000CC0000FF0033000033330033660033990033CC0033FF0066000066330066660066990066CC0066FF0099 +310 +000099330099660099990099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF0000FF3300FF6600FF9900FFCC00FFFF3300003300333300663300993300CC3300FF3333003333333333663333993333CC3333FF3366003366333366663366993366CC3366FF3399003399333399663399993399CC3399FF33CC00 +310 +33CC3333CC6633CC9933CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF6600006600336600666600996600CC6600FF6633006633336633666633996633CC6633FF6666006666336666666666996666CC6666FF6699006699336699666699996699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066 +310 +FF3366FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF9933009933339933669933999933CC9933FF9966009966339966669966999966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC3399CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFFCC0000CC00 +310 +33CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFFCCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0000FF0033FF0066FF0099FF00CCFF00FFFF3300FF3333 +310 +FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFFFFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF0000000D0D0D1A1A1A2828283535354343435050505D5D5D6B6B6B787878868686939393A1A1A1AEAEAEBB +310 +BBBBC9C9C9D6D6D6E4E4E4F1F1F1FFFFFF000000000000000000000000000000000000000000000000000000000000AD4AB4E4000000D94944415478DAEDCE010D00300803B0F9974A10710C5CC0925641B385B23B752E9D3ED2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2 +310 +D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2 +310 +D2D2D2D2D2D2D2D2D2D2D2DFF4D4B9749F07D6F565D561FCB9450000000049454E44AE426082 + 0 +ENDSEC + 0 +EOF diff --git a/Rozpisky.Tests/BoundsTesty.cs b/Rozpisky.Tests/BoundsTesty.cs new file mode 100644 index 0000000..2466178 --- /dev/null +++ b/Rozpisky.Tests/BoundsTesty.cs @@ -0,0 +1,55 @@ +using Rozpisky.Dxf; +using Rozpisky.Rendering; +using Xunit; + +namespace Rozpisky.Tests; + +/// +/// Bbox pro fit fragmentu (loga do placeholderu): dřív se text počítal jen jako vkládací bod, +/// takže textová loga mohla přetéct rámeček. Teď se bbox počítá replayem do BoundsRenderer. +/// +public class BoundsTesty +{ + [Fact] + public void VsechnaLoga_MajiNeprazdneBounds() + { + foreach (var name in TestData.VsechnaLoga) + { + var tpl = new DxfTemplate(TestData.Logo(name)); + Assert.True(tpl.Bounds is { W: > 0, H: > 0 }, $"{name}: Bounds = {tpl.Bounds}"); + } + } + + [Fact] + public void Bounds_ZahrnujiTextIVyplne() + { + // sprava_zeleznic: 2 texty + 2 SOLID šrafy. Bbox musí obsáhnout všechny smyčky výplní + // a být širší než samotné výplně (texty SPRÁVA/ŽELEZNIC vedle značky). + var tpl = new DxfTemplate(TestData.Logo("sprava_zeleznic.dxf")); + var rec = new RecordingRenderer(); + tpl.Replay(rec); + + var body = rec.Fills.SelectMany(f => f).SelectMany(l => l).ToList(); + Assert.NotEmpty(body); + var b = tpl.Bounds!.Value; + Assert.True(body.All(p => p.X >= b.X - 1e-6 && p.X <= b.X + b.W + 1e-6 + && p.Y >= b.Y - 1e-6 && p.Y <= b.Y + b.H + 1e-6)); + double vyplneW = body.Max(p => p.X) - body.Min(p => p.X); + Assert.True(b.W > vyplneW, $"bbox W={b.W:F2} nezahrnuje texty (výplně W={vyplneW:F2})"); + } + + [Fact] + public void BoundsRenderer_RespektujeZarovnaniTextu() + { + // Center/Right roste od kotvy doleva; Top dolů – dřív box rostl vždy jen doprava nahoru. + var stred = new BoundsRenderer(); + stred.Text(0, 0, "ABCD", 10, HAlign.Center, VAlign.Middle); + Assert.True(stred.MinX < 0 && stred.MaxX > 0, $"Center: {stred.MinX}..{stred.MaxX}"); + Assert.True(stred.MinY < 0 && stred.MaxY > 0, $"Middle: {stred.MinY}..{stred.MaxY}"); + + var vpravo = new BoundsRenderer(); + vpravo.Text(0, 0, "ABCD", 10, HAlign.Right, VAlign.Top); + Assert.True(vpravo.MinX < 0 && vpravo.MaxX <= 1e-9, $"Right: {vpravo.MinX}..{vpravo.MaxX}"); + Assert.True(vpravo.MinY < 0 && vpravo.MaxY <= 1e-9, $"Top: {vpravo.MinY}..{vpravo.MaxY}"); + } +} diff --git a/Rozpisky.Tests/HatchTesty.cs b/Rozpisky.Tests/HatchTesty.cs new file mode 100644 index 0000000..a524fa8 --- /dev/null +++ b/Rozpisky.Tests/HatchTesty.cs @@ -0,0 +1,96 @@ +using Rozpisky.Dxf; +using Xunit; + +namespace Rozpisky.Tests; + +/// +/// Šrafy (HATCH) s hranovými hranicemi (úsečky, oblouky, elipsy) – dřív se tiše přeskočily, +/// takže tečky a oblé výplně v logách chyběly. Hodnoty jsou předpočítané ze skutečných DXF. +/// +public class HatchTesty +{ + private static RecordingRenderer Prehraj(string logo) + { + var rec = new RecordingRenderer(); + new DxfTemplate(TestData.Logo(logo)).Replay(rec); + return rec; + } + + private static (double W, double H, double Cx, double Cy) Bbox(IReadOnlyList<(double X, double Y)> loop) + { + double ax = double.MaxValue, ay = double.MaxValue, bx = double.MinValue, by = double.MinValue; + foreach (var (x, y) in loop) + { + ax = Math.Min(ax, x); ay = Math.Min(ay, y); + bx = Math.Max(bx, x); by = Math.Max(by, y); + } + return (bx - ax, by - ay, (ax + bx) / 2, (ay + by) / 2); + } + + [Fact] + public void Tesia_TeckaZKruhoveHrany_SeVyplni() + { + var rec = Prehraj("tesia.dxf"); + // 2 SOLID hatche: obrys žárovky (polyline s bulge) + tečka (plná kruhová hrana r≈0,78). + var smycky = rec.Fills.SelectMany(f => f).ToList(); + Assert.Equal(2, smycky.Count); + // Tečka = menší smyčka; průměr ≈ 1,56 mm (plný kruh z jediné obloukové hrany). + var tecka = smycky.OrderBy(l => Bbox(l).W).First(); + var (w, h, _, _) = Bbox(tecka); + Assert.InRange(w, 1.50, 1.62); + Assert.InRange(h, 1.50, 1.62); + } + + [Fact] + public void SudopBrno_MichaneUseckoveAObloukoveHrany_DajiUzavreneSmycky() + { + var rec = Prehraj("sudopBrno.dxf"); + // 6 SOLID šraf, všechny jen s hranovými cestami (úsečky + oblouky) → dřív 0 výplní. + // Referenční bboxy spočtené nezávisle hustým vzorkováním raw dat hran (512 dílků/oblouk). + Assert.Equal(6, rec.Fills.Count); + var smycky = rec.Fills.SelectMany(f => f).ToList(); + Assert.Equal(7, smycky.Count); // jeden hatch má 2 cesty, ostatní po jedné + Assert.All(smycky, l => Assert.True(l.Count >= 3)); + + // Nezávisle na pořadí (draw order přes SortEntitiesTable může hatche přeuspořádat) ověříme, + // že existují smyčky s referenčními bboxy – včetně plné kružnice r=3,825 (7,649²) z jediné + // obloukové hrany a řetězů úsečka+oblouk vč. ccw=false (zrcadlené úhly). Chybné znaménko/ + // otočení hrany nebo ztracená kružnice by referenci znatelně změnily. + MaSmyckuBbox(smycky, 7.649, 7.649); + MaSmyckuBbox(smycky, 5.571, 0.626); + MaSmyckuBbox(smycky, 2.092, 0.066); + MaSmyckuBbox(smycky, 7.807, 1.085); + MaSmyckuBbox(smycky, 11.290, 1.733); + } + + private static void MaSmyckuBbox(IReadOnlyList> smycky, double refW, double refH) + => Assert.Contains(smycky, l => + { + var (w, h, _, _) = Bbox(l); + return w >= refW - 0.1 && w <= refW + 0.02 && h >= refH - 0.1 && h <= refH + 0.02; + }); + + [Fact] + public void Signalprojekt_KruhovaAEliptickaHrana_SeVyplni() + { + var rec = Prehraj("signalprojekt.dxf"); + Assert.Equal(2, rec.Fills.Count); + var smycky = rec.Fills.SelectMany(f => f).ToList(); + // Eliptická cesta: poloosy 1,16 a 0,759·1,16 → bbox ≈ 1,76 × 2,32 (hlavní osa svisle). + Assert.Contains(smycky, l => + { + var (w, h, _, _) = Bbox(l); + double lo = Math.Min(w, h), hi = Math.Max(w, h); + return Math.Abs(hi - 2.32) < 0.05 && Math.Abs(lo - 1.76) < 0.05; + }); + } + + [Fact] + public void PolylinioveHranice_BezRegrese() + { + // exprojekt: 3 SOLID šrafy čistě s polyline hranicemi – musí zůstat beze změny. + var rec = Prehraj("exprojekt.dxf"); + Assert.Equal(3, rec.Fills.Count); + Assert.All(rec.Fills, f => Assert.All(f, l => Assert.True(l.Count >= 3))); + } +} diff --git a/Rozpisky.Tests/KodovaniTesty.cs b/Rozpisky.Tests/KodovaniTesty.cs new file mode 100644 index 0000000..72fb87d --- /dev/null +++ b/Rozpisky.Tests/KodovaniTesty.cs @@ -0,0 +1,130 @@ +using Rozpisky.Dxf; +using Rozpisky.Models; +using Xunit; + +namespace Rozpisky.Tests; + +/// +/// Čistá byznys logika převodu vstupů na SŽ-kódy a názvy: 47-poziční kód +/// (), rozpad čísla objektu () a automatické +/// jméno rozvržení (). Hlídá pevnou šířku/pozice kódu – +/// tichý posun by jinak zkazil kód na každém výkresu. Očekávané hodnoty jsou worked examples +/// z doc-komentářů příslušných metod. +/// +public class KodovaniTesty +{ + private static Projekt VzorProjekt() => new() + { + Skod = "SO12345", + StupenDokumentace = "DUSP", + }; + + private static Priloha VzorPriloha() => new() + { + CisloObjektu = "SO131.45.12.01", + OznaceniCasti = "D", + OznaceniDilciCasti = "D110", + TypPrilohy = "D1", + DilciPriloha = "1", + PoradiPrilohy = "001", + R1 = "V00", + }; + + [Fact] + public void Sestav_MaPevnychSedmActyricetZnaku_APozice() + { + var kod = KodPrilohy.Sestav(VzorProjekt(), VzorPriloha()); + Assert.Equal(KodPrilohy.Delka, kod.Length); + Assert.Equal("SO12345XXXX_DUSP_D110_SO1314512_01_D1_1_001_V00", kod); + } + + [Fact] + public void Sestav_PrazdnaPoleDoplniX_ProrezanaOrizne() + { + var p = new Projekt { Skod = "", StupenDokumentace = "" }; + var r = new Priloha { CisloObjektu = "", R1 = "" }; + var kod = KodPrilohy.Sestav(p, r); + Assert.Equal(KodPrilohy.Delka, kod.Length); + // Samé X kromě separátorů na pevných pozicích 12,17,22,32,35,38,40,44. + Assert.Equal("XXXXXXXXXXX_XXXX_XXXX_XXXXXXXXX_XX_XX_X_XXX_XXX", kod); + } + + [Fact] + public void SestavDesky_MaPevnyStred_XX_X_000() + { + var kod = KodPrilohy.SestavDesky(VzorProjekt(), VzorPriloha()); + Assert.Equal(KodPrilohy.Delka, kod.Length); + Assert.Equal("SO12345XXXX_DUSP_D110_SO1314512_01_XX_X_000_V00", kod); + } + + [Fact] + public void SestavSeznam_PrepiseStredAVoltelnouRevizi() + { + var kod = KodPrilohy.SestavSeznam(VzorProjekt(), VzorPriloha(), revizeKod: "P01"); + Assert.Equal(KodPrilohy.Delka, kod.Length); + Assert.Equal("SO12345XXXX_DUSP_D110_SO1314512_01_XX_X_001_P01", kod); + } + + [Theory] + [InlineData("V00", 'V', "00")] // vedoucí znak = typ, zbytek číslo + [InlineData("002", '0', "02")] // číslicový typ 0, číslo z dalších číslic + [InlineData("", 'X', "XX")] // bez revize → X + XX + public void RozpadRevize_SePromitneDoPozic45Az47(string rev, char typ, string cislo) + { + var r = VzorPriloha(); + r.R1 = rev; + var kod = KodPrilohy.Sestav(VzorProjekt(), r); + Assert.Equal(typ, kod[44]); // pozice 45 (0-based 44) + Assert.Equal(cislo, kod.Substring(45)); // pozice 46–47 + } + + [Fact] + public void ObjektOznaceni_Rozpad_RozdeliNaSlozky() + { + var o = ObjektOznaceni.Rozpad("SO131.45.12.01"); + Assert.Equal("SO", o.Prefix); + Assert.Equal("131", o.Cislo); + Assert.Equal("45", o.Usek); + Assert.Equal("12", o.Razeni); + Assert.Equal("01", o.Podobjekt); + } + + [Theory] + [InlineData("SK11", "SK", "11")] // jen řada, bez dalších segmentů + [InlineData("PS 22-3_4", "PS", "")] // libovolný oddělovač; "PS" samé písmeno → prázdné číslo + public void ObjektOznaceni_Rozpad_ZvladneOddelovaceAKratkeVstupy(string vstup, string prefix, string cislo) + { + var o = ObjektOznaceni.Rozpad(vstup); + Assert.Equal(prefix, o.Prefix); + Assert.Equal(cislo, o.Cislo); + } + + [Fact] + public void ObjektOznaceni_Rozpad_PrazdnyVstupDaSamePrazdne() + { + var o = ObjektOznaceni.Rozpad(""); + Assert.Equal(new ObjektOznaceni("", "", "", "", ""), o); + } + + [Fact] + public void JmenoRozvrzeniAuto_SkladaZObjektuAPrilohy() + { + var r = VzorPriloha(); + Assert.Equal("SO1314512_01_D1_1_001", r.JmenoRozvrzeniAuto); + } + + [Fact] + public void JmenoRozvrzeniAuto_ProDeskyJeObjektovySpecial() + { + var r = VzorPriloha(); + r.JeDesky = true; + Assert.Equal("SO1314512_01_XX_X_000", r.JmenoRozvrzeniAuto); + } + + [Fact] + public void NazevObjektovehoSpecialu_TypXXZustavaLiteralne() + { + Assert.Equal("SO1314512_01_XX_X_001", + Priloha.NazevObjektovehoSpecialu("SO131.45.12.01", "001")); + } +} diff --git a/Rozpisky.Tests/ObliqueTesty.cs b/Rozpisky.Tests/ObliqueTesty.cs new file mode 100644 index 0000000..a794064 --- /dev/null +++ b/Rozpisky.Tests/ObliqueTesty.cs @@ -0,0 +1,60 @@ +using System.IO; +using ACadSharp.Entities; +using ACadSharp.IO; +using Rozpisky.Dxf; +using Rozpisky.Rendering; +using Xunit; + +namespace Rozpisky.Tests; + +/// +/// Oblique úhel textu (kurzíva náklonem, DXF group 51/50) – dřív se ignoroval a text +/// se kreslil vzpřímeně. „SUDOP BRNO" má v DXF group 51 = 15° a group 41 (width) = 0,7. +/// +public class ObliqueTesty +{ + [Fact] + public void SudopBrno_TextNeseObliqueAWidthFactor() + { + var rec = new RecordingRenderer(); + new DxfTemplate(TestData.Logo("sudopBrno.dxf")).Replay(rec); + + var t = Assert.Single(rec.Texts); + Assert.Equal("SUDOP BRNO", t.Text); + Assert.Equal(15.0, t.Style.ObliqueDeg, 2); // DXF group 51 = 15.0 + Assert.Equal(0.7, t.WidthFactor, 3); + } + + [Fact] + public void OstatniLoga_MajiObliqueNula() + { + // Regrese: žádné jiné logo oblique nemá – nesmí se objevit nenulový sklon. + foreach (var name in TestData.VsechnaLoga.Where(n => n != "sudopBrno.dxf")) + { + var rec = new RecordingRenderer(); + new DxfTemplate(TestData.Logo(name)).Replay(rec); + Assert.All(rec.Texts, t => Assert.Equal(0, t.Style.ObliqueDeg)); + } + } + + [Fact] + public void DxfExport_ZachovaObliqueNaTextu() + { + var dxf = new DxfProfileRenderer(); + dxf.Layer("0", 0x000000, 0.25); + dxf.Text(10, 20, "Zkouška", 2.5, style: new TextStyle("Arial", ObliqueDeg: 3)); + + string path = Path.Combine(Path.GetTempPath(), $"rozpisky-oblique-{Guid.NewGuid():N}.dxf"); + try + { + DxfWriter.Write(path, dxf.Document, binary: false); + var doc = DxfReader.Read(path); + var t = Assert.Single(doc.Entities.OfType()); + Assert.Equal(3.0 * Math.PI / 180.0, t.ObliqueAngle, 6); + } + finally + { + File.Delete(path); + } + } +} diff --git a/Rozpisky.Tests/ObloukyTesty.cs b/Rozpisky.Tests/ObloukyTesty.cs new file mode 100644 index 0000000..86712ba --- /dev/null +++ b/Rozpisky.Tests/ObloukyTesty.cs @@ -0,0 +1,138 @@ +using System.IO; +using ACadSharp.Entities; +using ACadSharp.IO; +using Rozpisky.Dxf; +using Rozpisky.Rendering; +using Xunit; + +namespace Rozpisky.Tests; + +/// +/// Analytické oblouky end-to-end: model /, jemnost vzorkování +/// (sagitta) a round-trip přes DXF export () + import +/// (). Hlídá zejména znaménka (CCW/CW) a převod bulge → oblouk. +/// +public class ObloukyTesty +{ + private static (double W, double H, double MinX, double MinY) Bbox(IEnumerable<(double X, double Y)> pts) + { + double ax = double.MaxValue, ay = double.MaxValue, bx = double.MinValue, by = double.MinValue; + foreach (var (x, y) in pts) { ax = Math.Min(ax, x); ay = Math.Min(ay, y); bx = Math.Max(bx, x); by = Math.Max(by, y); } + return (bx - ax, by - ay, ax, ay); + } + + private static List<(double X, double Y)> Zplosti(Contour c, double tol = 0.005) + { + var pts = new List<(double X, double Y)>(); + foreach (var e in c.Edges) e.AppendPoints(pts, tol); + if (c.Edges.Count > 0) pts.Add((c.Edges[^1].EX, c.Edges[^1].EY)); + return pts; + } + + [Fact] + public void Edge_PointAt_A_Reversed_SediKoncoveBody() + { + // Čtvrtkružnice jednotkového kruhu proti směru hodin z (1,0) do (0,1). + var e = Edge.Arc(1, 0, 0, 1, 0, 0, r: 1, a0: 0, sweep: Math.PI / 2); + var s = e.PointAt(e.A0); + var en = e.PointAt(e.A0 + e.Sweep); + Assert.Equal(1, s.X, 6); Assert.Equal(0, s.Y, 6); + Assert.Equal(0, en.X, 6); Assert.Equal(1, en.Y, 6); + + var r = e.Reversed(); + Assert.Equal(e.EX, r.SX, 9); Assert.Equal(e.SX, r.EX, 9); + Assert.Equal(Math.PI / 2, r.A0, 9); + Assert.Equal(-Math.PI / 2, r.Sweep, 9); + // Otočená hrana má stejný geometrický počátek jako původní konec. + var rs = r.PointAt(r.A0); + Assert.Equal(0, rs.X, 6); Assert.Equal(1, rs.Y, 6); + } + + [Theory] + [InlineData(10.0, 0.02)] + [InlineData(3.825, 0.02)] + [InlineData(50.0, 0.05)] + public void ArcSegments_DodrziSagittu(double r, double tol) + { + double sweep = 2 * Math.PI; + int n = ContourGeometry.ArcSegments(sweep, r, tol); + double delta = sweep / n; + double sagitta = r * (1 - Math.Cos(delta / 2)); + Assert.True(sagitta <= tol + 1e-9, $"sagitta {sagitta} > tol {tol} (n={n})"); + } + + [Fact] + public void AnalytickyKruh_ZplosteniDaSpravnyBbox() + { + // Jediná Arc hrana přes celý kruh (r=3,825) → bbox = průměr, ostrý na tětivovou toleranci. + var e = Edge.Arc(3.825, 0, 3.825, 0, 0, 0, r: 3.825, a0: 0, sweep: 2 * Math.PI); + var (w, h, _, _) = Bbox(Zplosti(new Contour(new[] { e }, Closed: true))); + Assert.InRange(w, 7.64, 7.65); + Assert.InRange(h, 7.64, 7.65); + } + + [Theory] + [InlineData(1.0)] // CCW horní půlkruh + [InlineData(-1.0)] // CW dolní půlkruh – hlídá normalizaci úhlů v exportu i importu + public void RoundTrip_HatchOblouk_ZachovaGeometrii(double smer) + { + double r = 5; + double sweep = smer * Math.PI; + // Půldisk: oblouk (5,0)→(-5,0) + úsečka zpět. + var arc = Edge.Arc(5, 0, -5, 0, 0, 0, r, a0: 0, sweep: sweep); + var line = Edge.Line(-5, 0, 5, 0); + var contour = new Contour(new[] { arc, line }, Closed: true); + + var g = new DxfProfileRenderer(); + g.Layer("0", 0x000000); + g.Fill(new[] { contour }); + + // Export → dočasný DXF → import zpět a porovnání bboxu (sagitta ≤ 0,02 mm). + string path = Path.Combine(Path.GetTempPath(), $"rozpisky_arc_{Guid.NewGuid():N}.dxf"); + try + { + DxfWriter.Write(path, g.Document, binary: false); + var rec = new RecordingRenderer(); + new DxfTemplate(path).Replay(rec); + + var loop = Assert.Single(Assert.Single(rec.FillContours)); + var (w, h, minX, minY) = Bbox(Zplosti(loop, 0.02)); + Assert.InRange(w, 9.9, 10.05); // šířka = 2r + Assert.InRange(h, 4.95, 5.05); // výška = r + Assert.InRange(minX, -5.05, -4.95); + if (smer > 0) Assert.InRange(minY, -0.05, 0.05); // horní půlkruh: y ∈ [0, 5] + else Assert.InRange(minY, -5.05, -4.95); // dolní půlkruh: y ∈ [-5, 0] + } + finally { if (File.Exists(path)) File.Delete(path); } + } + + [Theory] + [InlineData(1.0)] + [InlineData(-1.0)] + public void StandaloneArc_Export_DaEntituArcSpravnymUhlem(double smer) + { + double r = 4, a0 = 0.3, sweep = smer * 1.2; + var edge = Edge.Arc(0, 0, 0, 0, cx: 1, cy: 2, r: r, a0: a0, sweep: sweep); + // dopočti skutečné koncové body + var s = edge.PointAt(a0); var e = edge.PointAt(a0 + sweep); + var contour = new Contour(new[] { Edge.Arc(s.X, s.Y, e.X, e.Y, 1, 2, r, a0, sweep) }, Closed: false); + + var g = new DxfProfileRenderer(); + g.Layer("0", 0); + g.Stroke(contour); + + var arc = Assert.Single(g.Document.Entities.OfType()); + Assert.Equal(1, arc.Center.X, 6); + Assert.Equal(2, arc.Center.Y, 6); + Assert.Equal(r, arc.Radius, 6); + // ARC entita je vždy CCW start→end; pro CW rozsah se meze prohodí, ale koncové BODY musí sedět. + var pStart = (arc.Center.X + r * Math.Cos(arc.StartAngle), arc.Center.Y + r * Math.Sin(arc.StartAngle)); + var pEnd = (arc.Center.X + r * Math.Cos(arc.EndAngle), arc.Center.Y + r * Math.Sin(arc.EndAngle)); + // množina koncových bodů oblouku se musí shodovat (v jednom z pořadí). + bool ok = (Blizko(pStart, s) && Blizko(pEnd, e)) || (Blizko(pStart, e) && Blizko(pEnd, s)); + Assert.True(ok, $"koncové body oblouku nesedí: start={pStart} end={pEnd} vs s={s} e={e}"); + + static bool Blizko((double X, double Y) a, (double X, double Y) b) + => Math.Abs(a.X - b.X) < 1e-6 && Math.Abs(a.Y - b.Y) < 1e-6; + } +} diff --git a/Rozpisky.Tests/PngHarness.cs b/Rozpisky.Tests/PngHarness.cs new file mode 100644 index 0000000..612371d --- /dev/null +++ b/Rozpisky.Tests/PngHarness.cs @@ -0,0 +1,36 @@ +using System.IO; +using Rozpisky.Dxf; +using SkiaSharp; +using Xunit; + +namespace Rozpisky.Tests; + +/// +/// Vyrenderuje všech 9 log do PNG – vizuální porovnání před/po změnách parseru +/// (uživatel nemá screenshoty aplikace, výstupní soubory ano). Cílová složka +/// z env proměnné ROZPISKY_PNG_OUT, jinak %TEMP%\rozpisky-loga-png. +/// +public class PngHarness +{ + [Fact] + public void VyrenderujVsechnaLogaDoPng() + { + string outDir = Environment.GetEnvironmentVariable("ROZPISKY_PNG_OUT") + ?? Path.Combine(Path.GetTempPath(), "rozpisky-loga-png"); + Directory.CreateDirectory(outDir); + + const int W = 900, H = 600; + foreach (var name in TestData.VsechnaLoga) + { + var tpl = new DxfTemplate(TestData.Logo(name)); + using var bmp = new SKBitmap(W, H); + using var canvas = new SKCanvas(bmp); + Exporters.RenderView(canvas, W, H, g => tpl.Replay(g), tpl.FrameBounds ?? tpl.Bounds, + zoom: 1, panXpx: 0, panYpx: 0); + using var img = SKImage.FromBitmap(bmp); + using var data = img.Encode(SKEncodedImageFormat.Png, 100); + using var fs = File.Create(Path.Combine(outDir, Path.ChangeExtension(name, ".png"))); + data.SaveTo(fs); + } + } +} diff --git a/Rozpisky.Tests/RecordingRenderer.cs b/Rozpisky.Tests/RecordingRenderer.cs new file mode 100644 index 0000000..7e03f62 --- /dev/null +++ b/Rozpisky.Tests/RecordingRenderer.cs @@ -0,0 +1,62 @@ +using Rozpisky.Rendering; + +namespace Rozpisky.Tests; + +/// +/// Testovací : nic nekreslí, jen zaznamenává volání primitiv, +/// aby testy mohly assertovat, co přesně parser (DxfTemplate.Replay) vyprodukoval. +/// Obrysy () se pro pohodlné assertování bboxů zaznamenávají jak analyticky +/// (, ), tak jemně zploštěné na body +/// (, ) – zpětně kompatibilní s dřívějšími testy. +/// +public sealed class RecordingRenderer : IProfileRenderer +{ + public sealed record TextCall(double X, double Y, string Text, double HeightMm, HAlign H, VAlign V, + double RotationDeg, TextStyle Style, double WidthFactor, double MaxWidthMm); + + /// Každé volání Fill = smyčky jednoho HATCH, zploštěné na body. + public List>> Fills { get; } = new(); + /// Analytické obrysy jednotlivých volání Fill (se zachovanými oblouky). + public List> FillContours { get; } = new(); + /// Analytické obrysy z volání Stroke (bulge polylinie, samostatné oblouky). + public List StrokeContours { get; } = new(); + public List Texts { get; } = new(); + /// Zploštěné polylinie i obrysy ze Stroke (kvůli zpětné kompatibilitě testů). + public List> Polylines { get; } = new(); + public int LineCount { get; private set; } + public int CircleCount { get; private set; } + + public void Layer(string name, int rgb, double lineWeightMm = 0.25) { } + + public void Line(double x1, double y1, double x2, double y2) => LineCount++; + + public void Polyline(IReadOnlyList<(double X, double Y)> pts, bool closed = false) => Polylines.Add(pts); + + public void Circle(double cx, double cy, double r) => CircleCount++; + + public void Stroke(Contour c) + { + StrokeContours.Add(c); + Polylines.Add(Zplosti(c)); + } + + public void Text(double x, double y, string text, double heightMm, + HAlign h = HAlign.Left, VAlign v = VAlign.Baseline, double rotationDeg = 0, + TextStyle style = default, double widthFactor = 1, double maxWidthMm = 0) + => Texts.Add(new TextCall(x, y, text, heightMm, h, v, rotationDeg, style, widthFactor, maxWidthMm)); + + public void Fill(IReadOnlyList loops) + { + FillContours.Add(loops); + Fills.Add(loops.Select(Zplosti).ToList()); + } + + /// Zploští obrys na body (jemně, sagitta ≤ 0,02 mm) – pro bbox asserty v testech. + private static IReadOnlyList<(double X, double Y)> Zplosti(Contour c) + { + var pts = new List<(double X, double Y)>(); + foreach (var e in c.Edges) e.AppendPoints(pts, maxSagitta: 0.02); + if (c.Edges.Count > 0) pts.Add((c.Edges[^1].EX, c.Edges[^1].EY)); + return pts; + } +} diff --git a/Rozpisky.Tests/Rozpisky.Tests.csproj b/Rozpisky.Tests/Rozpisky.Tests.csproj new file mode 100644 index 0000000..72ca235 --- /dev/null +++ b/Rozpisky.Tests/Rozpisky.Tests.csproj @@ -0,0 +1,21 @@ + + + + net10.0-windows + enable + enable + true + false + + + + + + + + + + + + + diff --git a/Rozpisky.Tests/SkiaRenderTesty.cs b/Rozpisky.Tests/SkiaRenderTesty.cs new file mode 100644 index 0000000..b3e30bd --- /dev/null +++ b/Rozpisky.Tests/SkiaRenderTesty.cs @@ -0,0 +1,53 @@ +using Rozpisky.Rendering; +using SkiaSharp; +using Xunit; + +namespace Rozpisky.Tests; + +/// +/// Skutečný render Skií (ne jen zplošťení obrysu): plná kružnice tvořená jedinou obloukovou +/// hranou (sweep 360°) se musí vykreslit, ne „propadnout" degenerovaným ArcTo. +/// +public class SkiaRenderTesty +{ + /// Vykreslí kresbu na 200×200 px bitmapu (mm 1:1, střed plátna = mm (0,0)) a vrátí + /// počet nebílých pixelů. + private static int PocetVyplnenych(Action draw) + { + const int S = 200; + using var bmp = new SKBitmap(S, S); + using var canvas = new SKCanvas(bmp); + canvas.Clear(SKColors.White); + SKPoint Map(double x, double y) => new((float)(S / 2 + x * 10), (float)(S / 2 - y * 10)); // 10 px/mm, Y nahoru + using (var r = new SkiaProfileRenderer(canvas, Map, pxPerMm: 10)) + draw(r); + + int n = 0; + for (int y = 0; y < S; y++) + for (int x = 0; x < S; x++) + if (bmp.GetPixel(x, y) != SKColors.White) n++; + return n; + } + + [Fact] + public void PlnaKruznice_JakoJednaObloukovaHrana_SeVyplni() + { + // Kruh r=5 mm ze středu (0,0), jediná Arc hrana se sweepem 360°. + var edge = Edge.Arc(5, 0, 5, 0, 0, 0, r: 5, a0: 0, sweep: 2 * Math.PI); + var contour = new Contour(new[] { edge }, Closed: true); + + int filled = PocetVyplnenych(g => { g.Layer("0", 0); g.Fill(new[] { contour }); }); + + // Plocha kruhu r=5 mm × (10 px/mm)² = π·2500 ≈ 7854 px; tolerantně > 5000. + Assert.True(filled > 5000, $"plná kružnice se nevykreslila (vyplněno {filled} px)"); + } + + [Fact] + public void ObloukovyOblouk_SeVykresli_Stroke() + { + // Kontrolní: běžný oblouk (< 360°) přes Stroke musí něco nakreslit. + var edge = Edge.Arc(5, 0, 0, 5, 0, 0, r: 5, a0: 0, sweep: Math.PI / 2); + int filled = PocetVyplnenych(g => { g.Layer("0", 0); g.Stroke(new Contour(new[] { edge }, Closed: false)); }); + Assert.True(filled > 50, $"oblouk se nevykreslil (vyplněno {filled} px)"); + } +} diff --git a/Rozpisky.Tests/TestData.cs b/Rozpisky.Tests/TestData.cs new file mode 100644 index 0000000..52e3dd4 --- /dev/null +++ b/Rozpisky.Tests/TestData.cs @@ -0,0 +1,31 @@ +using System.IO; + +namespace Rozpisky.Tests; + +/// Cesty k testovacím datům (loga DXF dodávaná s programem). +public static class TestData +{ + /// Kořen repozitáře – nalezen od bin složky testů směrem nahoru podle Rozpisky.sln. + public static string RepoRoot { get; } = NajdiKoren(); + + /// Plná cesta k logu ve zdrojové složce Rozpisky\loga. + public static string Logo(string fileName) => Path.Combine(RepoRoot, "Rozpisky", "loga", fileName); + + /// Všech 9 log dodávaných s programem. + public static readonly string[] VsechnaLoga = + { + "eu_op_doprava.dxf", "md_sfdi.dxf", "sprava_zeleznic.dxf", "exprojekt.dxf", + "signalprojekt.dxf", "tesia.dxf", "mco.dxf", "exprojekt+mco.dxf", "sudopBrno.dxf", + }; + + private static string NajdiKoren() + { + var dir = new DirectoryInfo(AppContext.BaseDirectory); + while (dir is not null) + { + if (File.Exists(Path.Combine(dir.FullName, "Rozpisky.sln"))) return dir.FullName; + dir = dir.Parent!; + } + throw new InvalidOperationException("Rozpisky.sln nenalezen nad " + AppContext.BaseDirectory); + } +} diff --git a/Rozpisky.sln b/Rozpisky.sln new file mode 100644 index 0000000..c181e24 --- /dev/null +++ b/Rozpisky.sln @@ -0,0 +1,51 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.37111.16 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rozpisky", "Rozpisky\Rozpisky.csproj", "{4FF58C86-3728-4E15-A904-069C6DE219E8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rozpisky.Tests", "Rozpisky.Tests\Rozpisky.Tests.csproj", "{4DEE3E71-22B2-40BC-8084-29E7F6079350}" +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 + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Debug|x64.ActiveCfg = Debug|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Debug|x64.Build.0 = Debug|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Debug|x86.ActiveCfg = Debug|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Debug|x86.Build.0 = Debug|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Release|Any CPU.Build.0 = Release|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Release|x64.ActiveCfg = Release|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Release|x64.Build.0 = Release|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Release|x86.ActiveCfg = Release|Any CPU + {4FF58C86-3728-4E15-A904-069C6DE219E8}.Release|x86.Build.0 = Release|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Debug|x64.ActiveCfg = Debug|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Debug|x64.Build.0 = Debug|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Debug|x86.ActiveCfg = Debug|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Debug|x86.Build.0 = Debug|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Release|Any CPU.Build.0 = Release|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Release|x64.ActiveCfg = Release|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Release|x64.Build.0 = Release|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Release|x86.ActiveCfg = Release|Any CPU + {4DEE3E71-22B2-40BC-8084-29E7F6079350}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B4632CE4-CE7F-49CC-BEA0-29FE22B52CDC} + EndGlobalSection +EndGlobal diff --git a/Rozpisky/App.xaml b/Rozpisky/App.xaml new file mode 100644 index 0000000..25ff338 --- /dev/null +++ b/Rozpisky/App.xaml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/Rozpisky/App.xaml.cs b/Rozpisky/App.xaml.cs new file mode 100644 index 0000000..38960aa --- /dev/null +++ b/Rozpisky/App.xaml.cs @@ -0,0 +1,59 @@ +using System.IO; +using System.Text; +using System.Windows; +using System.Windows.Threading; + +namespace Rozpisky +{ + /// + /// Globální záchytná síť pro neošetřené výjimky – aplikace nesmí spadnout bez stopy. + /// Každá výjimka se zapíše do error.log vedle .exe (stejný portable princip jako + /// cad.json/layout.json) a uživateli se ukáže MessageBox. Výjimky na UI + /// (Dispatcher) vlákně se označí jako zpracované, takže aplikace běží dál – rozdělaný + /// projekt zůstane otevřený a jde uložit. + /// + public partial class App : Application + { + protected override void OnStartup(StartupEventArgs e) + { + base.OnStartup(e); + + // Úklid diagnostického logu tisku, ať po měsících nenaroste do enormních rozměrů. + Cad.CadTiskService.UklidLog(); + + DispatcherUnhandledException += (_, args) => + { + ZalogujChybu("UI (Dispatcher)", args.Exception); + args.Handled = true; // aplikace přežije – projekt jde pořád uložit + UkazChybu(args.Exception); + }; + + // Výjimky mimo UI vlákno – proces už nejde zachránit, ale aspoň zůstane log. + AppDomain.CurrentDomain.UnhandledException += (_, args) => + ZalogujChybu("AppDomain", args.ExceptionObject as Exception); + + // Neodchycené výjimky z fire-and-forget Tasků – SetObserved zabrání eskalaci. + TaskScheduler.UnobservedTaskException += (_, args) => + { + ZalogujChybu("Task (unobserved)", args.Exception); + args.SetObserved(); + }; + } + + private static void ZalogujChybu(string zdroj, Exception? ex) + { + try + { + string radek = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {zdroj}: {ex?.ToString() ?? "(neznámá výjimka)"}" + + Environment.NewLine + Environment.NewLine; + File.AppendAllText(Path.Combine(AppContext.BaseDirectory, "error.log"), radek, Encoding.UTF8); + } + catch { /* read-only složka apod. – MessageBox se ukáže i tak */ } + } + + private static void UkazChybu(Exception ex) => MessageBox.Show( + "Nastala neočekávaná chyba, aplikace ale běží dál – doporučujeme uložit projekt.\n\n" + + $"{ex.Message}\n\nPodrobnosti jsou v souboru error.log vedle aplikace.", + "Neočekávaná chyba", MessageBoxButton.OK, MessageBoxImage.Error); + } +} diff --git a/Rozpisky/AssemblyInfo.cs b/Rozpisky/AssemblyInfo.cs new file mode 100644 index 0000000..b0ec827 --- /dev/null +++ b/Rozpisky/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/Rozpisky/Behaviors/GridDelete.cs b/Rozpisky/Behaviors/GridDelete.cs new file mode 100644 index 0000000..fcbd3ed --- /dev/null +++ b/Rozpisky/Behaviors/GridDelete.cs @@ -0,0 +1,64 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Input; + +namespace Rozpisky.Behaviors; + +/// +/// Delete na needitovaném výběru buněk u vymaže obsah textových buněk +/// (jako v Excelu), bez vstupu do edit módu. Needitovatelné a netextové sloupce (checkboxy, +/// auto „Jméno rozvržení") nechá být; při otevřené editaci nechá klávesu projít jako mazání +/// textu. Zapíná se per-grid: beh:GridDelete.Enabled="True". +/// +public static class GridDelete +{ + public static readonly DependencyProperty EnabledProperty = + DependencyProperty.RegisterAttached("Enabled", typeof(bool), typeof(GridDelete), + new PropertyMetadata(false, OnEnabledChanged)); + + public static void SetEnabled(DependencyObject o, bool v) => o.SetValue(EnabledProperty, v); + public static bool GetEnabled(DependencyObject o) => (bool)o.GetValue(EnabledProperty); + + private static void OnEnabledChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + if (o is not DataGrid grid) return; + if ((bool)e.NewValue) grid.PreviewKeyDown += OnKeyDown; + else grid.PreviewKeyDown -= OnKeyDown; + } + + private static void OnKeyDown(object sender, KeyEventArgs e) + { + if (e.Key != Key.Delete || sender is not DataGrid grid) return; + if (IsEditing(e.OriginalSource)) return; + if (ClearSelectedCells(grid)) e.Handled = true; + } + + /// Vymaže obsah vybraných textových buněk. Vrací true, když se aspoň jedna dala + /// vymazat – tj. klávesa se má považovat za zpracovanou. + private static bool ClearSelectedCells(DataGrid grid) + { + if (grid.IsReadOnly) return false; + bool any = false; + foreach (var info in grid.SelectedCells) + { + if (!info.IsValid || info.Item is null || info.Column is null || info.Column.IsReadOnly) continue; + if (info.Item == CollectionView.NewItemPlaceholder) continue; + if (PathOf(info.Column) is not { } path) continue; + var pi = info.Item.GetType().GetProperty(path); + if (pi is null || !pi.CanWrite || pi.PropertyType != typeof(string)) continue; + pi.SetValue(info.Item, string.Empty); + any = true; + } + return any; + } + + /// Je fokus v editačním prvku buňky (probíhá editace)? Pak Delete necháme projít jako mazání textu. + private static bool IsEditing(object? source) + => source is System.Windows.Controls.Primitives.TextBoxBase or ComboBox; + + /// Cesta vlastnosti pro sloupec: přímá Binding (text/checkbox) nebo ClipboardContentBinding (šablona). + private static string? PathOf(DataGridColumn? col) + => (col as DataGridBoundColumn)?.Binding is Binding b ? b.Path.Path + : (col?.ClipboardContentBinding as Binding)?.Path.Path; +} diff --git a/Rozpisky/Behaviors/GridPaste.cs b/Rozpisky/Behaviors/GridPaste.cs new file mode 100644 index 0000000..2d4ed9e --- /dev/null +++ b/Rozpisky/Behaviors/GridPaste.cs @@ -0,0 +1,237 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Input; + +namespace Rozpisky.Behaviors; + +/// +/// Schránka pro (Ctrl+C / Ctrl+V) přes ClipboardContentBinding sloupců – +/// WPF DataGrid vkládání nativně neumí a jeho kopírování se v jiných aplikacích (Excel) nemusí projevit +/// (data dává na schránku bez „flush"). Zapíná se per-grid: beh:GridPaste.Enabled="True". +/// +/// - Ctrl+C: obálku výběru zkopíruje jako TSV (tab mezi sloupci, CRLF mezi řádky) a přes +/// (s persistem) – Excel i vlastní grid ji pak převezmou. +/// - Ctrl+V: schránku (TSV) vloží do buněk. Při vícebuňkovém výběru se oblast výběru vyplní +/// dlaždicově (vzor ze schránky se opakuje – jako fill handle); jinak se blok vloží od aktivní buňky +/// doprava/dolů. Řádky se nepřidávají (přetečení se zahodí), mimo rozsah sloupců i read-only sloupce +/// se přeskočí. Zápis jde přes (bez edit +/// módu), nekonvertibilní hodnota buňku tiše vynechá – shodně s Theming.GridFill. +/// - Ctrl+D: „fill down" jako v Excelu – při výběru přes víc řádků vyplní horní řádek výběru +/// dolů do zbytku výběru; u výběru v jednom řádku zkopíruje hodnoty z řádku nad ním. Kopíruje se +/// přes ClipboardContentBinding sloupce (bez edit módu), stejně jako fill handle. +/// +/// Při otevřené editaci buňky se klávesa nechá projít (kopíruje/vkládá se text v editoru). Bez +/// CSV-uvozovkového escapování a bez Ctrl+Z – shodně s fill handle. +/// +public static class GridPaste +{ + public static readonly DependencyProperty EnabledProperty = + DependencyProperty.RegisterAttached("Enabled", typeof(bool), typeof(GridPaste), + new PropertyMetadata(false, OnEnabledChanged)); + + public static void SetEnabled(DependencyObject o, bool v) => o.SetValue(EnabledProperty, v); + public static bool GetEnabled(DependencyObject o) => (bool)o.GetValue(EnabledProperty); + + private static void OnEnabledChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + if (o is not DataGrid grid) return; + if ((bool)e.NewValue) grid.PreviewKeyDown += OnKeyDown; + else grid.PreviewKeyDown -= OnKeyDown; + } + + private static void OnKeyDown(object sender, KeyEventArgs e) + { + if ((Keyboard.Modifiers & ModifierKeys.Control) == 0) return; + if (sender is not DataGrid grid) return; + if (IsEditing(e.OriginalSource)) return; // rozeditovaná buňka → schránku řeší editor + if (e.Key == Key.C) { if (Copy(grid)) e.Handled = true; } + else if (e.Key == Key.V) { if (Paste(grid)) e.Handled = true; } + else if (e.Key == Key.D) { if (FillDown(grid)) e.Handled = true; } + } + + // ---------------------------------------------------------------- kopírování + + /// Zkopíruje obálku výběru jako TSV na schránku (s persistem, ať ji převezme i Excel). + private static bool Copy(DataGrid grid) + { + if (SelectionBounds(grid) is not (int r0, int r1, int c0, int c1)) return false; + var cols = ColumnsByDisplay(grid); + + var sb = new StringBuilder(); + for (int r = r0; r <= r1; r++) + { + if (r < 0 || r >= grid.Items.Count) continue; + var item = grid.Items[r]; + if (item == CollectionView.NewItemPlaceholder) continue; + for (int c = c0; c <= c1; c++) + { + if (c > c0) sb.Append('\t'); + if (c >= 0 && c < cols.Count) + sb.Append(cols[c].OnCopyingCellClipboardContent(item)?.ToString()); + } + sb.Append("\r\n"); + } + + try { Clipboard.SetText(sb.ToString(), TextDataFormat.UnicodeText); return true; } + catch { return false; } // schránku drží jiný proces → nech případně proběhnout nativní kopii + } + + // ---------------------------------------------------------------- vkládání + + private static bool Paste(DataGrid grid) + { + if (grid.IsReadOnly) return false; + var text = Clipboard.ContainsText() ? Clipboard.GetText() : null; + if (string.IsNullOrEmpty(text)) return false; + + grid.CommitEdit(DataGridEditingUnit.Row, true); + var data = ParseTsv(text); + if (data.Count == 0) return false; + var cols = ColumnsByDisplay(grid); + + // Vícebuňkový výběr → vyplň jeho obálku dlaždicově vzorem ze schránky (jako fill handle); + // 1×1 schránka tím vyplní celý výběr, 1×N se v širším výběru opakuje. + if (SelectionBounds(grid) is (int r0, int r1, int c0, int c1) && (r1 > r0 || c1 > c0)) + { + for (int r = r0; r <= r1; r++) + { + if (r < 0 || r >= grid.Items.Count) continue; + var item = grid.Items[r]; + if (item == CollectionView.NewItemPlaceholder) continue; + var src = data[Mod(r - r0, data.Count)]; + if (src.Length == 0) continue; + for (int c = c0; c <= c1; c++) + if (c >= 0 && c < cols.Count) + WriteCell(cols[c], item, src[Mod(c - c0, src.Length)]); + } + return true; + } + + // Jedna buňka (nebo bez výběru) → vlož celý blok od aktivní buňky doprava/dolů. + if (Anchor(grid) is not (int ar, int ac)) return false; + for (int i = 0; i < data.Count; i++) + { + int r = ar + i; + if (r >= grid.Items.Count) break; + var item = grid.Items[r]; + if (item == CollectionView.NewItemPlaceholder) continue; + var src = data[i]; + for (int j = 0; j < src.Length; j++) + { + int c = ac + j; + if (c >= 0 && c < cols.Count) WriteCell(cols[c], item, src[j]); + } + } + return true; + } + + // ---------------------------------------------------------------- fill down (Ctrl+D) + + /// Excelovské „fill down": vícebuňkový výběr přes řádky vyplní horní řádek výběru dolů; + /// výběr v jediném řádku převezme hodnoty z řádku nad ním. Kopíruje se přes ClipboardContentBinding + /// sloupce (bez edit módu). Vrací true, když se aspoň něco dalo zapsat. + private static bool FillDown(DataGrid grid) + { + if (grid.IsReadOnly) return false; + if (SelectionBounds(grid) is not (int r0, int r1, int c0, int c1)) return false; + + grid.CommitEdit(DataGridEditingUnit.Row, true); + var cols = ColumnsByDisplay(grid); + + // Výběr v jednom řádku → zdroj je řádek nad výběrem (jinak horní řádek výběru). + int srcRow = r1 > r0 ? r0 : r0 - 1; + if (srcRow < 0 || srcRow >= grid.Items.Count) return false; + var srcItem = grid.Items[srcRow]; + if (srcItem == CollectionView.NewItemPlaceholder) return false; + + bool any = false; + for (int r = r1 > r0 ? r0 + 1 : r0; r <= r1; r++) + { + if (r < 0 || r >= grid.Items.Count) continue; + var item = grid.Items[r]; + if (item == CollectionView.NewItemPlaceholder) continue; + for (int c = c0; c <= c1; c++) + if (c >= 0 && c < cols.Count && CopyCell(cols[c], srcItem, item)) any = true; + } + return any; + } + + /// Zkopíruje hodnotu buňky ze zdrojové do cílové položky přes clipboard-binding sloupce + /// (bez edit módu). Read-only sloupec a nekonvertibilní hodnotu tiše vynechá. Vrací true při zápisu. + private static bool CopyCell(DataGridColumn column, object srcItem, object dstItem) + { + if (column.IsReadOnly) return false; + try { column.OnPastingCellClipboardContent(dstItem, column.OnCopyingCellClipboardContent(srcItem)); return true; } + catch { return false; } + } + + /// Zapíše hodnotu do buňky přes clipboard-binding sloupce (bez edit módu). Read-only sloupec + /// a nekonvertibilní hodnotu tiše vynechá – stejně jako GridFill.CopyCell. + private static void WriteCell(DataGridColumn column, object item, string value) + { + if (column.IsReadOnly) return; + try { column.OnPastingCellClipboardContent(item, value); } + catch { /* nekonvertibilní hodnota (např. text do bool/čísla) → buňku vynech */ } + } + + // ---------------------------------------------------------------- pomocné + + /// Obálka výběru: min/max index řádku a min/max DisplayIndex sloupce, nebo null. + /// (DisplayIndex je souvislý 0..n-1, takže odpovídá indexu do .) + private static (int r0, int r1, int c0, int c1)? SelectionBounds(DataGrid grid) + { + var cells = grid.SelectedCells; + if (cells.Count == 0) return null; + int r0 = int.MaxValue, r1 = -1, c0 = int.MaxValue, c1 = -1; + var rowIndex = new Dictionary(); // Items.IndexOf je O(n), memoizuj + foreach (var cell in cells) + { + if (!cell.IsValid || cell.Column is null || cell.Item is null) continue; + if (cell.Item == CollectionView.NewItemPlaceholder) continue; + if (!rowIndex.TryGetValue(cell.Item, out int r)) + rowIndex[cell.Item] = r = grid.Items.IndexOf(cell.Item); + if (r < 0) continue; + if (r < r0) r0 = r; + if (r > r1) r1 = r; + int c = cell.Column.DisplayIndex; + if (c < c0) c0 = c; + if (c > c1) c1 = c; + } + return r1 < 0 ? null : (r0, r1, c0, c1); + } + + /// Kotva vkládání bloku: aktivní buňka (řádek, DisplayIndex sloupce), fallback první vybraná. + private static (int r, int c)? Anchor(DataGrid grid) + { + var cur = grid.CurrentCell; + if (cur.IsValid && cur.Column is not null && cur.Item is not null + && cur.Item != CollectionView.NewItemPlaceholder) + { + int r = grid.Items.IndexOf(cur.Item); + if (r >= 0) return (r, cur.Column.DisplayIndex); + } + return SelectionBounds(grid) is (int r0, _, int c0, _) ? (r0, c0) : null; + } + + private static List ColumnsByDisplay(DataGrid grid) + => grid.Columns.OrderBy(c => c.DisplayIndex).ToList(); + + /// Rozparsuje TSV: řádky dle CR/LF, buňky dle tabulátoru. Koncový prázdný řádek + /// (Excel přidává závěrečné CRLF) se zahodí. + private static List ParseTsv(string text) + { + var radky = text.Replace("\r\n", "\n").Replace('\r', '\n').Split('\n').ToList(); + while (radky.Count > 0 && radky[^1].Length == 0) radky.RemoveAt(radky.Count - 1); + return radky.Select(r => r.Split('\t')).ToList(); + } + + private static int Mod(int a, int m) => ((a % m) + m) % m; + + /// Je fokus v editačním prvku buňky? Pak Ctrl+C/V necháme na editoru. + private static bool IsEditing(object? source) + => source is System.Windows.Controls.Primitives.TextBoxBase or ComboBox; +} diff --git a/Rozpisky/Cad/CadEngine.cs b/Rozpisky/Cad/CadEngine.cs new file mode 100644 index 0000000..699de81 --- /dev/null +++ b/Rozpisky/Cad/CadEngine.cs @@ -0,0 +1,19 @@ +namespace Rozpisky.Cad; + +/// +/// Jeden podporovaný CAD systém – ProgID pro COM attach a popisek do UI (PODKLAD_CAD_Layout_Tisk.md §1). +/// +/// ProgID může (a někdy musí) být verzově konkrétní: verzově nezávislé „ZWCAD.Application" se u +/// některých instalací nenapojí na běžící instanci (CLSIDFromProgID vrátí CLSID, pod kterým +/// instance není v Running Object Table), zatímco „ZWCAD.Application.2023" míří rovnou na správnou třídu. +/// Proto seed v nabízí i verzované položky a UI má režim „Manuálně" na +/// vlastní ProgID (Nastavení → CAD). +/// +/// +public sealed class CadEngine +{ + public string ProgId { get; set; } = ""; + public string Nazev { get; set; } = ""; + + public override string ToString() => Nazev; +} diff --git a/Rozpisky/Cad/CadEnginesStore.cs b/Rozpisky/Cad/CadEnginesStore.cs new file mode 100644 index 0000000..bac688f --- /dev/null +++ b/Rozpisky/Cad/CadEnginesStore.cs @@ -0,0 +1,101 @@ +using System.IO; +using System.Text.Encodings.Web; +using System.Text.Json; +using Rozpisky.Data; + +namespace Rozpisky.Cad; + +/// +/// Načítání/ukládání seznamu podporovaných CAD systémů + naposledy vybraného enginu do JSON souboru +/// vedle .exe (portable). Stejný princip jako / +/// : CAD je vlastnost stroje (ne zakázky), takže výběr žije mimo +/// projekt a je globální pro celou instalaci. +/// +public static class CadEnginesStore +{ + public const string SouborNazev = "cad.json"; + + private static readonly JsonSerializerOptions Opts = new() + { + WriteIndented = true, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; + + /// Výchozí umístění: soubor vedle .exe (portable). + public static string DefaultPath => Path.Combine(AppContext.BaseDirectory, SouborNazev); + + /// Uložený výběr CADu: buď předdefinovaný engine (), nebo + /// ruční režim „Manuálně" ( + ). Režim a ruční + /// text se drží zvlášť, aby se po startu obnovil přesně stav UI včetně (i prázdného) inputboxu – + /// a aby ruční hodnota shodná s předdefinovaným ProgID nepřeklopila UI zpět do comboboxu. + public readonly record struct Vyber(string? VybranyProgId, bool RucniRezim, string? RucniProgId); + + /// Načte seznam enginů a uložený výběr. Když soubor chybí/je poškozený, vrátí vestavěný + /// (a rovnou ho uloží, aby šel soubor dál ručně upravovat). + public static (List Engines, Vyber Vyber) Load(string? path = null) + { + path ??= DefaultPath; + try + { + if (File.Exists(path)) + { + var data = JsonSerializer.Deserialize(File.ReadAllText(path), Opts); + if (data?.Engines is { Count: > 0 }) + { + // „Mrtvý“ ProgId (ručně upravený soubor) → žádný výběr comboboxu, ať nedrží + // engine, který v seznamu není. Ruční režim tím netknutý. + var vybrany = data.Engines.Any(e => e.ProgId == data.VybranyProgId) + ? data.VybranyProgId : null; + return (data.Engines, new Vyber(vybrany, data.RucniRezim, data.RucniProgId)); + } + // Soubor existuje, ale nenese žádný engine („null" / prázdný seznam) → stejné + // zacházení jako s rozbitým JSON, viz catch níže. + JsonConfigFile.ZalohujAOhlasPoskozeny(path); + } + } + catch (Exception ex) when (ex is IOException or JsonException or UnauthorizedAccessException) + { + // Poškozený / nečitelný soubor → fallback na seed. Soubor se hned dole přepíše seedem, + // proto se originál (třeba ručně dopsané ProgID) nejdřív zazálohuje a uživatel dozví. + JsonConfigFile.ZalohujAOhlasPoskozeny(path, ex); + } + var seed = Seed(); + Save(seed, default, path); + return (seed, default); + } + + /// Uloží seznam enginů + výběr (režim comboboxu vs. Manuálně a ruční text) – atomicky + /// přes .tmp, aby pád uprostřed zápisu soubor nepoškodil. Chyby zápisu (např. read-only složka + /// u .exe v Program Files) propustí volajícímu. + public static void Save(List engines, Vyber vyber, string? path = null) + => JsonConfigFile.ZapisAtomicky(path ?? DefaultPath, JsonSerializer.Serialize( + new Dto + { + Engines = engines, + VybranyProgId = vyber.VybranyProgId, + RucniRezim = vyber.RucniRezim, + RucniProgId = vyber.RucniProgId, + }, Opts)); + + /// Vestavěný výchozí seznam CADů (databáze od programátora, PODKLAD_CAD_Layout_Tisk.md §1: + /// pořadí AutoCAD → ZWCAD → BricsCAD). Vedle verzově nezávislých ProgID („poslední nainstalovaná") + /// jsou i verzově konkrétní položky – verzově nezávislé „ZWCAD.Application" se u některých instalací + /// na běžící instanci nenapojí, „ZWCAD.Application.2023" ano. Kdo potřebuje jinou verzi, dopíše ji + /// ručně přes režim „Manuálně" v UI (nebo do cad.json). Soubor jde kdykoli ručně upravit. + public static List Seed() => + [ + new() { ProgId = "AutoCAD.Application", Nazev = "AutoCAD (poslední)" }, + new() { ProgId = "ZWCAD.Application", Nazev = "ZWCAD (poslední)" }, + new() { ProgId = "ZWCAD.Application.2023", Nazev = "ZWCAD 2023" }, + new() { ProgId = "ZWCAD.Application.2022", Nazev = "ZWCAD 2022" }, + new() { ProgId = "BricscadApp.AcadApplication", Nazev = "BricsCAD" }, + ]; + + private sealed class Dto + { + public List Engines { get; set; } = new(); + public string? VybranyProgId { get; set; } + public bool RucniRezim { get; set; } + public string? RucniProgId { get; set; } + } +} diff --git a/Rozpisky/Cad/CadLayoutService.cs b/Rozpisky/Cad/CadLayoutService.cs new file mode 100644 index 0000000..4ada085 --- /dev/null +++ b/Rozpisky/Cad/CadLayoutService.cs @@ -0,0 +1,612 @@ +using System.Globalization; +using System.Reflection; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Threading; +using Rozpisky.Models; + +namespace Rozpisky.Cad; + +/// +/// „Aktualizuj rozvržení" – port modAktualizace + modPlotConfig +/// (PODKLAD_CAD_Layout_Tisk.md §3–4) nad živým (dynamic COM, late-binding, +/// stejně jako zbytek CAD vrstvy). Vybrané řádky seznamu příloh se mapují pozičně na rozvržení +/// výkresu počínaje aktivním layoutem (ne podle jména) – přesně jako originální VBA. Každý dílčí krok +/// je obalený vlastním try/catch: chyba se zaloguje a dávka pokračuje dál, nikdy nepadá jako celek. +/// +/// Volání COM na CAD zůstává na UI (STA) vlákně, stejně jako zbytek COM interopu v aplikaci (viz +/// MainViewModel.ExportujDoPdf) – mezi jednotlivými rozvrženími se await Dispatcher.Yield +/// nechá překreslit log okno a stavový řádek, žádný Task.Run. +/// +/// +public static class CadLayoutService +{ + private const string TmpPlotConfigName = "__tmpQ"; + + public static async Task AktualizujRozvrzeni(dynamic doc, string cadRodina, IReadOnlyList vybrane, + Projekt projekt, Nastaveni nastaveni, LayoutConfig cfg, ILayoutLog log, CancellationToken zruseno) + { + if (vybrane.Count == 0) { log.Chyba("Není vybraný žádný řádek seznamu."); return; } + + List<(string Name, int TabOrder, dynamic Layout)> layouty; + try { layouty = NactiLayouty(doc); } + catch (Exception ex) { log.Chyba($"Načtení rozvržení výkresu selhalo: {ex.Message}"); return; } + + var rozvrzeni = layouty.Where(l => l.TabOrder > 0).OrderBy(l => l.TabOrder).ToList(); + if (rozvrzeni.Count == 0) { log.Chyba("Výkres nemá žádné rozvržení (jen modelový prostor)."); return; } + + string aktivniJmeno; + try { aktivniJmeno = (string)doc.ActiveLayout.Name; } + catch (Exception ex) { log.Chyba($"Nelze zjistit aktivní rozvržení: {ex.Message}"); return; } + + if (string.Equals(aktivniJmeno, "Model", StringComparison.OrdinalIgnoreCase)) + { + log.Chyba("Aktivní je modelový prostor – ve výkresu aktivujte rozvržení, od kterého se má " + + "aktualizace začít, a zkuste to znovu."); + return; + } + + int startIdx = rozvrzeni.FindIndex(l => string.Equals(l.Name, aktivniJmeno, StringComparison.OrdinalIgnoreCase)); + if (startIdx < 0) { log.Chyba($"Aktivní rozvržení „{aktivniJmeno}“ se mezi rozvrženími výkresu nenašlo."); return; } + + if (vybrane.Count > rozvrzeni.Count - startIdx) + { + log.Chyba($"Vybráno {vybrane.Count} řádků, ale od aktivního rozvržení „{aktivniJmeno}“ zbývá " + + $"ve výkresu jen {rozvrzeni.Count - startIdx} rozvržení."); + return; + } + + var cil = rozvrzeni.Skip(startIdx).Take(vybrane.Count).ToList(); + // Kvůli identifikaci pseudoviewportu „papíru“ (viz níže) se každé rozvržení při zpracování + // aktivuje – po dávce se vrátí to, které bylo aktivní na začátku (je to zároveň startovní + // značka pozičního mapování, uživatel by o ni neměl přijít). + dynamic puvodniAktivni; + try { puvodniAktivni = doc.ActiveLayout; } + catch (Exception ex) { log.Chyba($"Nelze přečíst aktivní rozvržení: {ex.Message}"); return; } + + // Dvoufázové přejmenování (kolize jmen) – nejdřív všechny na dočasný náhodný název. + for (int i = 0; i < cil.Count; i++) + { + var docasne = "__tmp_" + Guid.NewGuid().ToString("N"); + try { cil[i].Layout.Name = docasne; } + catch (Exception ex) { log.Chyba($"Dočasné přejmenování rozvržení „{cil[i].Name}“ selhalo: {ex.Message}"); } + } + + // Dvoufázové přejmenování výše uvolní jen jména rozvržení ve zpracovávané dávce (cil). Rozvržení + // MIMO dávku (před aktivním nebo za oknem výběru) si svá jména drží – když se na některé z nich + // trefí cílové jméno, CAD rename odmítne s eDuplicateRecordName (0x802000D9). Stejně tak dvě řádky + // se stejným cílovým jménem: první projde, druhý spadne na duplicitu. Obojí odchytíme předem a + // vypíšeme srozumitelnou chybu místo kryptického kódu (řádek se přeskočí, dávka pokračuje). + var cilPuvodniJmena = new HashSet(cil.Select(c => c.Name), StringComparer.OrdinalIgnoreCase); + var existujiciMimoDavku = new HashSet( + layouty.Where(l => !cilPuvodniJmena.Contains(l.Name)).Select(l => l.Name), + StringComparer.OrdinalIgnoreCase); + var jizPrirazeno = new HashSet(StringComparer.OrdinalIgnoreCase); + + for (int i = 0; i < cil.Count; i++) + { + if (zruseno.IsCancellationRequested) { log.Info("Zrušeno uživatelem – aktualizace ukončena."); break; } + await Dispatcher.Yield(DispatcherPriority.Background); // nech log okno/stavový řádek překreslit + + var p = vybrane[i]; + dynamic layout = cil[i].Layout; + var cilJmeno = p.JmenoRozvrzeni?.Trim(); + if (string.IsNullOrWhiteSpace(cilJmeno)) + { + log.Chyba($"Řádek {i + 1} (dřívější rozvržení „{cil[i].Name}“): chybí jméno rozvržení, přeskočeno."); + continue; + } + + if (jizPrirazeno.Contains(cilJmeno)) + { + log.Chyba($"Řádek {i + 1}: jméno rozvržení „{cilJmeno}“ je zadané na víc řádcích – přeskočeno."); + continue; + } + if (existujiciMimoDavku.Contains(cilJmeno)) + { + log.Chyba($"„{cilJmeno}“: toto jméno už ve výkresu nese jiné rozvržení mimo zpracovávanou dávku – " + + "přejmenování by skončilo chybou (eDuplicateRecordName / 0x802000D9), řádek přeskočen. " + + "Přejmenujte nebo odstraňte kolidující rozvržení, případně ho zahrňte do výběru."); + continue; + } + + try { layout.Name = cilJmeno; } + catch (Exception ex) { log.Chyba($"Přejmenování na „{cilJmeno}“ selhalo: {ex.Message}"); continue; } + log.Info($"„{cilJmeno}“: přejmenováno."); + jizPrirazeno.Add(cilJmeno); + + // LTSCALE se vyhodnocuje a zapisuje do seznamu vždy (nezávisle na Nastaveni.MeritkoAutomaticky + // i Nastaveni.LtscaleAutomaticky) – samotný zápis do seznamu nic nemění na výkresu, ovlivní + // až případné použití při tisku (CadTiskService, tam je to za přepínačem LtscaleAutomaticky). + // Pseudoviewport „papíru“ umí CAD jednoznačně označit jen u aktivního rozvržení + // (ActivePViewport při vypnutém MSPACE) – proto se rozvržení aktivuje a jeho handle + // se předá dál k vyloučení. Když se to nepovede, NajdiJmenovateleMeritka má fallback. + string? papirHandle = null; + try + { + doc.ActiveLayout = layout; + try { doc.MSpace = false; } catch { /* už je vypnutý */ } + papirHandle = (string)doc.ActivePViewport.Handle; + } + catch { /* fallback: heuristika StandardScale v NajdiJmenovateleMeritka */ } + + try + { + // doc je dynamic → volání se váže dynamicky a vrací dynamic (nejde dekonstruovat, + // pojmenované prvky tuple za běhu neexistují) – proto do explicitně otypované proměnné. + (SortedSet Vsechny, long? Prvni) meritkaVyrezu = + NajdiJmenovateleMeritka(doc, layout, cfg.HladinaVyrezu, papirHandle); + + if (nastaveni.MeritkoAutomaticky) + { + var meritka = VyhodnotMeritka(meritkaVyrezu.Vsechny); + if (meritka is not null) + { + p.Meritko = meritka; + log.Info($"„{cilJmeno}“: měřítko {meritka}."); + } + } + + var ltscale = VyhodnotLtscale(meritkaVyrezu.Prvni); + if (ltscale is not null) + { + p.Ltscale = ltscale; + log.Info($"„{cilJmeno}“: LTSCALE {ltscale}."); + } + } + catch (Exception ex) { log.Chyba($"„{cilJmeno}“: vyhodnocení měřítka/LTSCALE selhalo: {ex.Message}"); } + + (double W, double H)? papirMm = null; + try { papirMm = ZpracujBlokyEntit(layout, projekt, p, cfg, log, cilJmeno); } + catch (Exception ex) { log.Chyba($"„{cilJmeno}“: procházení entit rozvržení selhalo: {ex.Message}"); } + + if (nastaveni.UpravovatTiskarnu) + { + try { NastavTiskLayoutu(doc, layout, cadRodina, p, cfg, papirMm, log, cilJmeno); } + catch (Exception ex) { log.Chyba($"„{cilJmeno}“: nastavení tiskárny selhalo: {ex.Message}"); } + } + } + + try { doc.ActiveLayout = puvodniAktivni; } + catch (Exception ex) { log.Chyba($"Návrat na původní aktivní rozvržení selhal: {ex.Message}"); } + } + + private static List<(string Name, int TabOrder, dynamic Layout)> NactiLayouty(dynamic doc) + { + var vysledek = new List<(string, int, dynamic)>(); + foreach (dynamic layout in doc.Layouts) + vysledek.Add(((string)layout.Name, Convert.ToInt32(layout.TabOrder), layout)); + return vysledek; + } + + /// Projde entity rozvržení (blokové reference) – vyplní blok hlavičky a z bloku rámečku + /// spočítá počet papírů (zapíše zpět do ). Vrací rozměr papíru v mm + /// odvozený z rámečku (pro nastavení tiskárny), nebo null, když rámeček nebyl nalezen. + private static (double W, double H)? ZpracujBlokyEntit(dynamic layout, Projekt projekt, Priloha p, + LayoutConfig cfg, ILayoutLog log, string cilJmeno) + { + (double W, double H)? papir = null; + bool hlavickaNalezena = false; + + foreach (dynamic ent in layout.Block) + { + string objName; + try { objName = (string)ent.ObjectName; } catch { continue; } + if (objName != "AcDbBlockReference") continue; + + string jmeno; + try { jmeno = (string)ent.EffectiveName; } + catch { try { jmeno = (string)ent.Name; } catch { continue; } } + + if (string.Equals(jmeno, cfg.BlokHlavicky, StringComparison.OrdinalIgnoreCase)) + { + hlavickaNalezena = true; + ZapisHlavicku(ent, projekt, p, log, cilJmeno); + } + else if (string.Equals(jmeno, cfg.BlokRamecek, StringComparison.OrdinalIgnoreCase)) + { + bool dynamickyBlok; + try { dynamickyBlok = (bool)ent.IsDynamicBlock; } catch { dynamickyBlok = false; } + if (!dynamickyBlok) continue; + + object[]? vlastnosti; + try { vlastnosti = (object[])ent.GetDynamicBlockProperties(); } + catch (Exception ex) + { + log.Chyba($"„{cilJmeno}“: čtení dynamických vlastností rámečku „{cfg.BlokRamecek}“ selhalo: {ex.Message}"); + continue; + } + + var viditelnost = NajdiViditelnost(vlastnosti); + if (viditelnost is null) + { + log.Chyba($"„{cilJmeno}“: u rámečku „{cfg.BlokRamecek}“ se nepodařilo zjistit viditelnost (Benefit/Libovolný)."); + continue; + } + + // Viditelnost "Benefit"/"Libovolný" určuje, které dvojici parametrů (VzdálenostBx/By vs. + // VzdálenostLx/Ly) věřit – bounding box bloku je nespolehlivý (odvisí od toho, co je v bloku + // zrovna vidět), zatímco tyto parametry nesou zamýšlený rozměr rámečku přímo. + string pripona = string.Equals(viditelnost, "Benefit", StringComparison.OrdinalIgnoreCase) ? "B" : "L"; + double? dx = NajdiHodnotu(vlastnosti, $"Vzdálenost{pripona}x"); + double? dy = NajdiHodnotu(vlastnosti, $"Vzdálenost{pripona}y"); + if (dx is null || dy is null) + { + log.Chyba($"„{cilJmeno}“: rámeček (viditelnost {viditelnost}) nemá parametr Vzdálenost{pripona}x/Vzdálenost{pripona}y."); + continue; + } + + int delka = Math.Max(1, (int)Math.Ceiling(dx.Value / cfg.SirkaA4Mm)); + int vyska = Math.Max(1, (int)Math.Ceiling(dy.Value / cfg.VyskaA4Mm)); + int pocet = delka * vyska; + + p.Formaty = pocet.ToString(); + papir = (dx.Value, dy.Value); // reálný rozměr rámečku (podklad §2 „NastavRozmerPapiru" – ne zaokrouhleno na A4) + log.Info($"„{cilJmeno}“: počet papírů {pocet} ({delka}×{vyska} A4, viditelnost {viditelnost}, rámeček {dx.Value:0}×{dy.Value:0} mm)."); + } + } + + if (!hlavickaNalezena) + log.Chyba($"„{cilJmeno}“: hlavička nevyplněna – blok hlavičky „{cfg.BlokHlavicky}“ nebyl " + + "v rozvržení nalezen (žádný fallback)."); + + return papir; + } + + /// Najde mezi dynamickými vlastnostmi bloku tu, jejíž aktuální hodnota odpovídá jednomu + /// z názvů viditelnosti rámečku ("Benefit"/"Libovolný") – tím se pozná, který stav je zrovna aktivní, + /// aniž by bylo nutné znát přesný název vlastnosti viditelnosti (např. "Visibility1"). + private static string? NajdiViditelnost(object[] vlastnosti) + { + foreach (dynamic v in vlastnosti) + { + string? hodnota; + try { hodnota = v.Value as string; } catch { continue; } + if (hodnota is null) continue; + if (string.Equals(hodnota, "Benefit", StringComparison.OrdinalIgnoreCase) || + string.Equals(hodnota, "Libovolný", StringComparison.OrdinalIgnoreCase)) + return hodnota; + } + return null; + } + + /// Přečte hodnotu konkrétní dynamické vlastnosti bloku podle jejího názvu (PropertyName). + private static double? NajdiHodnotu(object[] vlastnosti, string nazevVlastnosti) + { + foreach (dynamic v in vlastnosti) + { + string nazev; + try { nazev = (string)v.PropertyName; } catch { continue; } + if (!string.Equals(nazev, nazevVlastnosti, StringComparison.OrdinalIgnoreCase)) continue; + try { return Convert.ToDouble(v.Value); } catch { return null; } + } + return null; + } + + private static void ZapisHlavicku(dynamic ent, Projekt projekt, Priloha p, ILayoutLog log, string cilJmeno) + { + bool maAtributy; + try { maAtributy = (bool)ent.HasAttributes; } catch { maAtributy = false; } + if (!maAtributy) return; + + object[] atributy; + try { atributy = (object[])ent.GetAttributes(); } + catch (Exception ex) { log.Chyba($"„{cilJmeno}“: čtení atributů hlavičky selhalo: {ex.Message}"); return; } + + foreach (dynamic att in atributy) + { + string tag; + try { tag = (string)att.TagString; } catch { continue; } + + string? hodnota = tag.ToUpperInvariant() switch + { + "STAVBA" => projekt.Stavba, + // OBJEKT = číslo objektu + mezera + název objektu; číslo nemusí být vyplněné, pak žádná mezera navíc. + "OBJEKT" => SpojNeprazdne(" ", p.CisloObjektu, p.NazevObjektu), + // PRILOHA = název přílohy – název dílčí části přílohy; když jedna část chybí, pomlčka „nelevituje". + "PRILOHA" => SpojNeprazdne(" – ", p.NazevPrilohy, p.NazevDilciCastiPrilohy), + "MERITKO" => FormatMeritko(p.Meritko), + _ => null, + }; + if (hodnota is null) continue; + + try { att.TextString = hodnota; att.Update(); } + catch (Exception ex) { log.Chyba($"„{cilJmeno}“: zápis atributu {tag} selhal: {ex.Message}"); } + } + log.Info($"„{cilJmeno}“: hlavička vyplněna."); + } + + /// „M 1:500" jen když hodnota obsahuje „1:" (podklad §4) – jinak (prázdné, „nezjištěno" apod.) beze změny. + private static string FormatMeritko(string meritko) => + !string.IsNullOrEmpty(meritko) && meritko.Contains("1:") ? $"M {meritko}" : meritko; + + /// Spojí části em, ale prázdné/whitespace části vynechá – takže + /// oddělovač nikdy „nelevituje" u chybějící části (např. samotné číslo objektu bez názvu, nebo název + /// přílohy bez dílčí části). + private static string SpojNeprazdne(string oddelovac, params string?[] casti) => + string.Join(oddelovac, casti.Where(c => !string.IsNullOrWhiteSpace(c)).Select(c => c!.Trim())); + + /// Projde viewporty v hladině a z CustomScale spočítá + /// jmenovatele měřítka (dle INSUNITS: mm→1, m→1000). Vrací dvojici: Vsechny = unikátní + /// seřazená množina pro (formát „1:X"), Prvni = jmenovatel + /// prvního výřezu v pořadí iterace bloku pro (LTSCALE je vlastnost + /// celého výkresu → jedna hodnota). Sdílené, ať se výkres neprochází dvakrát. + private static (SortedSet Vsechny, long? Prvni) NajdiJmenovateleMeritka(dynamic doc, dynamic layout, + string hladinaVyrezu, string? papirHandle) + { + int jednotkyFaktor; + try { jednotkyFaktor = Convert.ToInt32(doc.GetVariable("INSUNITS")) == 6 ? 1000 : 1; } + catch { jednotkyFaktor = 1; } + + var jmenovatele = new SortedSet(); + long? prvni = null; + foreach (dynamic ent in layout.Block) + { + string objName; + try { objName = (string)ent.ObjectName; } catch { continue; } + if (objName != "AcDbViewport") continue; + + string vrstva; + try { vrstva = (string)ent.Layer; } catch { continue; } + if (!string.Equals(vrstva, hladinaVyrezu, StringComparison.OrdinalIgnoreCase)) continue; + + // Papírový prostor obsahuje kromě nakreslených výřezů i pseudoviewport „pohledu na papír“ + // (v DXF VIEWPORT s id 1; vzniká při aktivaci layoutu a kopíruje se s ním). Není nijak + // vidět, může ležet na libovolné hladině (i hladině výřezů), kdekoliv v pořadí bloku + // a jeho CustomScale je aktuální zoom – bez filtru vyrábí falešná měřítka (typicky 1:1000 + // u výkresů v metrech). Primárně se vylučuje podle handle z ActivePViewport (jednoznačné); + // fallback bez handle: pseudoviewport má StandardScale trvale zamrzlé na acVp1_1 (2), + // zatímco výřezy s měřítkem ze seznamu hlásí acVpCustomScale (1) – heuristika by ale + // přeskočila i skutečný výřez nastavený přes enum standardních měřítek na 1:1. + if (papirHandle is not null) + { + string handle; + try { handle = (string)ent.Handle; } catch { handle = ""; } + if (string.Equals(handle, papirHandle, StringComparison.OrdinalIgnoreCase)) continue; + } + else + { + try { if (Convert.ToInt32(ent.StandardScale) == 2) continue; } catch { /* nelze přečíst → počítat */ } + } + + double meritko; + try { meritko = Convert.ToDouble(ent.CustomScale); } catch { continue; } + if (meritko <= 0) continue; + + long jmenovatel = (long)Math.Round(1.0 / meritko * jednotkyFaktor); + if (jmenovatel > 0) + { + jmenovatele.Add(jmenovatel); + prvni ??= jmenovatel; // první výřez v pořadí iterace bloku – zdroj jediné hodnoty LTSCALE + } + } + + return (jmenovatele, prvni); + } + + /// Formátuje jmenovatele měřítka jako „1:500, 1:1000", nebo null, když je množina prázdná. + private static string? VyhodnotMeritka(SortedSet jmenovatele) => + jmenovatele.Count == 0 ? null : string.Join(", ", jmenovatele.Select(j => $"1:{j}")); + + /// LTSCALE odvozené z měřítka prvního výřezu ve výkresu: 1000 / jmenovatel + /// (např. 1:500 → 2, 1:50 → 20). Vždy jen jedna hodnota – LTSCALE je systémová proměnná celého + /// výkresu, takže i u layoutu s víc výřezy o různých měřítkách se bere jeden (první v pořadí + /// iterace bloku). null, když žádný výřez nebyl nalezen. Tisk () + /// tuhle jedinou hodnotu parsuje přímo. + private static string? VyhodnotLtscale(long? prvniJmenovatel) => prvniJmenovatel is null + ? null + : (1000.0 / prvniJmenovatel.Value).ToString("0.###", CultureInfo.InvariantCulture); + + /// Nastaví tiskové vlastnosti rozvržení (podklad §2–3): tiskárnu, formát papíru, CTB a pevné + /// hodnoty (jednotky mm, bez rotace, tisk celého layoutu, měřítko 1:1, výřezy tisknout první). Tiskárna + /// se hledá v podle (viz komentář + /// u vlastnosti – „DWG to PDF" má u každého CADu jinou příponu). Tiskárnu i formát papíru před zápisem + /// ověří v aktuálním CADu (/); když nejsou + /// k dispozici (nebo pro daný engine není v layout.json tiskárna vyplněná vůbec), tiskárna se + /// pro daný layout jen nenastaví (zbytek aktualizace pokračuje). + private static void NastavTiskLayoutu(dynamic doc, dynamic layout, string cadRodina, Priloha p, LayoutConfig cfg, + (double W, double H)? papirMm, ILayoutLog log, string cilJmeno) + { + // Bez rámečku není odkud vzít rozměr papíru – dřív se dopočítával z A4, teď žádný fallback: + // rozměr papíru se v tiskárně nenastaví (a tím pádem ani zbytek nastavení tisku, aby nezůstal + // v nekonzistentním stavu s cizím/starým formátem). + if (papirMm is null) + { + log.Chyba($"„{cilJmeno}“: rámeček nebyl nalezen – rozměr papíru v tiskárně se nenastaví (žádný fallback)."); + return; + } + + if (!cfg.Tiskarny.TryGetValue(cadRodina, out var zarizeni) || string.IsNullOrWhiteSpace(zarizeni)) + { + log.Chyba($"„{cilJmeno}“: v layout.json není pro CAD „{cadRodina}“ vyplněná tiskárna " + + "(Tiskarny) – tiskárna se pro tento layout nenastavuje."); + return; + } + if (!ZarizeniExistuje(layout, zarizeni)) + { + log.Chyba($"„{cilJmeno}“: tiskárna „{zarizeni}“ není v CADu dostupná – tiskárna se pro tento layout nenastavuje."); + return; + } + + double sirkaMm = papirMm.Value.W; + double vyskaMm = papirMm.Value.H; + string popisPapiru = $"{(int)Math.Round(sirkaMm)}x{(int)Math.Round(vyskaMm)}"; + + var (canonicalMedia, dostupne) = ZjistiMedium((object)doc, zarizeni, sirkaMm, vyskaMm); + if (canonicalMedia is null) + { + string seznam = dostupne.Count > 0 + ? $" Dostupné formáty u této tiskárny: {string.Join(", ", dostupne)}." + : " (seznam dostupných formátů se nepodařilo přečíst)."; + // Přesná (nezaokrouhlená) hodnota do logu – kdyby shoda selhávala jen kvůli zaokrouhlení/toleranci, + // musí to tu být vidět (popisPapiru výše je zaokrouhlený na celé mm jen pro stručný název). + log.Chyba($"„{cilJmeno}“: formát papíru {popisPapiru} mm (přesně " + + $"{sirkaMm.ToString("0.####", CultureInfo.InvariantCulture)}×" + + $"{vyskaMm.ToString("0.####", CultureInfo.InvariantCulture)}) není u tiskárny „{zarizeni}“ " + + $"dostupný – tiskárna se pro tento layout nenastavuje.{seznam}"); + return; + } + + // Celý název včetně přípony ".ctb" – žádné auto-dopisování (na rozdíl od původního VBA). Výchozí + // CTB je per-engine (viz LayoutConfig.VychoziCtb) – .ctb soubory NEJSOU sdílené mezi CADy. + string? ctb = p.Ctb; + if (string.IsNullOrWhiteSpace(ctb)) + { + if (!cfg.VychoziCtb.TryGetValue(cadRodina, out var vychozi) || string.IsNullOrWhiteSpace(vychozi)) + { + log.Chyba($"„{cilJmeno}“: v layout.json není pro CAD „{cadRodina}“ vyplněný výchozí CTB " + + "(VychoziCtb) a řádek nemá vlastní – styl tisku se pro tento layout nenastavuje."); + ctb = null; + } + else ctb = vychozi; + } + + TrySet(() => layout.ConfigName = zarizeni, "nastavení tiskárny", log, cilJmeno); + TrySet(() => layout.CanonicalMediaName = canonicalMedia, "nastavení formátu papíru", log, cilJmeno); + // Po změně tiskárny/formátu papíru musí CAD přehodnotit, co je pro tenhle layout u tohodle + // zařízení/formátu platné (tady i seznam standardních měřítek) – bez toho UseStandardScale/ + // StandardScale níže potichu neprojeví a CAD zůstane u dřívějšího (scale-to-fit/custom) měřítka. + TrySet(() => layout.RefreshPlotDeviceInfo(), "obnovení informací o tiskovém zařízení", log, cilJmeno); + TrySet(() => layout.PaperUnits = 1, "nastavení jednotek papíru (mm)", log, cilJmeno); // acMillimeters + TrySet(() => layout.PlotOrigin = new double[] { 0, 0 }, "nastavení počátku tisku", log, cilJmeno); + TrySet(() => layout.PlotRotation = 0, "nastavení rotace tisku", log, cilJmeno); // ac0degrees + TrySet(() => layout.PlotType = 5, "nastavení rozsahu tisku (layout)", log, cilJmeno); // acLayout + // StandardScale samo o sobě nic nedělá, dokud UseStandardScale není true – jinak CAD dál používá + // ať už měl nastaveno cokoliv předtím (scale-to-fit, starý CustomScale apod.). + TrySet(() => layout.UseStandardScale = true, "zapnutí standardního měřítka", log, cilJmeno); + // Pozor: StandardScale je enum AcPlotScale, ne poměr – 1 by znamenalo ac1_128in_1ft (1:1536). + TrySet(() => layout.StandardScale = 16, "nastavení měřítka tisku (1:1)", log, cilJmeno); // ac1_1 + TrySet(() => layout.PlotViewportsFirst = true, "nastavení pořadí tisku výřezů", log, cilJmeno); + if (ctb is not null) TrySet(() => layout.StyleSheet = ctb, "nastavení stylu tisku (CTB)", log, cilJmeno); + + log.Info($"„{cilJmeno}“: tiskárna {zarizeni}, papír {popisPapiru} mm ({canonicalMedia})," + + $" CTB {ctb ?? "nenastaveno"}."); + } + + private static void TrySet(Action nastav, string popis, ILayoutLog log, string cilJmeno) + { + try { nastav(); } + catch (Exception ex) { log.Chyba($"„{cilJmeno}“: {popis} selhalo: {ex.Message}"); } + } + + /// Ověří, že tiskárna existuje mezi zařízeními dostupnými v aktuálním CADu (podklad §3, TiskarnyZCad). + private static bool ZarizeniExistuje(dynamic layout, string zarizeni) + { + try + { + var jmena = (object[])layout.GetPlotDeviceNames(); + return jmena.Any(n => string.Equals((string)n, zarizeni, StringComparison.OrdinalIgnoreCase)); + } + catch { return false; } + } + + /// Najde canonical název formátu papíru u dané tiskárny odpovídající rozměru + /// × (přes dočasnou PlotConfiguration, + /// kterou po ověření zase smaže). Vrací přímo canonical název, protože ten je potřeba pro + /// layout.CanonicalMediaName a u vlastních formátů se mezi CADy zásadně liší, proto se + /// zkouší tři strategie v pořadí od nejlevnější: + /// + /// Přímá shoda názvu – ZWCAD ukládá vlastní formát jako čitelné „1260x420“. + /// Rozměr rozparsovaný z canonical názvu – AutoCAD dá do canonical názvu rovnou celý + /// popis včetně rozměru (např. „UserDefinedMetric (1260.00 x 420.00MM)“ jako jeden celý řetězec – + /// ne generický „UserDefinedMetric“ a rozměr zvlášť v lokalizovaném názvu, jak by se čekalo; + /// GetLocaleMediaNames() pro tyhle vlastní formáty žádný samostatný záznam nedává, což při + /// párování podle indexu s GetCanonicalMediaNames() vedlo k tichému přeskočení). + /// Skutečný rozměr média přes GetPaperSize – BricsCAD u PDF ovladače nenese + /// rozměr v canonical názvu vůbec (vlastní formáty jsou jen generické pojmenované sloty „Vlastní + /// velikost 1/2/3“, jejichž rozměr je uložený v PC3/PMP; runtime API à la AutoCAD UserDefinedMetric + /// neexistuje). Rozměr slotu se proto přečte tak, že se médium dočasně nastaví na throwaway + /// konfiguraci a zavolá GetPaperSize (vrací mm nezávisle na PaperUnits). Pozor: tohle + /// spáruje jen slot, jehož rozměr v PC3 rámečku skutečně odpovídá – arbitrární rozměr BricsCAD přes + /// COM nastavit neumí, chybějící formát je nutné do PC3 předdefinovat ručně. + /// + /// Když nic nesedí, vrátí seznam dostupných formátů (u strategie 3 i s přečtenými rozměry) pro + /// diagnózu v logu. + private static (string? CanonicalMedia, IReadOnlyList Dostupne) ZjistiMedium(dynamic doc, string zarizeni, double sirkaMm, double vyskaMm) + { + dynamic? tmp = null; + try + { + tmp = doc.PlotConfigurations.Add(TmpPlotConfigName, true); + tmp.ConfigName = zarizeni; + tmp.RefreshPlotDeviceInfo(); + + var canonical = ((object[])tmp.GetCanonicalMediaNames()).Select(n => (string)n).ToArray(); + + // 1) Přímá shoda názvu (ZWCAD: „840x297"). + string zkratka = $"{(int)Math.Round(sirkaMm)}x{(int)Math.Round(vyskaMm)}"; + var primy = canonical.FirstOrDefault(n => string.Equals(n, zkratka, StringComparison.OrdinalIgnoreCase)); + if (primy is not null) return (primy, Array.Empty()); + + // 2) Rozměr rozparsovaný z canonical názvu (AutoCAD: „UserDefinedMetric (840.00 x 297.00MM)"). + foreach (var nazev in canonical) + { + var cisla = Regex.Matches(nazev, @"\d+(?:[.,]\d+)?") + .Select(m => double.Parse(m.Value.Replace(',', '.'), CultureInfo.InvariantCulture)) + .ToArray(); + if (cisla.Length != 2) continue; + + bool shoda = (Priblizne(cisla[0], sirkaMm) && Priblizne(cisla[1], vyskaMm)) || + (Priblizne(cisla[0], vyskaMm) && Priblizne(cisla[1], sirkaMm)); + if (shoda) return (nazev, Array.Empty()); + } + + // 3) Skutečný rozměr každého média přes GetPaperSize (BricsCAD – generické sloty bez rozměru + // v názvu). Zároveň se sbírá čitelný seznam s rozměry pro diagnostiku, když nic nesedne. + var diag = new List(canonical.Length); + foreach (var nazev in canonical) + { + (double W, double H)? rozmer; + try { rozmer = CtiRozmerMedia(tmp, nazev); } + catch { rozmer = null; } // žádné médium nesmí shodit celý průchod – jen se přeskočí + if (rozmer is null) { diag.Add(nazev); continue; } + + double w = rozmer.Value.W, h = rozmer.Value.H; + diag.Add($"{nazev} ({w:0}×{h:0} mm)"); + + bool shoda = (Priblizne(w, sirkaMm) && Priblizne(h, vyskaMm)) || + (Priblizne(w, vyskaMm) && Priblizne(h, sirkaMm)); + if (shoda) return (nazev, Array.Empty()); + } + + return (null, diag); + } + catch { return (null, Array.Empty()); } + finally + { + if (tmp is not null) { try { tmp.Delete(); } catch { /* dočasnou konfiguraci se nepodařilo smazat – neblokující */ } } + } + } + + /// Přečte skutečný rozměr média (v mm) tak, že ho dočasně nastaví na throwaway + /// PlotConfiguration a zavolá GetPaperSize – jediná cesta, jak zjistit rozměr formátu, + /// který ho nemá v canonical názvu (BricsCAD vlastní sloty „Vlastní velikost 1/2/3“). GetPaperSize + /// má dva out parametry (šířka, výška v mm); volá se přes s byref + /// a hodnoty se čtou zpět z pole args. Přímé volání přes + /// dynamic (GetPaperSize(out object, out object)) tady nejde – DLR/COM marshaling + /// out parametrů v BricsCADu padá na ArgumentException „Could not convert argument“ + /// (ověřeno 2026-07-07); InvokeMember s byref polem funguje napříč AutoCAD/ZWCAD/BricsCAD. Vrací + /// null, když médium nejde nastavit/přečíst nebo rozměr není kladný. + private static (double W, double H)? CtiRozmerMedia(dynamic plotConfig, string canonicalMedia) + { + try + { + plotConfig.CanonicalMediaName = canonicalMedia; + + object cil = plotConfig; + var args = new object[] { 0.0, 0.0 }; + var mods = new ParameterModifier(2); mods[0] = true; mods[1] = true; + cil.GetType().InvokeMember("GetPaperSize", BindingFlags.InvokeMethod, null, cil, args, + new[] { mods }, CultureInfo.InvariantCulture, null); + + double w = Convert.ToDouble(args[0], CultureInfo.InvariantCulture); + double h = Convert.ToDouble(args[1], CultureInfo.InvariantCulture); + return (w > 0 && h > 0) ? (w, h) : null; + } + catch { return null; } + } + + private static bool Priblizne(double a, double b) => Math.Abs(a - b) < 0.5; +} diff --git a/Rozpisky/Cad/CadLink.cs b/Rozpisky/Cad/CadLink.cs new file mode 100644 index 0000000..c65100a --- /dev/null +++ b/Rozpisky/Cad/CadLink.cs @@ -0,0 +1,111 @@ +using System.Runtime.InteropServices; + +namespace Rozpisky.Cad; + +/// +/// Připojení na běžící CAD (AutoCAD/ZWCAD/BricsCAD) přes COM automation – port clsCadLink +/// (PODKLAD_CAD_Layout_Tisk.md §1). Pozdní vazba přes dynamic (stejný princip jako +/// ), takže funguje napříč CAD systémy bez PIA reference. +/// +/// Na rozdíl od se nespouští nová instance – připojuje se +/// výhradně na už běžící CAD (GetActiveObject). Marshal.GetActiveObject byl v .NET +/// (Core/5+) odstraněn, proto je tu vlastní P/Invoke na ole32/oleaut32. +/// +/// +public sealed class CadLink : IDisposable +{ + // CO_E_CLASSSTRING – ProgID není v registru zaregistrované (CAD není nainstalovaný). + private const uint CoEClassString = 0x800401F3; + // MK_E_UNAVAILABLE – v Running Object Table není žádná instance (CAD neběží). + private const uint MkEUnavailable = 0x800401E3; + + [DllImport("ole32.dll", PreserveSig = false)] + private static extern void CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] string progId, out Guid clsid); + + [DllImport("oleaut32.dll", PreserveSig = false)] + private static extern void GetActiveObject(ref Guid rclsid, IntPtr reserved, + [MarshalAs(UnmanagedType.Interface)] out object ppunk); + + public dynamic? App { get; private set; } + public dynamic? Doc { get; private set; } + public string Engine { get; private set; } = ""; + /// ProgID, přes které jsme se připojili (verzově konkrétní i ruční). Zdroj pro . + public string ProgId { get; private set; } = ""; + public bool IsConnected { get; private set; } + public string? LastError { get; private set; } + + /// Rodina CADu (klíč do layout.json Tiskarny/VychoziCtb) odvozená z . + public string Rodina => RodinaZProgId(ProgId); + + /// Zařadí ProgID do rodiny CADu („AutoCAD" / „ZWCAD" / „BricsCAD") nezávisle na verzi a + /// popisku enginu – „ZWCAD.Application.2023" i „ZWCAD.Application" → „ZWCAD", „BricscadApp.AcadApplication" + /// → „BricsCAD". Tímto klíčem se párují per-engine hodnoty v layout.json (tiskárna/CTB), místo + /// dřívějšího křehkého párování podle popisného názvu enginu z cad.json. Neznámé ProgID (exotický ruční + /// zápis) vrátí samo sebe – ať je v logu vidět a jde ho v layout.json ručně nakeyovat. + public static string RodinaZProgId(string? progId) + { + if (string.IsNullOrWhiteSpace(progId)) return ""; + if (progId.Contains("AutoCAD", StringComparison.OrdinalIgnoreCase)) return "AutoCAD"; + if (progId.Contains("ZWCAD", StringComparison.OrdinalIgnoreCase)) return "ZWCAD"; + if (progId.Contains("Brics", StringComparison.OrdinalIgnoreCase)) return "BricsCAD"; + return progId; + } + + /// Připojí se na už běžící instanci a vezme její aktivní + /// dokument. Nic nespouští. Vrací false a vyplní čitelnou hláškou, když + /// CAD není nainstalovaný, neběží, nebo běží bez otevřeného výkresu. + public bool Connect(string progId, string nazev) + { + LastError = null; + object app; + try + { + CLSIDFromProgID(progId, out var clsid); + GetActiveObject(ref clsid, IntPtr.Zero, out app); + } + catch (COMException ex) when (unchecked((uint)ex.HResult) == CoEClassString) + { + LastError = $"{nazev} není nainstalovaný (COM třída „{progId}“ není zaregistrovaná)."; + return false; + } + catch (COMException ex) when (unchecked((uint)ex.HResult) == MkEUnavailable) + { + LastError = $"{nazev} neběží. Spusť ho, otevři výkres a zkus to znovu."; + return false; + } + catch (COMException ex) + { + LastError = $"Připojení na {nazev} selhalo: {ex.Message}"; + return false; + } + + App = app; + try + { + var doc = App.ActiveDocument; + if (doc is null) throw new InvalidOperationException("ActiveDocument je prázdný."); + Doc = doc; + } + catch (Exception ex) + { + LastError = $"{nazev} běží, ale nemá otevřený žádný výkres ({ex.Message})."; + Marshal.FinalReleaseComObject(App); + App = null; + return false; + } + + Engine = nazev; + ProgId = progId; + IsConnected = true; + return true; + } + + public void Dispose() + { + if (Doc is not null) { Marshal.FinalReleaseComObject(Doc); Doc = null; } + if (App is not null) { Marshal.FinalReleaseComObject(App); App = null; } + IsConnected = false; + GC.Collect(); + GC.WaitForPendingFinalizers(); + } +} diff --git a/Rozpisky/Cad/CadTiskService.cs b/Rozpisky/Cad/CadTiskService.cs new file mode 100644 index 0000000..20c40b1 --- /dev/null +++ b/Rozpisky/Cad/CadTiskService.cs @@ -0,0 +1,219 @@ +using System.Globalization; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Threading; +using Rozpisky.Models; + +namespace Rozpisky.Cad; + +/// +/// „Vytiskni rozvržení" – port modTiskPriloh (PODKLAD_CAD_Layout_Tisk.md §5): hromadný tisk +/// vybraných layoutů do PDF. Zálohuje a po dokončení (i při chybě/zrušení) vrací systémové proměnné +/// výkresu (BACKGROUNDPLOT, PLOTTRANSPARENCYOVERRIDE, LTSCALE). +/// +public static class CadTiskService +{ + /// Vytiskne vybrané přílohy (jejich ) do PDF do + /// . a + /// se přebírají z MainViewModel, aby se název + /// souboru (přípona „_rozpiska") a chování při zamčeném cíli chovaly stejně jako u exportu do PDF. + public static async Task VytiskniRozvrzeni(dynamic doc, IReadOnlyList vybrane, string cilovaSlozka, + Nastaveni nastaveni, ILayoutLog log, Func sestavNazevSouboru, + Func pockejNaUvolneniSouboru, CancellationToken zruseno) + { + if (vybrane.Count == 0) { log.Chyba("Není vybraný žádný řádek seznamu."); return; } + Diag($"Start tisku, {vybrane.Count} řádků, cíl {cilovaSlozka}"); + + // Celočíselné sysvars se přes COM nastavují jako short (VT_I2) – VBA Integer. .NET int + // (VT_I4) u SetVariable("PLOTTRANSPARENCYOVERRIDE", 2) shodil AutoCAD/aplikaci nativně, + // bez výjimky a bez error.log (lokalizováno breadcrumbs v tisk_diag.log, 2026-07-05). + object? puvodniBackgroundPlot = null, puvodniTransparency = null, puvodniLtscale = null; + bool vratitBackgroundPlot = false, vratitTransparency = false, vratitLtscale = false; + try + { + Diag("GetVariable BACKGROUNDPLOT"); + puvodniBackgroundPlot = doc.GetVariable("BACKGROUNDPLOT"); + Diag("GetVariable LTSCALE"); + puvodniLtscale = doc.GetVariable("LTSCALE"); + + Diag("SetVariable BACKGROUNDPLOT=0"); + doc.SetVariable("BACKGROUNDPLOT", (short)0); // tisk na popředí – PlotToFile musí počkat na dokončení + vratitBackgroundPlot = true; + } + catch (Exception ex) + { + log.Chyba($"Přípravu systémových proměnných výkresu se nepodařilo dokončit: {ex.Message}"); + return; + } + + // Ignorování průhlednosti je jen urychlení tisku – jeho selhání nesmí tisk zastavit, proto + // vlastní try/catch. Zápis se navíc přeskočí, když už hodnota 2 je (žádné zbytečné COM volání + // proměnné, na které to padalo). + try + { + Diag("GetVariable PLOTTRANSPARENCYOVERRIDE"); + puvodniTransparency = doc.GetVariable("PLOTTRANSPARENCYOVERRIDE"); + if (Convert.ToInt32(puvodniTransparency) != 2) + { + Diag("SetVariable PLOTTRANSPARENCYOVERRIDE=2"); + doc.SetVariable("PLOTTRANSPARENCYOVERRIDE", (short)2); // ignorovat průhlednost + vratitTransparency = true; + } + else Diag("PLOTTRANSPARENCYOVERRIDE už je 2, přeskakuji"); + } + catch (Exception ex) + { + log.Chyba($"Nastavení PLOTTRANSPARENCYOVERRIDE selhalo (tisk pokračuje): {ex.Message}"); + } + Diag("Sysvar připraveny"); + + int vytisknuto = 0, preskoceno = 0; + try + { + for (int i = 0; i < vybrane.Count; i++) + { + if (zruseno.IsCancellationRequested) { log.Info("Zrušeno uživatelem – tisk ukončen."); break; } + await Dispatcher.Yield(DispatcherPriority.Background); // nech log okno/stavový řádek překreslit + + var p = vybrane[i]; + Diag($"Iterace {i}: JmenoRozvrzeni „{p.JmenoRozvrzeni}“"); + var nazev = sestavNazevSouboru(p); + if (nazev is null) + { + log.Chyba($"Řádek {i + 1}: chybí jméno rozvržení, přeskočeno."); + preskoceno++; + continue; + } + + if (nastaveni.LtscaleAutomaticky) + { + var ltscale = NactiLtscale(p.Ltscale); + Diag($"SetVariable LTSCALE={ltscale.ToString(CultureInfo.InvariantCulture)}"); + try { doc.SetVariable("LTSCALE", ltscale); vratitLtscale = true; } // LTSCALE je RTREAL – double je správný typ + catch (Exception ex) { log.Chyba($"„{nazev}“: nastavení LTSCALE selhalo: {ex.Message}"); } + } + + var cesta = Path.Combine(cilovaSlozka, nazev + ".pdf"); + if (!pockejNaUvolneniSouboru(cesta)) { log.Info("Přerušeno uživatelem (soubor byl používán)."); break; } + + Diag($"Hledám layout „{p.JmenoRozvrzeni}“"); + // Záměrně výčtem, ne doc.Layouts.Item(jméno): Item s neexistujícím klíčem AutoCAD + // přes COM neshodil do chytatelné výjimky, ale nativně položil aplikaci (stejná třída + // problému jako SetVariable s VT_I4 – viz podklad §9 bod 9; nalezeno 2026-07-05). + dynamic? layout = NajdiLayout(doc, p.JmenoRozvrzeni!); + if (layout is null) + { + log.Chyba($"„{nazev}“: rozvržení „{p.JmenoRozvrzeni}“ ve výkresu neexistuje, přeskočeno."); + preskoceno++; + continue; + } + + try + { + Diag($"Aktivuji layout „{nazev}“"); + doc.ActiveLayout = layout; + // Breadcrumb těsně před nativním voláním: tvrdý pád CAD serveru (AccessViolation + // v PlotToFile) nezanechá stopu v error.log ani v log okně (to zmizí s procesem) – + // poslední řádek v tisk_diag.log pak ukáže, na kterém layoutu to spadlo. + Diag($"Před PlotToFile: „{nazev}“ → {cesta}"); + bool ok = doc.Plot.PlotToFile(cesta); + Diag($"Po PlotToFile: „{nazev}“ = {ok}"); + if (ok) + { + log.Info($"„{nazev}“: vytištěno do {cesta}."); + vytisknuto++; + } + else + { + log.Chyba($"„{nazev}“: tisk se nezdařil (PlotToFile vrátil false – zkontroluj " + + "tiskárnu/formát rozvržení přes „Aktualizuj rozvržení“)."); + preskoceno++; + } + } + catch (Exception ex) + { + log.Chyba($"„{nazev}“: tisk selhal: {ex.Message}"); + preskoceno++; + } + } + } + finally + { + // Vrací se jen to, co se skutečně změnilo – zbytečné SetVariable na proměnnou, která se + // nenastavovala, je přesně to volání, na kterém to umí spadnout. Původní hodnoty jdou + // zpět tak, jak je GetVariable vydal (boxed variant se správným typem). + Diag("Obnova systémových proměnných"); + if (vratitBackgroundPlot) + try { doc.SetVariable("BACKGROUNDPLOT", puvodniBackgroundPlot); } catch { /* nekritické */ } + if (vratitTransparency) + try { doc.SetVariable("PLOTTRANSPARENCYOVERRIDE", puvodniTransparency); } catch { /* nekritické */ } + if (vratitLtscale) + try { doc.SetVariable("LTSCALE", puvodniLtscale); } catch { /* nekritické */ } + } + + log.Info($"Hotovo: vytištěno {vytisknuto}, přeskočeno {preskoceno}."); + Diag($"Konec tisku: vytištěno {vytisknuto}, přeskočeno {preskoceno}"); + } + + /// Najde rozvržení podle názvu výčtem kolekce doc.Layouts (názvy layoutů jsou + /// case-insensitive unikátní). Vrací null, když neexistuje – bez vyhazujícího + /// Layouts.Item, který na AutoCADu při neexistujícím klíči shodil aplikaci nativně. + private static dynamic? NajdiLayout(dynamic doc, string jmeno) + { + try + { + foreach (dynamic l in doc.Layouts) + { + string n; + try { n = (string)l.Name; } catch { continue; } + if (string.Equals(n, jmeno, StringComparison.OrdinalIgnoreCase)) return l; + } + } + catch { /* kolekci se nepodařilo projít → jako nenalezeno, volající zaloguje a přeskočí */ } + return null; + } + + /// Prázdné/nečíselné/≤0 → 1 (podklad §5). Bere jednu hodnotu – Priloha.Ltscale + /// obsahuje po „Aktualizuj rozvržení“ jedinou hodnotu (z prvního výřezu, viz + /// CadLayoutService.VyhodnotLtscale). + private static double NactiLtscale(string? hodnota) + { + if (string.IsNullOrWhiteSpace(hodnota)) return 1; + if (double.TryParse(hodnota, NumberStyles.Float, CultureInfo.InvariantCulture, out var d) && d > 0) return d; + if (double.TryParse(hodnota, NumberStyles.Float, CultureInfo.CurrentCulture, out d) && d > 0) return d; + return 1; + } + + /// Horní mez velikosti tisk_diag.log (bajty). Po překročení se log při startu + /// aplikace smaže, aby po měsících provozu nenarostl do enormních rozměrů. Limit (ne mazání při + /// každém startu) proto, aby breadcrumbs po tvrdém pádu CADu přežily i běžný restart. + private const long MaxLogBajtu = 1 * 1024 * 1024; // 1 MB + + /// Zavolat jednou při startu aplikace: když tisk_diag.log přeroste + /// , smaže ho (jinak nechá být). Nesmí nic shodit. + internal static void UklidLog() + { + try + { + var cesta = Path.Combine(AppContext.BaseDirectory, "tisk_diag.log"); + if (File.Exists(cesta) && new FileInfo(cesta).Length > MaxLogBajtu) + File.Delete(cesta); + } + catch { /* read-only složka apod. – úklid nesmí přerušit start */ } + } + + /// Diagnostický „chlebníček“ – zapíše krok tisku do tisk_diag.log vedle .exe. + /// Slouží k lokalizaci tvrdého pádu CADu (nativní chyba v PlotToFile), který nezanechá + /// stopu v error.log ani v log okně (obojí zmizí s procesem). Zapisuje se synchronně (flush ihned), + /// takže poslední řádek přežije i pád procesu. Diagnostika sama nesmí nic shodit. + internal static void Diag(string krok) + { + try + { + File.AppendAllText(Path.Combine(AppContext.BaseDirectory, "tisk_diag.log"), + $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] {krok}{Environment.NewLine}"); + } + catch { /* read-only složka apod. – nesmí přerušit tisk */ } + } +} diff --git a/Rozpisky/Cad/ComMessageFilter.cs b/Rozpisky/Cad/ComMessageFilter.cs new file mode 100644 index 0000000..d99b256 --- /dev/null +++ b/Rozpisky/Cad/ComMessageFilter.cs @@ -0,0 +1,77 @@ +using System.Runtime.InteropServices; + +namespace Rozpisky.Cad; + +/// +/// COM message filtr (IMessageFilter z ole32, ne WinForms) proti „CAD je zaneprázdněný“. +/// Když v CADu běží příkaz nebo modální dialog, odmítá COM volání s +/// RPC_E_CALL_REJECTED/RPC_E_SERVERCALL_RETRYLATER – bez filtru to znamená +/// vynechaný krok nebo pád celé dávky. Filtr říká COM runtime „zkus to za chvíli znovu“, +/// dokud se CAD neuvolní (max. , pak výjimka propadne do +/// stávajících try/catch a zaloguje se jako dřív). +/// +/// Platí jen pro aktuální STA vlákno – registruje se přes CoRegisterMessageFilter +/// kolem každé CAD akce (using var filtr = ComMessageFilter.Registruj();) a při +/// Dispose vrátí původní filtr. Všechna CAD volání běží na UI (STA) vlákně, viz +/// . +/// +/// +public sealed class ComMessageFilter : IOleMessageFilter, IDisposable +{ + private const int RetryZaMs = 150; // prodleva mezi pokusy + private const int MaxCekaniMs = 30_000; // pak to vzdát → COMException do logu + + // SERVERCALL_ISHANDLED / SERVERCALL_RETRYLATER (enum SERVERCALL z objidl.h) + private const int ServerCallIsHandled = 0; + private const int ServerCallRetryLater = 2; + private const int PendingMsgWaitDefProcess = 2; + + [DllImport("ole32.dll")] + private static extern int CoRegisterMessageFilter(IOleMessageFilter? newFilter, out IOleMessageFilter? oldFilter); + + private IOleMessageFilter? _puvodni; + + private ComMessageFilter() { } + + /// Zaregistruje filtr na aktuálním (STA) vlákně. Když registrace selže + /// (např. MTA vlákno), vrátí no-op instanci – CAD akce poběží jako dřív, bez retry. + public static ComMessageFilter Registruj() + { + var filtr = new ComMessageFilter(); + try { CoRegisterMessageFilter(filtr, out filtr._puvodni); } + catch { /* bez filtru – chování jako dřív */ } + return filtr; + } + + public void Dispose() + { + try { CoRegisterMessageFilter(_puvodni, out _); } + catch { /* nekritické */ } + _puvodni = null; + } + + // --- IOleMessageFilter (my jsme klient – podstatné je RetryRejectedCall) --- + + int IOleMessageFilter.HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo) + => ServerCallIsHandled; + + int IOleMessageFilter.RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType) + { + // dwTickCount = jak dlouho už se na tohle volání čeká; ≥ 0 = zkus znovu za N ms, −1 = vzdát to. + if (dwRejectType == ServerCallRetryLater && dwTickCount < MaxCekaniMs) + return RetryZaMs; + return -1; + } + + int IOleMessageFilter.MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType) + => PendingMsgWaitDefProcess; +} + +/// COM rozhraní IMessageFilter (objidl.h) – nesouvisí s System.Windows.Forms.IMessageFilter. +[ComImport, Guid("00000016-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] +public interface IOleMessageFilter +{ + [PreserveSig] int HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo); + [PreserveSig] int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType); + [PreserveSig] int MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType); +} diff --git a/Rozpisky/Cad/ILayoutLog.cs b/Rozpisky/Cad/ILayoutLog.cs new file mode 100644 index 0000000..fda2c90 --- /dev/null +++ b/Rozpisky/Cad/ILayoutLog.cs @@ -0,0 +1,19 @@ +namespace Rozpisky.Cad; + +/// +/// Průběžný log dávkových CAD akcí (aktualizace rozvržení, tisk do PDF) – každý krok/chyba se +/// zapisuje sem, aby se nic neztratilo v jediném souhrnném MessageBoxu. Implementuje +/// Rozpisky.Views.LayoutLogWindow. +/// +public interface ILayoutLog +{ + /// Zapíše informační řádek (úspěšný krok). + void Info(string zprava); + + /// Zapíše chybový řádek – nepřerušuje dávku, jen ji poznamená. + void Chyba(string zprava); + + /// True, pokud uživatel v okně zvolil „Zrušit" – kontroluje se mezi jednotlivými + /// layouty/soubory dávky. + bool Zruseno { get; } +} diff --git a/Rozpisky/Cad/LayoutConfig.cs b/Rozpisky/Cad/LayoutConfig.cs new file mode 100644 index 0000000..1fc05e0 --- /dev/null +++ b/Rozpisky/Cad/LayoutConfig.cs @@ -0,0 +1,57 @@ +namespace Rozpisky.Cad; + +/// +/// Konfigurace „aktualizace rozvržení" / tisku do PDF (PODKLAD_CAD_Layout_Tisk.md §2–5) – názvy +/// hledaných bloků/hladin ve výkresu a výchozí tiskárna/CTB. Drží se mimo kód v +/// (JSON vedle .exe), protože se liší projekt od projektu / stroj od stroje a needituje se přes UI. +/// +/// Ostatní plotovací konstanty (PaperUnits, PlotRotation, PlotType, StandardScale, PlotOrigin, +/// PlotViewportsFirst) zůstávají pevné v CadLayoutService – jde o mapování na ActiveX +/// konstanty (viz podklad §2), ne o věc, kterou by uživatel přepínal mezi CADy. +/// +/// +public sealed class LayoutConfig +{ + /// Název bloku „rohové razítko" hledaného v každém rozvržení – čte se z něj STAVBA/OBJEKT/PRILOHA/MERITKO. + public string BlokHlavicky { get; set; } = "vykres_hlavicka"; + + /// Název dynamického bloku rámečku, z jehož bounding boxu se počítá počet papírů (A4). + public string BlokRamecek { get; set; } = "ramecek"; + + /// Hladina, ve které se v rozvržení hledají výřezy (viewporty) pro vyhodnocení měřítka. + public string HladinaVyrezu { get; set; } = "!!NOPRINT"; + + /// Šířka jednoho archu A4 v mm (pro výpočet počtu papírů z rámečku). + public double SirkaA4Mm { get; set; } = 210; + + /// Výška jednoho archu A4 v mm (pro výpočet počtu papírů z rámečku). + public double VyskaA4Mm { get; set; } = 297; + + /// Výchozí tiskárna (ConfigName) podle rodiny CADu – klíč je „AutoCAD" / „ZWCAD" / + /// „BricsCAD", odvozený z ProgID připojeného CADu přes + /// (ne popisný CadEngine.Nazev z cad.json – ten je verzovaný „ZWCAD 2023" apod. a nepároval by). + /// Tiskový ovladač „DWG to PDF" má u každého CADu jinou příponu (AutoCAD .pc3, ZWCAD .pc5, + /// BricsCAD jinak) – proto per-rodina, ne jedna společná hodnota. Prázdná/chybějící hodnota = tiskárna se + /// pro danou rodinu nenastaví (zaloguje se jako chyba, zbytek aktualizace pokračuje). + public Dictionary Tiskarny { get; set; } = new() + { + ["AutoCAD"] = "DWG to PDF.pc3", + ["ZWCAD"] = "DWG to PDF.pc5", + ["BricsCAD"] = "DWG to PDF.pc3", + }; + + /// Výchozí styl tisku (StyleSheet) podle rodiny CADu (klíč jako u – + /// „AutoCAD"/„ZWCAD"/„BricsCAD" z ), použije se, když Priloha.Ctb + /// je prázdné. Na rozdíl od toho, co se původně čekalo, .ctb soubory NEJSOU stejné napříč CADy – + /// každý CAD má svou vlastní sadu ve svém instalačním adresáři (AutoCAD nemá „zwcad.ctb" a naopak), + /// takže je to per-rodina stejně jako . Prázdná/chybějící hodnota = CTB se pro + /// danou rodinu nenastaví (zaloguje se jako chyba, zbytek aktualizace pokračuje). POZOR: uveď celý + /// název souboru včetně přípony „.ctb" – na rozdíl od původního VBA (které příponu automaticky + /// dopisovalo) se tu nic nedopisuje. + public Dictionary VychoziCtb { get; set; } = new() + { + ["AutoCAD"] = "acad.ctb", + ["ZWCAD"] = "zwcad.ctb", + ["BricsCAD"] = "default.ctb", + }; +} diff --git a/Rozpisky/Cad/LayoutConfigStore.cs b/Rozpisky/Cad/LayoutConfigStore.cs new file mode 100644 index 0000000..106bd1f --- /dev/null +++ b/Rozpisky/Cad/LayoutConfigStore.cs @@ -0,0 +1,57 @@ +using System.IO; +using System.Text.Encodings.Web; +using System.Text.Json; +using Rozpisky.Data; + +namespace Rozpisky.Cad; + +/// +/// Načítání/ukládání do JSON souboru vedle .exe (portable). Stejný +/// princip jako – konfigurace layoutů/tisku je vlastnost stroje/instalace +/// (bloky a hladiny šablony, dostupné tiskárny), needituje se přes UI, jen ručně v souboru. +/// +public static class LayoutConfigStore +{ + public const string SouborNazev = "layout.json"; + + private static readonly JsonSerializerOptions Opts = new() + { + WriteIndented = true, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; + + /// Výchozí umístění: soubor vedle .exe (portable). + public static string DefaultPath => Path.Combine(AppContext.BaseDirectory, SouborNazev); + + /// Načte konfiguraci. Když soubor chybí/je poškozený, vrátí vestavěné výchozí hodnoty + /// (a rovnou je uloží, aby šel soubor dál ručně upravovat). + public static LayoutConfig Load(string? path = null) + { + path ??= DefaultPath; + try + { + if (File.Exists(path)) + { + var cfg = JsonSerializer.Deserialize(File.ReadAllText(path), Opts); + if (cfg is not null) return cfg; + // Soubor existuje, ale nenese data („null") → záloha + upozornění, viz catch níže. + JsonConfigFile.ZalohujAOhlasPoskozeny(path); + } + } + catch (Exception ex) when (ex is IOException or JsonException or UnauthorizedAccessException) + { + // Poškozený / nečitelný soubor → fallback na výchozí hodnoty. Soubor se hned dole + // přepíše seedem, proto se originál (ručně editovaná konfigurace tiskáren!) nejdřív + // zazálohuje a uživatel dozví. + JsonConfigFile.ZalohujAOhlasPoskozeny(path, ex); + } + var seed = new LayoutConfig(); + Save(seed, path); + return seed; + } + + /// Uloží konfiguraci (atomicky přes .tmp – pád uprostřed zápisu nesmí soubor poškodit). + /// Chyby zápisu (např. read-only složka u .exe v Program Files) propustí volajícímu. + public static void Save(LayoutConfig cfg, string? path = null) + => JsonConfigFile.ZapisAtomicky(path ?? DefaultPath, JsonSerializer.Serialize(cfg, Opts)); +} diff --git a/Rozpisky/Data/CiselnikyStore.cs b/Rozpisky/Data/CiselnikyStore.cs new file mode 100644 index 0000000..4224fbb --- /dev/null +++ b/Rozpisky/Data/CiselnikyStore.cs @@ -0,0 +1,86 @@ +using System.Collections.ObjectModel; +using System.IO; +using System.Text.Encodings.Web; +using System.Text.Json; +using Rozpisky.Models; + +namespace Rozpisky.Data; + +/// +/// Načítání/ukládání sdílených číselníků (organizace, firmy, jména, verze, části) +/// do JSON souboru vedle .exe (portable). Číselníky jsou společné všem projektům +/// (na rozdíl od .rzp přes ), takže žijí mimo projekt. +/// Bez NuGet závislostí – System.Text.Json je součást .NET. +/// +public static class CiselnikyStore +{ + public const string SouborNazev = "ciselniky.json"; + + private static readonly JsonSerializerOptions Opts = new() + { + WriteIndented = true, + // Diakritika čitelně (ě š č…), ne jako \uXXXX. + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; + + /// Výchozí umístění: soubor vedle .exe (portable). Lze přepsat parametrem cesty. + public static string DefaultPath => Path.Combine(AppContext.BaseDirectory, SouborNazev); + + /// Naplní cílové číselníky obsahem z JSON. Vrací false, když soubor neexistuje + /// nebo je poškozený – volající pak nasází výchozí obsah (a uloží nový soubor). + public static bool LoadInto(Ciselniky target, string? path = null) + { + path ??= DefaultPath; + if (!File.Exists(path)) return false; + try + { + // Čteme do DTO se settable List: System.Text.Json neplní get-only ObservableCollection. + var data = JsonSerializer.Deserialize(File.ReadAllText(path), Opts); + if (data is null) + { + // Soubor existuje, ale nenese data („null") → stejné zacházení jako s rozbitým JSON. + JsonConfigFile.ZalohujAOhlasPoskozeny(path); + return false; + } + Replace(target.Organizace, data.Organizace); + Replace(target.Firmy, data.Firmy); + Replace(target.Jmena, data.Jmena); + Replace(target.VerzeDokumentace, data.VerzeDokumentace); + Replace(target.Casti, data.Casti); + Replace(target.Kraje, data.Kraje); + return true; + } + catch (Exception ex) when (ex is IOException or JsonException or UnauthorizedAccessException) + { + // Poškozený / nečitelný soubor → fallback na seed. Volající pak soubor přepíše výchozím + // obsahem, proto se originál nejdřív zazálohuje a uživatel dozví (jinak by o své + // číselníky přišel tiše). + JsonConfigFile.ZalohujAOhlasPoskozeny(path, ex); + return false; + } + } + + /// Uloží číselníky do JSON (atomicky přes .tmp – pád uprostřed zápisu nesmí soubor + /// poškodit). Chyby zápisu (např. read-only složka u .exe v Program Files) propustí volajícímu, + /// ať je může ošetřit dle kontextu (autosave je spolkne, ruční uložení zahlásí). + public static void Save(Ciselniky c, string? path = null) + => JsonConfigFile.ZapisAtomicky(path ?? DefaultPath, JsonSerializer.Serialize(c, Opts)); + + private static void Replace(ObservableCollection target, IEnumerable src) + { + target.Clear(); + foreach (var x in src) target.Add(x); + } + + /// Přechodný tvar pro čtení – settable List<T> (na rozdíl od get-only kolekcí v + /// ). Názvy vlastností musí odpovídat i zápisu. + private sealed class Dto + { + public List Organizace { get; set; } = new(); + public List Firmy { get; set; } = new(); + public List Jmena { get; set; } = new(); + public List VerzeDokumentace { get; set; } = new(); + public List Casti { get; set; } = new(); + public List Kraje { get; set; } = new(); + } +} diff --git a/Rozpisky/Data/DemoData.cs b/Rozpisky/Data/DemoData.cs new file mode 100644 index 0000000..fa07670 --- /dev/null +++ b/Rozpisky/Data/DemoData.cs @@ -0,0 +1,99 @@ +using Rozpisky.Models; +using Rozpisky.ViewModels; + +namespace Rozpisky.Data; + +/// +/// Ukázková data, aby byl po spuštění vidět styl i tok dat. Rozděleno na dvě části: +/// = výchozí obsah sdílených číselníků (nasází se jen když +/// vedle .exe ještě není ciselniky.json), a = demo zakázka +/// (přílohy, revize) – čistě demo, přepíše se otevřením reálného projektu. +/// +public static class DemoData +{ + /// Výchozí obsah číselníků pro úplně první spuštění (než vznikne ciselniky.json). + public static void SeedCiselniky(Ciselniky c) + { + c.Organizace.Add(new Organizace { Nazev = "Správa železnic, s.o.", Adresa = "Dlážděná 1003/7, 110 00 Praha 1", Logo = "sprava_zeleznic.dxf" }); + c.Organizace.Add(new Organizace { Nazev = "SŽ – Stavební správa západ", Adresa = "Sokolovská 1955/278, 190 00 Praha 9" }); + + c.Firmy.Add(new Firma { Nazev = "EXPROJEKT a.s.", Adresa = "Nekonečná 8, 182 00 Praha 8", Telefon = "+420 222 333 444", Email = "info@exprojekt.cz", Logo = "exprojekt.dxf" }); + c.Firmy.Add(new Firma { Nazev = "SUDOP PRAHA a.s.", Adresa = "Olšanská 2643/1a, 130 80 Praha 3", Telefon = "+420 267 094 111", Email = "sudop@sudop.cz" }); + c.Firmy.Add(new Firma { Nazev = "METROPROJEKT Praha a.s.", Adresa = "Argentinská 1621/36, 170 00 Praha 7", Telefon = "+420 296 154 111", Email = "info@metroprojekt.cz" }); + + foreach (var j in new[] { "Ing. Jan Novák", "Ing. Petr Svoboda", "Ing. Eva Dvořáková", "Ing. Pavel Černý" }) + c.Jmena.Add(new Jmeno { Hodnota = j }); + + foreach (var v in new[] { "DOS", "DUR", "DSP", "PDPS", "DPS", "RDS" }) + c.VerzeDokumentace.Add(new VerzeDokumentace { Hodnota = v }); + + c.Casti.Add(new Cast { Oznaceni = "D", Nazev = "Dokumentace objektů" }); + c.Casti.Add(new Cast { Oznaceni = "E", Nazev = "Dokladová část" }); + + SeedKraje(c); + } + + /// Výchozí seznam krajů ČR (14 krajů). Nasází se jen do prázdného číselníku – volá ho + /// jak první spuštění (), tak backfill starších ciselniky.json, + /// které kraje ještě neměly. + public static void SeedKraje(Ciselniky c) + { + if (c.Kraje.Count > 0) return; + foreach (var k in new[] + { + "Hlavní město Praha", "Středočeský", "Jihočeský", "Plzeňský", "Karlovarský", + "Ústecký", "Liberecký", "Královéhradecký", "Pardubický", "Kraj Vysočina", + "Jihomoravský", "Olomoucký", "Zlínský", "Moravskoslezský", + }) + c.Kraje.Add(new Kraj { Nazev = k }); + } + + /// Demo zakázka (údaje projektu + pár příloh + revize). Reference do číselníků se + /// dohledávají podle hodnoty (FirstOrDefault), ať to funguje i s číselníky načtenými ze souboru. + public static void SeedProjekt(MainViewModel vm) + { + var c = vm.Ciselniky; + + vm.Projekt.Stavba = "Modernizace traťového úseku Praha – Beroun"; + vm.Projekt.HIP = "Ing. Jan Novák"; + vm.Projekt.Skod = "S123456789X"; + vm.Projekt.CisloZakazky = "2026-014"; + vm.SelectedInvestor = c.Organizace.FirstOrDefault(); + vm.SelectedSlozkaSZ = c.Organizace.Skip(1).FirstOrDefault() ?? c.Organizace.FirstOrDefault(); + vm.SelectedStupen = c.VerzeDokumentace.FirstOrDefault(v => v.Hodnota == "DPS") ?? c.VerzeDokumentace.FirstOrDefault(); + vm.SelectedZhotovitelSOD = c.Firmy.FirstOrDefault(); + vm.Projekt.SmluvniDatumZpracovani = "2026-03-15"; + // Loga financujících institucí (DXF ve složce loga\ vedle .exe). + vm.Projekt.Logo1Soubor = "eu_op_doprava.dxf"; // dotační (vlevo) + vm.Projekt.Logo2Soubor = "md_sfdi.dxf"; // státní (vpravo) + + // Demo: navázat loga na vybranou organizaci/firmu, ať se v náhledu ukážou i loga 3/4/5. + // (Stávající ciselniky.json vzniklý před polem Logo ho má prázdný – doplníme, pokud chybí.) + if (vm.SelectedInvestor is { } inv && string.IsNullOrWhiteSpace(inv.Logo)) inv.Logo = "sprava_zeleznic.dxf"; + if (vm.SelectedZhotovitelSOD is { } zh && string.IsNullOrWhiteSpace(zh.Logo)) zh.Logo = "exprojekt.dxf"; + // Zhotovitel objektu = vybraná firma (aby se logo 5 spárovalo dle Priloha.ZhotovitelCasti). + string zhotovitelCasti = vm.SelectedZhotovitelSOD?.Nazev ?? "EXPROJEKT a.s."; + + vm.Prilohy.Add(new Priloha + { + OznaceniCasti = "D", OznaceniDilciCasti = "D110", NazevObjektu = "Železniční svršek", CisloObjektu = "SO131.13.12.01", + TypPrilohy = "D.1", DilciPriloha = "1", PoradiPrilohy = "101", + NazevPrilohy = "Situace", Zkratka = "SIT", Vypracoval = "Ing. Petr Svoboda", + OdpovednyProjektant = "Ing. Jan Novák", R1 = "V00", KontrolovalR1 = "Ing. Pavel Černý", + ZhotovitelCasti = zhotovitelCasti, Meritko = "1:1000", Formaty = "4", Kraj = "Středočeský", + KatastralniUzemi = "viz textová část", Ltscale = "1.0", Ctb = "monochrome.ctb", + }); + vm.Prilohy.Add(new Priloha + { + OznaceniCasti = "D", OznaceniDilciCasti = "D110", NazevObjektu = "Most v km 12,345", CisloObjektu = "SO201", + TypPrilohy = "D.1", DilciPriloha = "1", PoradiPrilohy = "201", + NazevPrilohy = "Podélný řez", Zkratka = "PR", Vypracoval = "Ing. Eva Dvořáková", + OdpovednyProjektant = "Ing. Jan Novák", R1 = "V00", KontrolovalR1 = "Ing. Pavel Černý", + ZhotovitelCasti = zhotovitelCasti, Meritko = "1:100", Formaty = "2", Kraj = "Středočeský", + KatastralniUzemi = "viz textová část", Ltscale = "1.0", Ctb = "monochrome.ctb", + }); + + vm.Revize.Add(new Revize { Cislo = "V00", Datum = "-", Popis = "Vyjádření, stanoviska, připomínky" }); + vm.Revize.Add(new Revize { Cislo = "V01", Datum = "2026-03-15", Popis = "První vydání" }); + } +} diff --git a/Rozpisky/Data/JsonConfigFile.cs b/Rozpisky/Data/JsonConfigFile.cs new file mode 100644 index 0000000..a7b977b --- /dev/null +++ b/Rozpisky/Data/JsonConfigFile.cs @@ -0,0 +1,63 @@ +using System.IO; +using System.Text; +using System.Windows; + +namespace Rozpisky.Data; + +/// +/// Společné zacházení s JSON konfiguračními soubory vedle .exe (ciselniky.json, +/// cad.json, layout.json, mapovani.json). Řeší dvě slabiny přímého +/// File.WriteAllText: pád uprostřed zápisu nesmí poškodit původní soubor (atomický zápis +/// přes .tmp) a poškozený soubor se nesmí tiše zahodit – ručně editovaný config s překlepem by se +/// jinak bez varování přepsal výchozími hodnotami a uživatel by přišel o vlastní data. +/// +public static class JsonConfigFile +{ + /// Zapíše text nejdřív do cesta.tmp a pak ho přejmenuje přes cíl. Pád uprostřed + /// zápisu tak nechá původní soubor netknutý (nedokončený .tmp se při dalším zápisu přepíše). + public static void ZapisAtomicky(string cesta, string obsah) + { + var tmp = cesta + ".tmp"; + File.WriteAllText(tmp, obsah); + File.Move(tmp, cesta, overwrite: true); + } + + /// Zavolat, když existující config nejde načíst (rozbité JSON, nečitelný soubor): + /// zkopíruje ho do cesta.bak (starší zálohu přepíše) a uživatele upozorní. Upozornění jde + /// do error.log hned a MessageBox se odloží přes Dispatcher – configy se načítají už + /// v konstruktoru VM, kdy hlavní okno ještě nestojí. Kopíruje (nepřesouvá), aby soubor, který + /// nikdo nepřepisuje (mapovani.json), varoval při každém startu, dokud ho uživatel neopraví. + public static void ZalohujAOhlasPoskozeny(string cesta, Exception? duvod = null) + { + string? zaloha = cesta + ".bak"; + try { File.Copy(cesta, zaloha, overwrite: true); } + catch { zaloha = null; } // i nečitelný originál → aspoň upozornit, bez zálohy + + var jmeno = Path.GetFileName(cesta); + ZapisDoErrorLogu($"„{jmeno}“ je poškozený ({duvod?.Message ?? "neznámý důvod"}); " + + (zaloha is null ? "záloha se nepodařila." : $"záloha: {zaloha}")); + + var zprava = $"Soubor {jmeno} je poškozený nebo nečitelný, načetly se výchozí hodnoty.\n\n" + + (zaloha is null + ? "Zálohu původního souboru se nepodařilo vytvořit." + : $"Původní obsah je zálohovaný v:\n{zaloha}") + + "\n\nPodrobnosti jsou v souboru error.log vedle aplikace."; + // BeginInvoke: hláška se ukáže až po rozběhnutí UI smyčky (config se čte před oknem). + Application.Current?.Dispatcher.BeginInvoke(() => + MessageBox.Show(zprava, "Poškozený konfigurační soubor", + MessageBoxButton.OK, MessageBoxImage.Warning)); + } + + /// Zápis do error.log stejným formátem jako globální záchytná síť v App. + /// Nesmí nic shodit (read-only složka apod.). + private static void ZapisDoErrorLogu(string text) + { + try + { + File.AppendAllText(Path.Combine(AppContext.BaseDirectory, "error.log"), + $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] Config: {text}{Environment.NewLine}{Environment.NewLine}", + Encoding.UTF8); + } + catch { /* error.log je jen stopa navíc – MessageBox se ukáže i tak */ } + } +} diff --git a/Rozpisky/Data/ProjektStore.cs b/Rozpisky/Data/ProjektStore.cs new file mode 100644 index 0000000..856fc7c --- /dev/null +++ b/Rozpisky/Data/ProjektStore.cs @@ -0,0 +1,115 @@ +using System.IO; +using System.Text; +using System.Text.Encodings.Web; +using System.Text.Json; +using Rozpisky.Models; + +namespace Rozpisky.Data; + +/// +/// Společné konstanty a JSON nastavení pro `.rzp` soubory. Vlastní čtení/zápis se zámkem +/// řeší . Žádné NuGet závislosti (System.Text.Json je součást .NET). +/// +public static class ProjektStore +{ + public const string Pripona = ".rzp"; + public const string DialogFilter = "Projekt Rozpisky (*.rzp)|*.rzp|Všechny soubory (*.*)|*.*"; + + internal static readonly JsonSerializerOptions Opts = new() + { + WriteIndented = true, + // Aby se diakritika v souboru psala čitelně (ě š č…), ne jako \uXXXX. + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; +} + +/// +/// Otevřený `.rzp` soubor s exkluzivním zámkem drženým po celou dobu, co je projekt +/// otevřený. Díky ho ostatní procesy smí jen číst/kopírovat, +/// ale nejde smazat, přejmenovat ani přepsat – Windows ho hlásí jako „používaný". Ukládání +/// jde přes držený handle (zámek se neuvolní). Zavře se přes (zavření +/// projektu/appky); při pádu uvolní zámek operační systém sám. +/// +public sealed class ProjektFileHandle : IDisposable +{ + private readonly FileStream _stream; + + /// Cesta k zamčenému souboru. + public string Cesta { get; } + + private ProjektFileHandle(string cesta, FileStream stream) + { + Cesta = cesta; + _stream = stream; + } + + /// Otevře existující soubor s exkluzivním zámkem a vrátí načtený dokument. + /// Vyhodí , když je soubor otevřený jinde (sdílecí porušení). + public static ProjektFileHandle Otevri(string cesta, out ProjektDocument doc) + { + var fs = new FileStream(cesta, FileMode.Open, FileAccess.ReadWrite, FileShare.Read); + try + { + string text = Cti(fs); + doc = JsonSerializer.Deserialize(text, ProjektStore.Opts) + ?? throw new InvalidDataException("Soubor projektu je prázdný nebo poškozený."); + return new ProjektFileHandle(cesta, fs); + } + catch + { + fs.Dispose(); // při chybě zámek nedržíme + throw; + } + } + + /// Vytvoří/přepíše soubor na nové cestě, zapíše dokument a podrží zámek. + /// Vyhodí , když je cílový soubor otevřený jinde. + public static ProjektFileHandle Vytvor(string cesta, ProjektDocument doc) + { + var fs = new FileStream(cesta, FileMode.Create, FileAccess.ReadWrite, FileShare.Read); + try + { + Zapis(fs, doc); + return new ProjektFileHandle(cesta, fs); + } + catch + { + fs.Dispose(); + throw; + } + } + + /// Přečte soubor jen pro čtení (bez zámku) – i když ho jiný proces drží otevřený. + /// Žádá pouze a povoluje , takže + /// nekoliduje s cizím zámkem. Handle se nedrží – vrací jen načtený dokument. + public static ProjektDocument CtiJenProCteni(string cesta) + { + using var fs = new FileStream(cesta, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return JsonSerializer.Deserialize(Cti(fs), ProjektStore.Opts) + ?? throw new InvalidDataException("Soubor projektu je prázdný nebo poškozený."); + } + + /// Uloží dokument přes držený zámek (soubor zůstává zamčený). + public void Uloz(ProjektDocument doc) => Zapis(_stream, doc); + + private static void Zapis(FileStream fs, ProjektDocument doc) + { + // Serializace musí proběhnout PŘED useknutím souboru – kdyby vyhodila výjimku + // až po SetLength(0), zůstal by soubor prázdný a projekt by byl nenávratně pryč. + string json = JsonSerializer.Serialize(doc, ProjektStore.Opts); + fs.Seek(0, SeekOrigin.Begin); + fs.SetLength(0); + using (var w = new StreamWriter(fs, new UTF8Encoding(false), 1024, leaveOpen: true)) + w.Write(json); + fs.Flush(flushToDisk: true); + } + + private static string Cti(FileStream fs) + { + fs.Seek(0, SeekOrigin.Begin); + using var r = new StreamReader(fs, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, 1024, leaveOpen: true); + return r.ReadToEnd(); + } + + public void Dispose() => _stream.Dispose(); +} diff --git a/Rozpisky/Dxf/DxfTemplate.cs b/Rozpisky/Dxf/DxfTemplate.cs new file mode 100644 index 0000000..1a9e9e0 --- /dev/null +++ b/Rozpisky/Dxf/DxfTemplate.cs @@ -0,0 +1,685 @@ +using System.IO; +using System.Text.RegularExpressions; +using ACadSharp; +using ACadSharp.Entities; +using ACadSharp.IO; +using ACadSharp.Objects; +using CSMath; +using Rozpisky.Rendering; +using AcTextStyle = ACadSharp.Tables.TextStyle; +using FontFlags = ACadSharp.Tables.FontFlags; + +namespace Rozpisky.Dxf; + +/// +/// Načte DXF šablonu rozpisky (ACadSharp) a „přehraje" ji do +/// (ROZPISKY.md §4). Statická geometrie + popisky se kreslí vždy; pole (ATTDEF) se buď +/// vykreslí jako názvy (předpis), nebo vyplní hodnotami. ACadSharp na rozdíl od netDxf +/// vystaví font ze stylu i box-šířku víceřádkových atributů (XRecord, group 41). +/// +public sealed partial class DxfTemplate +{ + private readonly CadDocument _doc; + + /// Hladina vodicího rámečku uvnitř vkládaných DXF (loga/schéma) – definuje návrhový + /// obdélník pro umístění. Nekreslí se a slouží jako reference pro fit místo bboxu kresby. + public const string HladinaNoPrint = "!!NOPRINT"; + + /// Převod úhlu z radiánů (ACadSharp vrací rotace v radiánech) na stupně (renderer). + private const double RadToDeg = 180.0 / Math.PI; + + /// Hladiny vyhrazené pro placeholder-rámečky (loga + orientační schéma). Obdélníky na + /// těchto hladinách jsou jen vodítka (poloha + max. velikost), nekreslí se (mají PlotFlag=0). + public static readonly IReadOnlyList PlaceholderHladiny = new[] + { + "Rozpiska_logo1", "Rozpiska_logo2", "Rozpiska_logo3", "Rozpiska_logo4", "Rozpiska_logo5", + "Rozpiska_Orientační schéma", + }; + + public DxfTemplate(string path) + { + _doc = DxfReader.Read(path) ?? throw new InvalidDataException($"DXF nelze načíst: {path}"); + SheetFrame = FindSheetFrame(); + Placeholders = FindPlaceholders(); + } + + /// Bounds A4 rámečku šablony (uzavřená polylinie ~A4) – referenční obdélník pro mapování + /// na papír 1:1, aby rozpiska byla vystředěná dle návrhu. Null = nenalezen (export centruje obsah). + public (double X, double Y, double W, double H)? SheetFrame { get; } + + /// Rámečky placeholderů (hladina → obdélník v mm) z uzavřených polylinií na + /// . Do těchto obdélníků se fitují loga / orientační schéma. + public IReadOnlyDictionary Placeholders { get; } + + private (double X, double Y, double W, double H)? _bounds; + private bool _boundsComputed; + + /// Ohraničení (bbox) kreslené geometrie a textů v mm – slouží k výpočtu fitu, když se + /// tato šablona použije jako vkládaný fragment (logo / schéma). Null = prázdná/degenerovaná kresba. + public (double X, double Y, double W, double H)? Bounds + { + get + { + if (!_boundsComputed) { _bounds = ComputeBounds(); _boundsComputed = true; } + return _bounds; + } + } + + private (double X, double Y, double W, double H)? _frameBounds; + private bool _frameComputed; + + /// Bbox vodicího rámečku na hladině (pokud existuje) – + /// preferovaná reference pro fit vkládaného loga/schématu místo bboxu kresby. Null = bez rámečku. + public (double X, double Y, double W, double H)? FrameBounds + { + get + { + if (!_frameComputed) { _frameBounds = ComputeFrameBounds(); _frameComputed = true; } + return _frameBounds; + } + } + + private IEnumerable AttrDefs => _doc.Entities.OfType(); + + /// Přehraje šablonu do kreslítka. = null → vykreslí názvy polí. + /// = true → vykreslí i geometrii na hladině + /// (např. A4 rámeček) – pro DXF export jako referenci hranice papíru. + public void Replay(IProfileRenderer g, IReadOnlyDictionary? values = null, bool includeNoPrint = false) + { + // Jeden průchod v pořadí kresby (viz EntitiesInDrawOrder) – zachovává překrývání entit ze + // zdroje (výplně vzadu, popisky vepředu apod.). Dispatch podle typu; odvozené typy (Arc:Circle, + // AttributeDefinition:AttributeBase:TextEntity) musí být ve switchi PŘED svými předky. + foreach (var e in EntitiesInDrawOrder()) + { + if (!SetLayer(g, e, includeNoPrint)) continue; + switch (e) + { + case Line l: + g.Line(l.StartPoint.X, l.StartPoint.Y, l.EndPoint.X, l.EndPoint.Y); + break; + + case LwPolyline pl: + KresliPolyline(g, pl.Vertices.Select(v => (v.Location.X, v.Location.Y, v.Bulge)).ToList(), pl.IsClosed); + break; + + // Klasické 2D polylinie (Polyline2D) – v mapách/schématech časté (tratě), i s bulge oblouky. + case Polyline2D pl: + KresliPolyline(g, pl.Vertices.Select(v => (v.Location.X, v.Location.Y, v.Bulge)).ToList(), pl.IsClosed); + break; + + // Spliny (NURBS) – tesselace na lomenou čáru přes ACadSharp. + case Spline sp: + { + var pts = sp.PolygonalVertexes(64).Select(p => (p.X, p.Y)).ToList(); + if (pts.Count >= 2) g.Polyline(pts, sp.IsClosed); + break; + } + + // Oblouk (Arc dědí z Circle) – analytický, aby byl hladký v každém přiblížení. + case Arc a: + g.Stroke(ArcContour(a)); + break; + + case Circle c: + g.Circle(c.Center.X, c.Center.Y, c.Radius); + break; + + // Výplně (HATCH) – vyplněné plochy (typicky loga). Každá cesta = smyčka, even-odd díry. + case Hatch hatch: + { + var loops = HatchSmycky(hatch); + if (loops.Count > 0) g.Fill(loops); + break; + } + + // Pole (ATTDEF) – buď názvy polí (předpis), nebo vyplněné hodnoty. + case AttributeDefinition ad: + { + string text; + if (values is null) + { + text = ad.Tag; // předpis – vykresli název pole + } + else + { + values.TryGetValue(NormalizeTag(ad.Tag), out var val); + if (string.IsNullOrEmpty(val)) break; // nevyplněné pole = prázdné + text = val; + } + var (x, y, h, v) = Place(ad.HorizontalAlignment, ad.VerticalAlignment, ad.InsertPoint, ad.AlignmentPoint); + // Víceřádkové atributy nesou box-šířku (rectangle width) v XRecordu group 41. + g.Text(x, y, text, ad.Height, h, v, ad.Rotation * RadToDeg, StyleOf(ad.Style, ad.ObliqueAngle), ad.WidthFactor, MultilineWidth(ad)); + break; + } + + // Ostatní atributy (hodnoty INSERTů) nekreslíme – řeší se přes ATTDEF šablony. + case AttributeBase: + break; + + case TextEntity t: + { + var (x, y, h, v) = Place(t.HorizontalAlignment, t.VerticalAlignment, t.InsertPoint, t.AlignmentPoint); + g.Text(x, y, t.Value, t.Height, h, v, t.Rotation * RadToDeg, StyleOf(t.Style, t.ObliqueAngle), t.WidthFactor); + break; + } + + case MText mt: + { + var (h, v) = MapMTextAlign(mt.AttachmentPoint); + g.Text(mt.InsertPoint.X, mt.InsertPoint.Y, mt.PlainText, mt.Height, h, v, mt.Rotation * RadToDeg, + StyleOf(mt.Style), 1, mt.RectangleWidth); + break; + } + } + } + } + + /// Entity model-space v pořadí kresby: pokud má blok tabulku pořadí (SortEntitiesTable, + /// tj. „draw order" nastavené v CADu), seřadí podle ní; jinak zachová pořadí ze souboru. Nižší sort + /// handle = kreslí se dřív (vzadu). LINQ OrderBy je stabilní → entity bez záznamu drží pořadí. + private IEnumerable EntitiesInDrawOrder() + { + var ents = _doc.Entities.OfType(); + var sort = _doc.ModelSpace?.SortEntitiesTable; + if (sort is null) return ents; + return ents.OrderBy(e => SortHandle(sort, e)); + + static ulong SortHandle(ACadSharp.Objects.SortEntitiesTable t, Entity e) + { + try { return t.GetSorterHandle(e); } catch { return e.Handle; } + } + } + + /// Vykreslí LwPolyline/Polyline2D: bez oblouků jako lomenou čáru (Polyline), + /// s bulge jako obrys se zachovanými kruhovými oblouky (Stroke). + private static void KresliPolyline(IProfileRenderer g, IReadOnlyList<(double X, double Y, double Bulge)> verts, bool closed) + { + if (verts.Count < 2) return; + bool maOblouk = false; + for (int i = 0; i < verts.Count; i++) if (Math.Abs(verts[i].Bulge) > 1e-9) { maOblouk = true; break; } + if (!maOblouk) { g.Polyline(verts.Select(v => (v.X, v.Y)).ToList(), closed); return; } + g.Stroke(PolylineContour(verts, closed)); + } + + /// Nastaví hladinu do kreslítka. Vrací false, pokud se hladina nemá tisknout (přeskočit kresbu). + /// = true → geometrie na se nepřeskočí + /// (kreslí se i přes vypnutý plot flag – DXF reference A4 rámečku). + private static bool SetLayer(IProfileRenderer g, Entity e, bool includeNoPrint = false) + { + var layer = e.Layer; + bool noPrint = JeNoPrint(e); + if (noPrint && !includeNoPrint) return false; // vodicí rámeček vkládaného DXF se nekreslí + if (!noPrint && layer is not null && (!layer.PlotFlag || !layer.IsOn)) return false; + var col = e.Color.IsByLayer && layer is not null ? layer.Color : e.Color; // ByLayer → barva hladiny + int rgb = (col.R << 16) | (col.G << 8) | col.B; // ACadSharp rozbalí i index/true-color + int lw = (int)e.LineWeight; // LineWeightType: Wnn = nn/100 mm, záporné = ByLayer/Default/ByBlock + if (lw < 0 && layer is not null) lw = (int)layer.LineWeight; + g.Layer(layer?.Name ?? "0", rgb, lw > 0 ? lw / 100.0 : 0.18); + return true; + } + + /// Zjistí kotvu a zarovnání textu (Left+Baseline → vkládací bod, jinak zarovnávací bod). + private static (double x, double y, HAlign h, VAlign v) Place( + TextHorizontalAlignment ha, TextVerticalAlignmentType va, XYZ insert, XYZ align) + { + var h = ha switch + { + TextHorizontalAlignment.Center or TextHorizontalAlignment.Middle => HAlign.Center, + TextHorizontalAlignment.Right => HAlign.Right, + _ => HAlign.Left, // Left / Aligned / Fit (aproximace) + }; + var v = va switch + { + TextVerticalAlignmentType.Top => VAlign.Top, + TextVerticalAlignmentType.Middle => VAlign.Middle, + TextVerticalAlignmentType.Bottom => VAlign.Bottom, + _ => VAlign.Baseline, + }; + bool useAlign = ha != TextHorizontalAlignment.Left || va != TextVerticalAlignmentType.Baseline; + var p = useAlign ? align : insert; + return (p.X, p.Y, h, v); + } + + /// Převede DXF textový styl na vzhled písma rendereru. Pro TTF předá soubor + /// (přesný řez – verdanab.ttf), SHX → fallback. Řez i jako záloha z TrueType flagů. + /// = oblique úhel entity (group 51, radiány) – rozhodující; + /// při 0 se použije oblique stylu (group 50 je jen výchozí hodnota při tvorbě textu). + private static Rozpisky.Rendering.TextStyle StyleOf(AcTextStyle? s, double entityObliqueRad = 0) + { + double obliqueRad = entityObliqueRad != 0 ? entityObliqueRad : s?.ObliqueAngle ?? 0; + if (s is null) return new(ObliqueDeg: obliqueRad * RadToDeg); + string? file = s.IsShapeFile || string.IsNullOrWhiteSpace(s.Filename) ? null : s.Filename; + bool bold = s.TrueType.HasFlag(FontFlags.Bold); + bool italic = s.TrueType.HasFlag(FontFlags.Italic); + // Rodina písma: z .ttf souboru; když styl soubor nemá (TTF zadané jen jménem), vezmi + // název typu písma z XData(ACAD) – tam AutoCAD ukládá rodinu (např. „Arial Black"). + string? family = file is not null ? Path.GetFileNameWithoutExtension(file) : FontRodinaZeXData(s); + return new(family, bold, italic, file, obliqueRad * RadToDeg); + } + + /// Název rodiny TrueType písma uložený ve stylu jako XData appid „ACAD" (první ASCII + /// řetězec), používaný když styl nemá .ttf soubor. Null = není. + private static string? FontRodinaZeXData(AcTextStyle s) + { + if (s.ExtendedData is not { } xd) return null; + foreach (var entry in xd) + { + if (!string.Equals(entry.Key?.Name, "ACAD", StringComparison.OrdinalIgnoreCase)) continue; + var recs = entry.Value?.Records; + if (recs is null) continue; + foreach (var rec in recs) + if (rec.GetType().GetProperty("Value")?.GetValue(rec) is string str && !string.IsNullOrWhiteSpace(str)) + return str.Trim(); + } + return null; + } + + /// Najde A4 rámeček: uzavřenou polylinii s bbox ≈ A4 (210×297 / 297×210), největší vyhovující. + private (double X, double Y, double W, double H)? FindSheetFrame() + { + (double X, double Y, double W, double H)? best = null; + foreach (var pl in _doc.Entities.OfType()) + { + if (!pl.IsClosed || pl.Vertices.Count < 4) continue; + double ax = double.MaxValue, ay = double.MaxValue, bx = double.MinValue, by = double.MinValue; + foreach (var v in pl.Vertices) + { + ax = Math.Min(ax, v.Location.X); ay = Math.Min(ay, v.Location.Y); + bx = Math.Max(bx, v.Location.X); by = Math.Max(by, v.Location.Y); + } + double w = bx - ax, h = by - ay; + bool a4 = (Near(w, 297) && Near(h, 210)) || (Near(w, 210) && Near(h, 297)); + if (a4 && (best is null || w * h > best.Value.W * best.Value.H)) + best = (ax, ay, w, h); + } + return best; + + static bool Near(double a, double b) => Math.Abs(a - b) < 2.0; + } + + /// Najde rámečky placeholderů: uzavřené polylinie na , + /// pro každou hladinu bbox vrcholů. Při více polyliniích na hladině vezme největší. + private IReadOnlyDictionary FindPlaceholders() + { + var hladiny = new HashSet(PlaceholderHladiny, StringComparer.OrdinalIgnoreCase); + var res = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var pl in _doc.Entities.OfType()) + { + var name = pl.Layer?.Name; + if (name is null || !hladiny.Contains(name) || pl.Vertices.Count < 2) continue; + double ax = double.MaxValue, ay = double.MaxValue, bx = double.MinValue, by = double.MinValue; + foreach (var v in pl.Vertices) + { + ax = Math.Min(ax, v.Location.X); ay = Math.Min(ay, v.Location.Y); + bx = Math.Max(bx, v.Location.X); by = Math.Max(by, v.Location.Y); + } + var rect = (ax, ay, bx - ax, by - ay); + if (!res.TryGetValue(name, out var prev) || rect.Item3 * rect.Item4 > prev.W * prev.H) + res[name] = rect; + } + return res; + } + + /// Spočítá bbox kreslené geometrie (čáry, polylinie, výplně, texty) – pro fit fragmentu. + /// Přehrává tutéž kresbu jako do , takže bbox + /// vždy odpovídá tomu, co se skutečně kreslí (texty včetně odhadu šířky/výšky, ne jen kotvy). + /// Prázdný slovník hodnot → pole (ATTDEF) se přeskočí; null by vykreslil názvy tagů. + /// Vodicí rámeček na hladině se nezapočítává (řeší ). + private (double X, double Y, double W, double H)? ComputeBounds() + { + var b = new BoundsRenderer(); + Replay(b, values: new Dictionary()); + return b.IsEmpty || b.Width <= 0 || b.Height <= 0 ? null : (b.MinX, b.MinY, b.Width, b.Height); + } + + /// Bbox vodicího rámečku (uzavřená polylinie / čáry na hladině ). + private (double X, double Y, double W, double H)? ComputeFrameBounds() + { + double ax = double.MaxValue, ay = double.MaxValue, bx = double.MinValue, by = double.MinValue; + bool any = false; + void Add(double x, double y) { ax = Math.Min(ax, x); ay = Math.Min(ay, y); bx = Math.Max(bx, x); by = Math.Max(by, y); any = true; } + + foreach (var pl in _doc.Entities.OfType().Where(JeNoPrint)) + foreach (var v in pl.Vertices) Add(v.Location.X, v.Location.Y); + foreach (var l in _doc.Entities.OfType().Where(JeNoPrint)) + { + Add(l.StartPoint.X, l.StartPoint.Y); Add(l.EndPoint.X, l.EndPoint.Y); + } + + if (!any) return null; + double w = bx - ax, h = by - ay; + return w > 0 && h > 0 ? (ax, ay, w, h) : null; + } + + /// True, pokud entita leží na vodicí hladině (nekreslit, jen reference). + private static bool JeNoPrint(Entity e) => string.Equals(e.Layer?.Name, HladinaNoPrint, StringComparison.OrdinalIgnoreCase); + + /// Převede hraniční cesty HATCH na vyplnitelné obrysy () se + /// zachovanými kruhovými oblouky. Každá cesta = jedna smyčka; hrany (úsečky, oblouky, elipsy, + /// polylinie s bulge, spliny) se převedou na analytické a zřetězí za sebou – + /// navazující hrana může být v souboru orientovaná i opačně (řeší se otočením běhu hran). + private static List HatchSmycky(Hatch hatch) + { + // Souřadnice hranic jsou v OCS entity (dané extruzní normálou group 210/220/230). Pro normálu + // (0,0,1) je převod do WCS identita; zrcadlené hatch (např. písmeno „O" v mco.dxf má normálu + // (0,0,-1)) by se bez převodu vykreslily na chybné X pozici. Osy OCS spočteme jednou pro celý + // hatch. Kladný determinant os = přímá izometrie (rotace) → oblouky lze převést analyticky + // (pootočením úhlu); záporný = zrcadlení → oblouky/elipsy raději jemně zploštíme na úsečky. + var (axx, axy, ayx, ayy) = OcsOsy(hatch.Normal.X, hatch.Normal.Y, hatch.Normal.Z); + (double X, double Y) ToWcs(double x, double y) => (x * axx + y * ayx, x * axy + y * ayy); + double det = axx * ayy - axy * ayx; + bool direct = det > 0; + double alpha = Math.Atan2(axy, axx); // úhel pootočení os OCS→WCS (jen pro direct case) + + var loops = new List(); + foreach (var path in hatch.Paths) + { + var loop = new List(); + foreach (var edge in path.Edges) + { + var run = HranaNaEdges(edge, ToWcs, direct, alpha); + if (run.Count == 0) continue; + if (loop.Count > 0) + { + var last = (loop[^1].EX, loop[^1].EY); + // Orientaci běhu hran určí bližší konec k dosavadnímu konci smyčky. + if (Dist2(last, (run[0].SX, run[0].SY)) > Dist2(last, (run[^1].EX, run[^1].EY))) + run = ReverseRun(run); + } + loop.AddRange(run); + } + // ≥1 hrana: samostatný kruhový/eliptický oblouk (1 hrana) je platná výplň (plný kruh). + if (loop.Count >= 1) loops.Add(new Contour(loop, Closed: true)); + } + return loops; + + static double Dist2((double X, double Y) a, (double X, double Y) b) + { + double dx = a.X - b.X, dy = a.Y - b.Y; + return dx * dx + dy * dy; + } + } + + /// Otočí běh hran (obrácené pořadí i směr každé hrany), aby navázal na předchozí konec. + private static List ReverseRun(List run) + { + var res = new List(run.Count); + for (int i = run.Count - 1; i >= 0; i--) res.Add(run[i].Reversed()); + return res; + } + + /// Převede jednu hranu HATCH hranice na analytické ve WCS. Kruhové + /// oblouky (přímý ARC i bulge v polylinii) se při přímé izometrii OCS () + /// zachovají analyticky (pootočení úhlu o ); elipsy, spliny a oblouky pod + /// zrcadlením se jemně zploští na úsečky (viz ). Nepodporovaný typ → prázdné. + private static List HranaNaEdges(Hatch.BoundaryPath.Edge edge, + Func toWcs, bool direct, double alpha) + { + switch (edge) + { + case Hatch.BoundaryPath.Line ln: + { + var s = toWcs(ln.Start.X, ln.Start.Y); + var e = toWcs(ln.End.X, ln.End.Y); + return new() { Edge.Line(s.X, s.Y, e.X, e.Y) }; + } + + case Hatch.BoundaryPath.Polyline ple: + { + var verts = ple.Vertices; + if (verts.Count < 2) return new(); + var bulges = ple.Bulges?.ToList(); + var edges = new List(); + int n = verts.Count; + int segments = ple.IsClosed ? n : n - 1; + for (int i = 0; i < segments; i++) + { + double ax = verts[i].X, ay = verts[i].Y; + double bx = verts[(i + 1) % n].X, by = verts[(i + 1) % n].Y; + double bulge = bulges is not null && i < bulges.Count ? bulges[i] : 0; + if (Math.Abs(bulge) > 1e-9) + { + if (direct) edges.Add(BulgeEdge(ax, ay, bx, by, bulge, toWcs, alpha)); + else + { + var body = new List<(double X, double Y)> { (ax, ay) }; + ZplostiOblouk(body, ax, ay, bx, by, bulge); + body.Add((bx, by)); + edges.AddRange(LineEdgesZOcs(body, toWcs)); + } + } + else + { + var s = toWcs(ax, ay); var e = toWcs(bx, by); + edges.Add(Edge.Line(s.X, s.Y, e.X, e.Y)); + } + } + return edges; + } + + case Hatch.BoundaryPath.Arc arc when direct: + return new() { ArcEdge(arc.Center.X, arc.Center.Y, arc.Radius, arc.StartAngle, arc.EndAngle, arc.CounterClockWise, toWcs, alpha) }; + + case Hatch.BoundaryPath.Arc arc: + return LineEdgesZOcs(VzorkujArc(arc), toWcs); + + case Hatch.BoundaryPath.Ellipse el: + // Elipsy vždy jemně zploštíme (analytický převod přes zrcadlení OCS by byl křehký). + return LineEdgesZOcs(VzorkujEllipse(el), toWcs); + + case Hatch.BoundaryPath.Spline sp: + { + var pts = sp.FitPoints is { Count: > 1 } fit + ? fit.Select(p => (p.X, p.Y)).ToList() + : sp.ControlPoints?.Select(p => (p.X, p.Y)).ToList() ?? new(); + return LineEdgesZOcs(pts, toWcs); + } + + default: + return new(); + } + } + + /// Analytický kruhový oblouk hatch hranice (přímá izometrie OCS). Úhly v radiánech, + /// =false znamená v DXF zrcadlení přes osu X OCS → ve WCS úhel α−sa + /// se záporným rozsahem; =true → sa+α s kladným rozsahem. + private static Edge ArcEdge(double cx, double cy, double r, double sa, double ea, bool ccw, + Func toWcs, double alpha) + { + if (ea <= sa) ea += 2 * Math.PI; + double mag = ea - sa; + var c = toWcs(cx, cy); + double a0 = ccw ? sa + alpha : alpha - sa; + double sweep = ccw ? mag : -mag; + var s = (c.X + r * Math.Cos(a0), c.Y + r * Math.Sin(a0)); + var e = (c.X + r * Math.Cos(a0 + sweep), c.Y + r * Math.Sin(a0 + sweep)); + return Edge.Arc(s.Item1, s.Item2, e.Item1, e.Item2, c.X, c.Y, r, a0, sweep); + } + + /// Analytický oblouk z bulge segmentu (přímá izometrie OCS): standardní parametrizace + /// střed + r·(cos θ, sin θ) → úhel se pootočí o , rozsah = θ. + private static Edge BulgeEdge(double ax, double ay, double bx, double by, double bulge, + Func toWcs, double alpha) + { + var (cx, cy, r, sa, theta) = BulgeArc(ax, ay, bx, by, bulge); + var c = toWcs(cx, cy); + var s = toWcs(ax, ay); var e = toWcs(bx, by); + return Edge.Arc(s.X, s.Y, e.X, e.Y, c.X, c.Y, r, sa + alpha, theta); + } + + /// Střed, (kladný) poloměr, počáteční úhel a znaménkový rozsah oblouku z DXF bulge + /// (=tan(θ/4)) mezi body (x1,y1)–(x2,y2); standardní parametrizace (bod = střed + r·(cos,sin)). + private static (double Cx, double Cy, double R, double Sa, double Theta) BulgeArc( + double x1, double y1, double x2, double y2, double bulge) + { + double theta = 4.0 * Math.Atan(bulge); + double dx = x2 - x1, dy = y2 - y1, chord = Math.Sqrt(dx * dx + dy * dy); + double r = chord / (2.0 * Math.Sin(theta / 2.0)); + double mx = (x1 + x2) / 2.0, my = (y1 + y2) / 2.0; + double dd = r * Math.Cos(theta / 2.0); + double ux = -dy / chord, uy = dx / chord; + double cx = mx + dd * ux, cy = my + dd * uy; + double sa = Math.Atan2(y1 - cy, x1 - cx); + return (cx, cy, Math.Abs(r), sa, theta); + } + + /// Převede řadu bodů v OCS na navazující úsečkové hrany ve WCS (přeskočí degenerované). + private static List LineEdgesZOcs(IReadOnlyList<(double X, double Y)> ocsPts, + Func toWcs) + { + var edges = new List(); + if (ocsPts.Count < 2) return edges; + var prev = toWcs(ocsPts[0].X, ocsPts[0].Y); + for (int i = 1; i < ocsPts.Count; i++) + { + var cur = toWcs(ocsPts[i].X, ocsPts[i].Y); + double ddx = cur.X - prev.X, ddy = cur.Y - prev.Y; + if (ddx * ddx + ddy * ddy > 1e-14) { edges.Add(Edge.Line(prev.X, prev.Y, cur.X, cur.Y)); prev = cur; } + } + return edges; + } + + /// Navzorkuje kruhový oblouk hatch hranice na body v OCS (zrcadlení CW přes osu X). + private static List<(double X, double Y)> VzorkujArc(Hatch.BoundaryPath.Arc arc) + { + double sa = arc.StartAngle, ea = arc.EndAngle; + if (ea <= sa) ea += 2 * Math.PI; + double sweep = ea - sa, sign = arc.CounterClockWise ? 1 : -1; + int seg = ContourGeometry.ArcSegments(sweep, arc.Radius, 0.02); + var pts = new List<(double X, double Y)>(seg + 1); + for (int i = 0; i <= seg; i++) + { + double t = sa + sweep * i / seg; + pts.Add((arc.Center.X + arc.Radius * Math.Cos(t), arc.Center.Y + sign * arc.Radius * Math.Sin(t))); + } + return pts; + } + + /// Navzorkuje eliptický oblouk hatch hranice na body v OCS (kolmice·ratio, CW přes osu X). + private static List<(double X, double Y)> VzorkujEllipse(Hatch.BoundaryPath.Ellipse el) + { + double sa = el.StartAngle, ea = el.EndAngle; + if (ea <= sa) ea += 2 * Math.PI; + double sweep = ea - sa, sign = el.CounterClockWise ? 1 : -1; + double mx = el.MajorAxisEndPoint.X, my = el.MajorAxisEndPoint.Y; + double vx = -my * el.RadiusRatio, vy = mx * el.RadiusRatio; + double major = Math.Sqrt(mx * mx + my * my); + int seg = Math.Max(8, ContourGeometry.ArcSegments(sweep, Math.Max(major, 1e-9), 0.02)); + var pts = new List<(double X, double Y)>(seg + 1); + for (int i = 0; i <= seg; i++) + { + double t = sa + sweep * i / seg, c = Math.Cos(t), s = sign * Math.Sin(t); + pts.Add((el.Center.X + c * mx + s * vx, el.Center.Y + c * my + s * vy)); + } + return pts; + } + + /// Analytický obrys samostatné entity ARC (vždy proti směru hodin od StartAngle k EndAngle). + private static Contour ArcContour(Arc a) + { + double sa = a.StartAngle, ea = a.EndAngle; + if (ea <= sa) ea += 2 * Math.PI; + double r = a.Radius, cx = a.Center.X, cy = a.Center.Y; + var s = (cx + r * Math.Cos(sa), cy + r * Math.Sin(sa)); + var e = (cx + r * Math.Cos(ea), cy + r * Math.Sin(ea)); + return new Contour(new[] { Edge.Arc(s.Item1, s.Item2, e.Item1, e.Item2, cx, cy, r, sa, ea - sa) }, Closed: false); + } + + /// Obrys stroked polylinie (LwPolyline/Polyline2D) se zachovanými oblouky z bulge. + /// Souřadnice bere jako WCS (normálu entity ignoruje – shodně s předchozím chováním). + private static Contour PolylineContour(IReadOnlyList<(double X, double Y, double Bulge)> verts, bool closed) + { + var edges = new List(); + int n = verts.Count; + int segments = closed ? n : n - 1; + for (int i = 0; i < segments; i++) + { + var a = verts[i]; var b = verts[(i + 1) % n]; + if (Math.Abs(a.Bulge) > 1e-9) + { + var (cx, cy, r, sa, theta) = BulgeArc(a.X, a.Y, b.X, b.Y, a.Bulge); + edges.Add(Edge.Arc(a.X, a.Y, b.X, b.Y, cx, cy, r, sa, theta)); + } + else edges.Add(Edge.Line(a.X, a.Y, b.X, b.Y)); + } + return new Contour(edges, closed); + } + + /// Osy OCS (arbitrary axis algorithm dle DXF specifikace) pro převod 2D bodů entity + /// s extruzní normálou ,, do WCS: + /// WCS = ocsX·ax + ocsY·ay. Pro normálu (0,0,1) je to identita, pro (0,0,-1) zrcadlí X. Vrací + /// jen XY složky obou os (Z se pro 2D kresbu ignoruje). + private static (double axx, double axy, double ayx, double ayy) OcsOsy(double nx, double ny, double nz) + { + double len = Math.Sqrt(nx * nx + ny * ny + nz * nz); + if (len < 1e-12) return (1, 0, 0, 1); // degenerovaná normála → identita + nx /= len; ny /= len; nz /= len; + // Referenční osa: Wy pro (téměř) svislou normálu, jinak Wz. + double rx, ry, rz; + if (Math.Abs(nx) < 1.0 / 64 && Math.Abs(ny) < 1.0 / 64) { rx = 0; ry = 1; rz = 0; } + else { rx = 0; ry = 0; rz = 1; } + // ax = R × N (normalizované), ay = N × ax (normalizované) + double axx = ry * nz - rz * ny, axy = rz * nx - rx * nz, axz = rx * ny - ry * nx; + double al = Math.Sqrt(axx * axx + axy * axy + axz * axz); + axx /= al; axy /= al; axz /= al; + double ayx = ny * axz - nz * axy, ayy = nz * axx - nx * axz; + double ayl = Math.Sqrt(ayx * ayx + ayy * ayy + (nx * axy - ny * axx) * (nx * axy - ny * axx)); + return (axx, axy, ayx / ayl, ayy / ayl); + } + + /// Přidá body oblouku (bez koncových) mezi (x1,y1) a (x2,y2) dle DXF bulge + /// (=tan(θ/4), θ = úhel oblouku; kladný = proti směru hodin). + private static void ZplostiOblouk(List<(double X, double Y)> body, double x1, double y1, double x2, double y2, double bulge) + { + double theta = 4.0 * Math.Atan(bulge); // úhel oblouku (se znaménkem) + double dx = x2 - x1, dy = y2 - y1; + double chord = Math.Sqrt(dx * dx + dy * dy); + if (chord < 1e-9) return; + double r = chord / (2.0 * Math.Sin(theta / 2.0)); // poloměr (se znaménkem) + double mx = (x1 + x2) / 2.0, my = (y1 + y2) / 2.0; + double dd = r * Math.Cos(theta / 2.0); // vzdálenost středu od středu tětivy + double ux = -dy / chord, uy = dx / chord; // levá normála tětivy + double cx = mx + dd * ux, cy = my + dd * uy; + double sa = Math.Atan2(y1 - cy, x1 - cx); + double ar = Math.Abs(r); + int seg = Math.Max(2, (int)Math.Ceiling(Math.Abs(theta) / (Math.PI / 8))); // ~16 dílků/kruh + for (int i = 1; i < seg; i++) + { + double t = sa + theta * i / seg; + body.Add((cx + ar * Math.Cos(t), cy + ar * Math.Sin(t))); + } + } + + /// Box-šířka víceřádkového atributu z XRecordu (group 41); 0 = jednořádkový. + private static double MultilineWidth(AttributeDefinition ad) + { + var xd = ad.XDictionary; + if (xd is null) return 0; + foreach (var obj in xd) + if (obj is XRecord xr) + foreach (var e in xr.Entries) + if (e.Code == 41 && e.Value is double w && w > 0) + return w; + return 0; + } + + /// Šablona má tagy se suffixem (NAZEV_AKCE_001) → párovat bez suffixu, case-insensitive. + public static string NormalizeTag(string tag) => SuffixRegex().Replace(tag, "").ToUpperInvariant(); + + [GeneratedRegex(@"_\d+$")] + private static partial Regex SuffixRegex(); + + private static (HAlign, VAlign) MapMTextAlign(AttachmentPointType a) => a switch + { + AttachmentPointType.TopLeft => (HAlign.Left, VAlign.Top), + AttachmentPointType.TopCenter => (HAlign.Center, VAlign.Top), + AttachmentPointType.TopRight => (HAlign.Right, VAlign.Top), + AttachmentPointType.MiddleLeft => (HAlign.Left, VAlign.Middle), + AttachmentPointType.MiddleCenter => (HAlign.Center, VAlign.Middle), + AttachmentPointType.MiddleRight => (HAlign.Right, VAlign.Middle), + AttachmentPointType.BottomLeft => (HAlign.Left, VAlign.Bottom), + AttachmentPointType.BottomCenter => (HAlign.Center, VAlign.Bottom), + AttachmentPointType.BottomRight => (HAlign.Right, VAlign.Bottom), + _ => (HAlign.Left, VAlign.Top), + }; +} diff --git a/Rozpisky/Dxf/Exporters.cs b/Rozpisky/Dxf/Exporters.cs new file mode 100644 index 0000000..6b58e8a --- /dev/null +++ b/Rozpisky/Dxf/Exporters.cs @@ -0,0 +1,142 @@ +using System.IO; +using SkiaSharp; +using Rozpisky.Rendering; + +namespace Rozpisky.Dxf; + +/// +/// Vykreslí libovolnou kresbu () na A4 do PNG/PDF +/// nebo do PNG bytů pro náhled (ROZPISKY.md §5). Kresba se vystředí a kreslí 1:1; zmenší se +/// jen, když se do tisknutelné plochy nevejde. +/// +public static class Exporters +{ + private const double A4Wmm = 210, A4Hmm = 297; + private const double MmPerInch = 25.4; + private const double PtPerMm = 72.0 / 25.4; + + /// A4 raster do PNG (default 200 dpi). marginMm = 0: rozpiska má v DXF vlastní + /// A4 rámeček (0,0)–(210,297), který se mapuje 1:1 na papír (žádný přidaný okraj → vystředěno). + public static void PngA4(Action draw, string path, double dpi = 200, + bool landscape = false, double marginMm = 0, + (double X, double Y, double W, double H)? frame = null) + { + double pageWmm = landscape ? A4Hmm : A4Wmm, pageHmm = landscape ? A4Wmm : A4Hmm; + double pxPerMm = dpi / MmPerInch; + int wpx = (int)Math.Round(pageWmm * pxPerMm), hpx = (int)Math.Round(pageHmm * pxPerMm); + + using var bmp = new SKBitmap(wpx, hpx); + using var canvas = new SKCanvas(bmp); + canvas.Clear(SKColors.White); + RenderPage(canvas, wpx, hpx, pageWmm, pageHmm, pxPerMm, marginMm, draw, minStrokePx: 1, frame); + + using var img = SKImage.FromBitmap(bmp); + using var data = img.Encode(SKEncodedImageFormat.Png, 100); + using var fs = File.Create(path); + data.SaveTo(fs); + } + + /// A4 vektor do PDF (1:1). marginMm = 0: DXF už obsahuje vlastní A4 rámeček, mapuje se + /// 1:1 na stránku, takže rozpiska vyjde vystředěná na papír přesně dle návrhu (žádné zmenšení). + public static void PdfA4(Action draw, string path, + bool landscape = false, double marginMm = 0, + (double X, double Y, double W, double H)? frame = null) + { + double pageWmm = landscape ? A4Hmm : A4Wmm, pageHmm = landscape ? A4Wmm : A4Hmm; + double wpt = pageWmm * PtPerMm, hpt = pageHmm * PtPerMm; + + using var fs = File.Create(path); + using var doc = SKDocument.CreatePdf(fs); + var canvas = doc.BeginPage((float)wpt, (float)hpt); + RenderPage(canvas, wpt, hpt, pageWmm, pageHmm, PtPerMm, marginMm, draw, minStrokePx: 0, frame); + doc.EndPage(); + doc.Close(); + } + + /// Živý náhled na plátno (SKElement): vystředí a vyplní referenční obdélník (rámeček + /// šablony, jinak rozsah kresby) do pixelového boxu jako „výchozí fit" (zoom=1), na to navrch + /// aplikuje uživatelský zoom a posun v px. Kresba je vektorová → ostrá v každém přiblížení. + public static void RenderView(SKCanvas canvas, int wpx, int hpx, Action draw, + (double X, double Y, double W, double H)? frame, + double zoom, double panXpx, double panYpx, double marginPx = 14) + { + canvas.Clear(SKColors.White); + + double bMinX, bMinY, bW, bH; + if (frame is { } f) + { + (bMinX, bMinY, bW, bH) = (f.X, f.Y, f.W, f.H); + } + else + { + var b = Bounds(draw); + if (b.IsEmpty) return; + (bMinX, bMinY, bW, bH) = (b.MinX, b.MinY, b.Width, b.Height); + } + if (bW <= 0 || bH <= 0) return; + + double basePxPerMm = Math.Min((wpx - 2 * marginPx) / bW, (hpx - 2 * marginPx) / bH); + + // Uživatelský zoom/posun: canvas se transformuje před přehráním kresby, takže se škáluje + // vše včetně tloušťky čar a velikosti glyfů → Skia je rasterizuje ostře v cílovém měřítku. + canvas.Save(); + canvas.Translate((float)panXpx, (float)panYpx); + canvas.Scale((float)zoom, (float)zoom); + RenderInto(canvas, wpx, hpx, bMinX, bMinY, bW, bH, basePxPerMm, draw, minStrokePx: 1); + canvas.Restore(); + } + + // --- jádro --- + + private static BoundsRenderer Bounds(Action draw) + { + var b = new BoundsRenderer(); + draw(b); + return b; + } + + /// A4 stránka: referenční obdélník (A4 rámeček ze šablony, jinak rozsah kresby) se mapuje + /// 1:1 a vystředí na papír; zmenší se jen když se nevejde do plochy bez okrajů. + private static void RenderPage(SKCanvas canvas, double wpx, double hpx, + double pageWmm, double pageHmm, double pxPerMm, double marginMm, + Action draw, double minStrokePx, + (double X, double Y, double W, double H)? frame) + { + double bMinX, bMinY, bW, bH; + if (frame is { } f) + { + (bMinX, bMinY, bW, bH) = (f.X, f.Y, f.W, f.H); + } + else + { + var b = Bounds(draw); + if (b.IsEmpty) return; + (bMinX, bMinY, bW, bH) = (b.MinX, b.MinY, b.Width, b.Height); + } + + double availWmm = pageWmm - 2 * marginMm, availHmm = pageHmm - 2 * marginMm; + double scale = 1.0; + if (bW > availWmm || bH > availHmm) + scale = Math.Min(availWmm / bW, availHmm / bH); + + RenderInto(canvas, (int)Math.Round(wpx), (int)Math.Round(hpx), bMinX, bMinY, bW, bH, pxPerMm * scale, draw, minStrokePx); + } + + /// Vystředí referenční obdélník do plátna a přehraje kresbu (mm → px, osa Y nahoru). + /// Co přesahuje obdélník (např. přetečený text), se ořízne na hraně plátna. + private static void RenderInto(SKCanvas canvas, int wpx, int hpx, + double bMinX, double bMinY, double bWidth, double bHeight, + double pxPerDrawingMm, Action draw, double minStrokePx) + { + double drawWpx = bWidth * pxPerDrawingMm, drawHpx = bHeight * pxPerDrawingMm; + double offX = (wpx - drawWpx) / 2.0; + double offYfromBottom = (hpx - drawHpx) / 2.0; + + SKPoint Map(double x, double y) => new( + (float)(offX + (x - bMinX) * pxPerDrawingMm), + (float)(hpx - (offYfromBottom + (y - bMinY) * pxPerDrawingMm))); + + using var r = new SkiaProfileRenderer(canvas, Map, pxPerDrawingMm, minStrokePx); + draw(r); + } +} diff --git a/Rozpisky/Dxf/KodPrilohy.cs b/Rozpisky/Dxf/KodPrilohy.cs new file mode 100644 index 0000000..1715fb0 --- /dev/null +++ b/Rozpisky/Dxf/KodPrilohy.cs @@ -0,0 +1,131 @@ +using System.Text; +using Rozpisky.Models; + +namespace Rozpisky.Dxf; + +/// +/// Generátor strojově čitelného 47-pozičního kódu přílohy („kód pod rozpiskou", manuál SŽ +/// kap. 3.1.5 a 3.2.1–3.2.8). Kód má pevnou délku 47 znaků složenou ze 6 skupin oddělených znakem +/// _ na pevných pozicích. Skládá se ze strukturovaných polí přílohy a projektu; každá pozice, +/// pro kterou není podklad, se vyplní znakem X – žádná pozice nezůstává prázdná. +/// Rozložení (1-based pozice → obsah): +/// +/// 1–11 Označení investora (S-kód), 12 = _ +/// 13–16 Stupeň dokumentace, 17 = _ +/// 18–21 Část (CAST) + řada = číslice z dílčí části (DILCI_CAST bez písmen a teček); +/// např. CAST B + DILCI_CAST B.7B7, CAST D + D110D110, 22 = _ +/// 23–24 předpona objektu (SO/PS) + 25–31 číslo objektu (řada+úsek+řazení), 32 = _ +/// 33–34 podobjekt, 35 = _ +/// 36–37 typ přílohy (D1…), 38 = _, 39 část přílohy, 40 = _ +/// 41–43 číslo přílohy, 44 = _ +/// 45 typ revize (P/0/V) + 46–47 pořadí revize +/// +/// Sdružené objekty (SK/PK, kap. 3.3) a další okrajové případy zatím nejsou řešené – kód se skládá +/// přímočaře z dostupných hodnot. +/// +public static class KodPrilohy +{ + /// Pevná délka kódu (počet pozic / buněk K1–K47). + public const int Delka = 47; + + private const char Vypln = 'X'; + + /// Sestaví 47-znakový kód přílohy z údajů projektu a řádku přílohy. + public static string Sestav(Projekt p, Priloha r) + { + var obj = ObjektOznaceni.Rozpad(r.CisloObjektu); + var (revTyp, revCislo) = RozpadRevize(r.R1); + + var sb = new StringBuilder(Delka); + Pole(sb, p.Skod, 11); // 1–11 investor / S-kód + sb.Append('_'); // 12 + Pole(sb, p.StupenDokumentace, 4); // 13–16 stupeň dokumentace + sb.Append('_'); // 17 + Pole(sb, ObjektOznaceni.Alfanum(r.OznaceniCasti) + Cislice(r.OznaceniDilciCasti), 4); // 18–21 část (CAST) + řada z DILCI_CAST bez písmen/teček + sb.Append('_'); // 22 + Pole(sb, obj.Prefix, 2); // 23–24 SO/PS + Pole(sb, obj.Cislo + obj.Usek + obj.Razeni, 7); // 25–31 číslo objektu + sb.Append('_'); // 32 + Pole(sb, obj.Podobjekt, 2); // 33–34 podobjekt + sb.Append('_'); // 35 + Pole(sb, ObjektOznaceni.Alfanum(r.TypPrilohy), 2); // 36–37 typ přílohy (D1…) + sb.Append('_'); // 38 + Pole(sb, r.DilciPriloha, 1); // 39 část přílohy + sb.Append('_'); // 40 + Pole(sb, r.PoradiPrilohy, 3); // 41–43 číslo přílohy + sb.Append('_'); // 44 + sb.Append(revTyp); // 45 typ revize + Pole(sb, revCislo, 2); // 46–47 pořadí revize + return sb.ToString(); + } + + /// Kód „seznamu příloh“ objektu (manuál SŽ kap. 5.1.11): pozice 1–34 jsou shodné s kódem + /// rozpisky objektu (S-kód, stupeň, část/řada, objekt, podobjekt), pozice 35–43 nahrazeny pevně + /// _XX_X_001 (seznam = „příloha 001“ bez typu/dokumentu) a zbytek (44–47) je revize. + /// = libovolná příloha objektu (pozice 1–34 jsou objektové). + /// = zvolená revize seznamu (např. „V00“); null → revize z reprezentanta. + public static string SestavSeznam(Projekt p, Priloha reprezentant, string? revizeKod = null) + => SestavObjektovy(p, reprezentant, "_XX_X_001", revizeKod); + + /// Kód „rozpisky na spisové desky objektu“ (manuál SŽ): pozice 1–34 shodné s kódem + /// rozpisky objektu, pozice 35–43 nahrazeny pevně _XX_X_000 (desky = „příloha 000“ bez + /// typu/dokumentu) a zbytek (44–47) je revize. Shoduje se s názvem souboru/rozvržení desek + /// (objekt_[podobjekt]_XX_X_000, viz ) – + /// typ XX je literální placeholder a zůstává v obou. + /// = libovolná příloha objektu; = + /// zvolená revize, null → revize z reprezentanta. + public static string SestavDesky(Projekt p, Priloha reprezentant, string? revizeKod = null) + => SestavObjektovy(p, reprezentant, "_XX_X_000", revizeKod); + + /// Sdílený základ objektových kódů (seznam/desky): vezme 47-znakový kód reprezentanta + /// (pozice 1–34 = objektové, 44–47 = revize) a nahradí prostřední segment 35–43 hodnotou + /// (např. _XX_X_001 / _XX_X_000). + /// null → revize zůstane z reprezentanta, jinak se přepočítá přes . + private static string SestavObjektovy(Projekt p, Priloha reprezentant, string stred, string? revizeKod) + { + var full = Sestav(p, reprezentant); // 47 znaků (revize z reprezentanta) + if (revizeKod is null) + return full[..34] + stred + full[43..]; // 1–34 | stred | 44–47 revize + + var (typ, cislo) = RozpadRevize(revizeKod); + var sb = new StringBuilder(full[..34]); // 1–34 + sb.Append(stred); // 35–43 + sb.Append('_'); // 44 + sb.Append(typ); // 45 + Pole(sb, cislo, 2); // 46–47 + return sb.ToString(); + } + + /// Ponechá jen číslice (zahodí písmena, tečky i další znaky) – použití pro řadu z pole + /// DILCI_CAST do kódu K18–K21: B.77, D110110. + private static string Cislice(string? s) + => string.IsNullOrEmpty(s) ? "" : new string(s.Where(char.IsDigit).ToArray()); + + /// Vloží hodnotu do pole pevné šířky: ořízne přebytek, chybějící pozice doplní X. + private static void Pole(StringBuilder sb, string? hodnota, int sirka) + { + var s = (hodnota ?? "").Trim(); + if (s.Length > sirka) s = s[..sirka]; + sb.Append(s); + for (int i = s.Length; i < sirka; i++) sb.Append(Vypln); + } + + /// Z kódu revize (např. R1) odvodí typ verze (P/0/V) a její pořadí. + /// První znak je typ, zbytek je číslo revize. Bez revize → X a prázdné číslo. + /// Např. V00 → (V, 00), 002 → (0, 02). + private static (char Typ, string Cislo) RozpadRevize(string? revKod) + { + string rev = (revKod ?? "").Trim(); + if (rev.Length == 0) return (Vypln, ""); + + char typ = rev[0] switch + { + 'P' or 'V' or '0' => rev[0], + _ when char.IsDigit(rev[0]) => '0', + _ => char.ToUpperInvariant(rev[0]), + }; + // Číslo revize = číslice ZA typovým znakem (vedoucí znak je typ, ne součást čísla). + string cislo = new string(rev.Skip(1).Where(char.IsDigit).ToArray()); + return (typ, cislo); + } +} diff --git a/Rozpisky/Dxf/LogaResolver.cs b/Rozpisky/Dxf/LogaResolver.cs new file mode 100644 index 0000000..83c6673 --- /dev/null +++ b/Rozpisky/Dxf/LogaResolver.cs @@ -0,0 +1,65 @@ +using System.IO; +using Rozpisky.Models; + +namespace Rozpisky.Dxf; + +/// +/// Sestaví mapu „hladina placeholderu → absolutní cesta k DXF" pro jednu rozpisku. +/// Pravidla (kap. 4.3 manuálu SŽ): +/// +/// Rozpiska_logo1/2 – financující instituce (dotační vlevo / státní vpravo), +/// projektové, soubor ze složky loga\ vedle .exe, +/// Rozpiska_logo3 – logo investora (číselník Organizace dle Projekt.Investor), +/// Rozpiska_logo4 – logo zhotovitele díla (číselník Firmy dle Projekt.ZhotovitelSOD), +/// Rozpiska_logo5 – logo zhotovitele objektu (číselník Firmy dle Priloha.ZhotovitelCasti), +/// Rozpiska_Orientační schéma – DXF u přílohy (Priloha.SchemaSoubor), relativně k .rzp. +/// +/// Položky bez vyplněného / neexistujícího souboru se vynechají. +/// +public static class LogaResolver +{ + /// Složka s logy dodávanými s programem (vedle .exe). + public static string LogaDir => Path.Combine(AppContext.BaseDirectory, "loga"); + + /// Složka aktuálního souboru .rzp (pro relativní cestu k schématu); null = neuloženo. + public static IReadOnlyDictionary Resolve(Projekt p, Priloha r, Ciselniky c, string? rzpDir) + { + var d = new Dictionary(StringComparer.OrdinalIgnoreCase); + + PridejZeSlozky(d, "Rozpiska_logo1", p.Logo1Soubor); + PridejZeSlozky(d, "Rozpiska_logo2", p.Logo2Soubor); + PridejZeSlozky(d, "Rozpiska_logo3", OrganizaceLogo(c, p.Investor)); + PridejZeSlozky(d, "Rozpiska_logo4", FirmaLogo(c, p.ZhotovitelSOD)); + PridejZeSlozky(d, "Rozpiska_logo5", FirmaLogo(c, r.ZhotovitelCasti)); + + var schema = ResolveSchema(r.SchemaSoubor, rzpDir); + if (schema is not null) d["Rozpiska_Orientační schéma"] = schema; + + return d; + } + + private static void PridejZeSlozky(IDictionary d, string hladina, string? soubor) + { + if (string.IsNullOrWhiteSpace(soubor)) return; + var cesta = Path.IsPathRooted(soubor) ? soubor : Path.Combine(LogaDir, soubor); + if (File.Exists(cesta)) d[hladina] = cesta; + } + + /// Cesta ke schématu: absolutní beze změny, jinak relativně ke složce .rzp. + private static string? ResolveSchema(string? soubor, string? rzpDir) + { + if (string.IsNullOrWhiteSpace(soubor)) return null; + if (Path.IsPathRooted(soubor)) return File.Exists(soubor) ? soubor : null; + if (string.IsNullOrEmpty(rzpDir)) return null; + var cesta = Path.Combine(rzpDir, soubor); + return File.Exists(cesta) ? cesta : null; + } + + private static string? FirmaLogo(Ciselniky c, string? nazev) + => string.IsNullOrWhiteSpace(nazev) ? null + : c.Firmy.FirstOrDefault(f => string.Equals(f.Nazev, nazev, StringComparison.OrdinalIgnoreCase))?.Logo; + + private static string? OrganizaceLogo(Ciselniky c, string? nazev) + => string.IsNullOrWhiteSpace(nazev) ? null + : c.Organizace.FirstOrDefault(o => string.Equals(o.Nazev, nazev, StringComparison.OrdinalIgnoreCase))?.Logo; +} diff --git a/Rozpisky/Dxf/MapovaniStore.cs b/Rozpisky/Dxf/MapovaniStore.cs new file mode 100644 index 0000000..31b4614 --- /dev/null +++ b/Rozpisky/Dxf/MapovaniStore.cs @@ -0,0 +1,155 @@ +using System.IO; +using System.Text.Encodings.Web; +using System.Text.Json; +using Rozpisky.Data; + +namespace Rozpisky.Dxf; + +/// +/// Jeden řádek mapování: hodnota z modelu () → DXF atribut (). +/// má tyto tvary (rozlišuje je ): +/// +/// Projekt.Stavba – vlastnost z údajů projektu, +/// Priloha.NazevObjektu – vlastnost z řádku přílohy, +/// Revize:R1.Datum – číslo revize z Priloha.R1 se dohledá v tabulce revizí +/// a vrátí se její Datum / Popis, +/// Firma:ZhotovitelCasti.Adresa – název firmy z Priloha.ZhotovitelCasti se dohledá +/// v číselníku Firmy a vrátí se Adresa / Telefon / Email, +/// Cast:OznaceniCasti.Nazev – označení z Priloha.OznaceniCasti se dohledá +/// v číselníku Části a vrátí se Nazev. +/// +/// se předřadí neprázdné hodnotě (např. "T: "), +/// aplikuje pojmenovanou úpravu (zatím "FormatA4" = číslo → „4 x A4"). +/// je kanonický (bez suffixu _NNN); párování se suffixem řeší +/// . +/// +public sealed class MapPole +{ + public string Tag { get; set; } = ""; + public string Zdroj { get; set; } = ""; + public string? Prefix { get; set; } + public string? Transform { get; set; } + + /// Hodnota dosazená, když je zdroj prázdný (nevyplněný). Slouží pro pole, která dle + /// manuálu SŽ (kap. 4.1.7) nesmí zůstat prázdná a vyplní se pomlčkou „—". Bez nastavení se + /// prázdné pole nevykreslí. Prefix ani Transform se na výchozí hodnotu neaplikují. + public string? Vychozi { get; set; } +} + +/// +/// Načítání mapování „pole programu → DXF atribut“ z JSON souboru vedle .exe (portable), +/// aby šlo upravit bez překladu (např. když se změní tagy v šabloně). Stejný princip jako +/// . Soubor se dodává; je jen +/// nouzová záloha, kdyby chyběl/byl poškozený. +/// +public static class MapovaniStore +{ + public const string SouborNazev = "mapovani.json"; + + private static readonly JsonSerializerOptions Opts = new() + { + WriteIndented = true, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; + + /// Výchozí umístění: soubor vedle .exe (portable). + public static string DefaultPath => Path.Combine(AppContext.BaseDirectory, SouborNazev); + + private static IReadOnlyList? _cache; + + /// Mapování načtené z mapovani.json vedle .exe; když chybí/je poškozený, + /// vrátí vestavěný . Výsledek se cachuje (config se za běhu nemění) – + /// po ruční editaci souboru zavolej . + public static IReadOnlyList Mapovani => _cache ??= Load(); + + /// Zahodí cache – další přístup k načte soubor znovu. + public static void Reload() => _cache = null; + + private static IReadOnlyList Load() + { + try + { + if (File.Exists(DefaultPath)) + { + var data = JsonSerializer.Deserialize(File.ReadAllText(DefaultPath), Opts); + if (data?.Pole is { Count: > 0 }) return data.Pole; + // Soubor existuje, ale nenese žádné pole („null" / prázdný seznam) → stejné + // zacházení jako s rozbitým JSON, viz catch níže. + JsonConfigFile.ZalohujAOhlasPoskozeny(DefaultPath); + } + } + catch (Exception ex) when (ex is IOException or JsonException or UnauthorizedAccessException) + { + // Poškozený / nečitelný soubor → fallback na vestavěné mapování. Soubor se nepřepisuje, + // ale exporty by tiše jely s jiným mapováním než uživatelovou (rozbitou) úpravou – + // proto záloha + upozornění při každém startu, dokud soubor neopraví/nesmaže. + JsonConfigFile.ZalohujAOhlasPoskozeny(DefaultPath, ex); + } + return Vychozi(); + } + + private sealed class Dto + { + public List Pole { get; set; } = new(); + } + + /// Vestavěné výchozí mapování – záloha pro případ smazaného/poškozeného + /// mapovani.json. Zdroj pravdy je dodávaný soubor; tahle metoda ho jen zrcadlí. + public static IReadOnlyList Vychozi() + { + var l = new List + { + // Projektová pole (list ÚDAJE) + new() { Tag = "NAZEV_AKCE", Zdroj = "Projekt.Stavba" }, + new() { Tag = "SO_HIP", Zdroj = "Projekt.HIP", Vychozi = "—" }, + new() { Tag = "OBJEDNATEL_NAZEV", Zdroj = "Projekt.Investor" }, + new() { Tag = "OBJEDNATEL_ADRESA", Zdroj = "Projekt.InvestorAdresa" }, + new() { Tag = "OBJEDNATEL_ZASTUPCE_NAZEV", Zdroj = "Projekt.SlozkaSZ" }, + new() { Tag = "OBJEDNATEL_ZASTUPCE_ADRESA",Zdroj = "Projekt.SlozkaSZAdresa" }, + new() { Tag = "S_KOD", Zdroj = "Projekt.Skod" }, + new() { Tag = "ZAK_CISLO", Zdroj = "Projekt.CisloZakazky" }, + new() { Tag = "STUP_DOK", Zdroj = "Projekt.StupenDokumentace" }, + new() { Tag = "DATUM", Zdroj = "Projekt.SmluvniDatumZpracovani" }, + new() { Tag = "ZHOTOVITEL_DILA_NAZEV", Zdroj = "Projekt.ZhotovitelSOD" }, + new() { Tag = "ZHOTOVITEL_DILA_ADRESA", Zdroj = "Projekt.AdresaSOD" }, + new() { Tag = "ZHOTOVITEL_DILA_TELEFON", Zdroj = "Projekt.TelSOD", Prefix = "T: " }, + new() { Tag = "ZHOTOVITEL_DILA_EMAIL", Zdroj = "Projekt.EmailSOD", Prefix = "E: " }, + + // Řádková pole (list SEZNAM) + new() { Tag = "CAST", Zdroj = "Priloha.OznaceniCasti" }, + new() { Tag = "CAST_NAZEV", Zdroj = "Cast:OznaceniCasti.Nazev" }, + new() { Tag = "OBJEKT_NAZEV", Zdroj = "Priloha.NazevObjektu", Vychozi = "—" }, + new() { Tag = "RADA", Zdroj = "Priloha.Rada", Vychozi = "—" }, + new() { Tag = "USEK", Zdroj = "Priloha.Usek", Vychozi = "—" }, + new() { Tag = "RAZENI", Zdroj = "Priloha.Razeni", Vychozi = "—" }, + new() { Tag = "PODOBJEKT", Zdroj = "Priloha.Podobjekt", Vychozi = "—" }, + new() { Tag = "DILCI_CAST", Zdroj = "Priloha.OznaceniDilciCasti", Vychozi = "—" }, + new() { Tag = "TYP", Zdroj = "Priloha.Typ", Vychozi = "—" }, + new() { Tag = "CISLO_PRILOHY", Zdroj = "Priloha.PoradiPrilohy", Vychozi = "—" }, + new() { Tag = "PRILOHA", Zdroj = "Priloha.NazevPrilohy", Vychozi = "—" }, + new() { Tag = "PRILOHA_CAST", Zdroj = "Priloha.NazevDilciCastiPrilohy", Vychozi = "—" }, + new() { Tag = "SO_VYPRACOVAL_PRILOHA", Zdroj = "Priloha.Vypracoval" }, + new() { Tag = "SO_ZODP_PROJEKTANT", Zdroj = "Priloha.OdpovednyProjektant" }, + new() { Tag = "SO_SPECIALISTA", Zdroj = "Priloha.Specialista", Vychozi = "—" }, + new() { Tag = "MERITKO", Zdroj = "Priloha.Meritko", Vychozi = "—" }, + new() { Tag = "FORMATY", Zdroj = "Priloha.Formaty", Transform = "FormatA4", Vychozi = "—" }, + new() { Tag = "KRAJ", Zdroj = "Priloha.Kraj" }, + new() { Tag = "KATASTRALNI_UZEMI", Zdroj = "Priloha.KatastralniUzemi" }, + new() { Tag = "TUDU", Zdroj = "Priloha.Tudu" }, + new() { Tag = "ZHOTOVITEL_OBJEKTU_NAZEV", Zdroj = "Priloha.ZhotovitelCasti" }, + new() { Tag = "ZHOTOVITEL_OBJEKTU_ADRESA", Zdroj = "Firma:ZhotovitelCasti.Adresa" }, + new() { Tag = "ZHOTOVITEL_OBJEKTU_TELEFON", Zdroj = "Firma:ZhotovitelCasti.Telefon", Prefix = "T: " }, + new() { Tag = "ZHOTOVITEL_OBJEKTU_EMAIL", Zdroj = "Firma:ZhotovitelCasti.Email", Prefix = "E: " }, + }; + + // Revizní pole R1–R4: číslo + kdo kontroloval z přílohy, datum + popis z tabulky revizí. + for (int i = 1; i <= 4; i++) + { + l.Add(new() { Tag = $"REVIZE{i}CISLO", Zdroj = $"Priloha.R{i}" }); + l.Add(new() { Tag = $"SO_KONTROLOVAL{i}", Zdroj = $"Priloha.KontrolovalR{i}" }); + l.Add(new() { Tag = $"REVIZE{i}DAT", Zdroj = $"Revize:R{i}.Datum" }); + l.Add(new() { Tag = $"REVIZE{i}", Zdroj = $"Revize:R{i}.Popis" }); + } + return l; + } +} diff --git a/Rozpisky/Dxf/RozpiskaRenderer.cs b/Rozpisky/Dxf/RozpiskaRenderer.cs new file mode 100644 index 0000000..32c1f47 --- /dev/null +++ b/Rozpisky/Dxf/RozpiskaRenderer.cs @@ -0,0 +1,91 @@ +using System.Collections.Concurrent; +using System.IO; +using Rozpisky.Models; +using Rozpisky.Rendering; + +namespace Rozpisky.Dxf; + +/// +/// Spojuje DXF šablonu, mapování hodnot a exportéry do jednoho místa pro UI +/// (náhled, tisk). Šablona se načte jednou a cachuje. +/// +public sealed class RozpiskaRenderer +{ + private readonly DxfTemplate _tpl; + + public RozpiskaRenderer(string sablonaPath) => _tpl = new DxfTemplate(ResolvePath(sablonaPath)); + + /// Najde šablonu: absolutní/relativní k pracovní složce, jinak vedle .exe. + public static string ResolvePath(string path) + => File.Exists(path) ? path : Path.Combine(AppContext.BaseDirectory, Path.GetFileName(path)); + + /// A4 rámeček šablony (mm) – referenční obdélník pro vystředění náhledu i exportů. + public (double X, double Y, double W, double H)? SheetFrame => _tpl.SheetFrame; + + /// Rozměr jedné buňky pro dlaždicový DXF export – přednostně celkový !!NOPRINT + /// rámeček, jinak A4 rámeček, jinak rozsah kresby. + public (double X, double Y, double W, double H)? CellFrame => _tpl.FrameBounds ?? _tpl.SheetFrame ?? _tpl.Bounds; + + // Načtené fragmenty (loga / schémata) podle cesty – šablony jsou immutable, lze sdílet. + private static readonly ConcurrentDictionary FragmentCache = new(StringComparer.OrdinalIgnoreCase); + + /// Vyprázdní cache fragmentů – volá se při načtení/založení projektu, aby cache nerostla + /// donekonečna a aby se mezitím změněné DXF soubory (loga, schémata) načetly znovu. + public static void VycistiCache() => FragmentCache.Clear(); + + /// Sestaví kresbu rozpisky (vektorové příkazy) pro libovolný cíl – náhled/PNG/PDF/DXF. + /// = mapa „hladina placeholderu → absolutní cesta k DXF" (logo/schéma); + /// každý fragment se fitne (uniformní scale + vystředění) do svého rámečku. + /// = true → přidá i !!NOPRINT rámeček (hranice papíru A4) – + /// pro DXF export, aby šlo z CADu rozpisku případně vytisknout. Fragmenty (loga) svůj NOPRINT + /// vodicí rámeček nikdy nekreslí. + public Action BuildDraw(Projekt p, Priloha r, IEnumerable revize, Ciselniky c, + bool vyplnene, IReadOnlyDictionary? loga = null, + bool ramecekA4 = false) + { + var values = vyplnene ? RozpiskaValues.Build(p, r, revize, c) : null; + return g => + { + _tpl.Replay(g, values, ramecekA4); + if (loga is { Count: > 0 }) KresliFragmenty(g, loga); + }; + } + + /// Vykreslí každý DXF fragment do jeho rámečku: uniformní zmenšení tak, aby se vešel, + /// a vystředění. Chybějící rámeček/soubor/prázdná kresba se tiše přeskočí. + private void KresliFragmenty(IProfileRenderer g, IReadOnlyDictionary loga) + { + foreach (var (hladina, cesta) in loga) + { + if (string.IsNullOrWhiteSpace(cesta)) continue; + if (!_tpl.Placeholders.TryGetValue(hladina, out var f)) continue; + if (f.W <= 0 || f.H <= 0) continue; + + var frag = NactiFragment(cesta); + if (frag is null) continue; + // Reference pro fit: přednostně vodicí rámeček !!NOPRINT (návrhové umístění uvnitř loga, + // poměr i okraje řeší autor → fit 1:1), jinak bbox kresby (s 5% rezervou). + bool maRamecek = frag.FrameBounds is { }; + if ((maRamecek ? frag.FrameBounds : frag.Bounds) is not { } cb || cb.W <= 0 || cb.H <= 0) continue; + + double s = Math.Min(f.W / cb.W, f.H / cb.H) * (maRamecek ? 1.0 : 0.95); + double ox = f.X + f.W / 2 - s * (cb.X + cb.W / 2); + double oy = f.Y + f.H / 2 - s * (cb.Y + cb.H / 2); + frag.Replay(new TransformRenderer(g, s, ox, oy)); + } + } + + private static DxfTemplate? NactiFragment(string cesta) => FragmentCache.GetOrAdd(cesta, c => + { + try { return File.Exists(c) ? new DxfTemplate(c) : null; } + catch { return null; } // poškozený/nečitelný DXF fragment → bez loga + }); + + public void ExportPdf(Projekt p, Priloha r, IEnumerable revize, Ciselniky c, string path, + IReadOnlyDictionary? loga = null) + => Exporters.PdfA4(BuildDraw(p, r, revize, c, vyplnene: true, loga), path, frame: _tpl.SheetFrame); + + public void ExportPng(Projekt p, Priloha r, IEnumerable revize, Ciselniky c, string path, + IReadOnlyDictionary? loga = null) + => Exporters.PngA4(BuildDraw(p, r, revize, c, vyplnene: true, loga), path, frame: _tpl.SheetFrame); +} diff --git a/Rozpisky/Dxf/RozpiskaValues.cs b/Rozpisky/Dxf/RozpiskaValues.cs new file mode 100644 index 0000000..8bc5b47 --- /dev/null +++ b/Rozpisky/Dxf/RozpiskaValues.cs @@ -0,0 +1,122 @@ +using System.Collections.Concurrent; +using System.Reflection; +using Rozpisky.Models; + +namespace Rozpisky.Dxf; + +/// +/// Sestaví slovník „tag DXF → hodnota" pro jednu rozpisku z údajů projektu, řádku přílohy a +/// sdílených číselníků. Mapování (které pole programu plní který atribut) není v kódu – +/// čte se z dodávaného mapovani.json vedle .exe přes , hodnoty +/// se dotahují reflexí. Klíče jsou kanonické (bez suffixu _NNN) – párování řeší +/// . +/// +public static class RozpiskaValues +{ + public static Dictionary Build(Projekt p, Priloha r, IEnumerable revize, Ciselniky c) + { + // Tabulky pro dohledání (číslo revize → řádek, název firmy → firma, označení → část). + var revLookup = ToLookup(revize, x => x.Cislo); + var firmaLookup = ToLookup(c.Firmy, f => f.Nazev); + var castLookup = ToLookup(c.Casti, x => x.Oznaceni); + + var v = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var m in MapovaniStore.Mapovani) + { + if (string.IsNullOrWhiteSpace(m.Tag) || string.IsNullOrWhiteSpace(m.Zdroj)) continue; + var val = Resolve(m.Zdroj, p, r, revLookup, firmaLookup, castLookup); + if (string.IsNullOrEmpty(val)) + { + // Pole, která dle manuálu nesmí zůstat prázdná (kap. 4.1.7), dostanou „—"; ostatní se přeskočí. + if (!string.IsNullOrEmpty(m.Vychozi)) + v[DxfTemplate.NormalizeTag(m.Tag)] = m.Vychozi; + continue; + } + val = ApplyTransform(m.Transform, val); + if (!string.IsNullOrEmpty(m.Prefix)) val = m.Prefix + val; + v[DxfTemplate.NormalizeTag(m.Tag)] = val; + } + + // Strojový 47-poziční kód (K1–K47) – „kód pod rozpiskou". Negeneruje se přes mapování + // (skládá se z více polí), ale algoritmicky; každá pozice = jedna buňka K1..K47. + // Desky objektu mají pevný střed _XX_X_000 (typ/dílčí/pořadí se neberou z řádku). + string kod = r.JeDesky ? KodPrilohy.SestavDesky(p, r) : KodPrilohy.Sestav(p, r); + for (int i = 0; i < kod.Length && i < KodPrilohy.Delka; i++) + v[DxfTemplate.NormalizeTag($"K{i + 1}")] = kod[i].ToString(); + + return v; + } + + /// Vyhodnotí Zdroj z mapování na konkrétní hodnotu. Tvary: + /// Projekt.X, Priloha.Y, a lookup Revize:R1.Datum / Firma:ZhotovitelCasti.Adresa + /// / Cast:OznaceniCasti.Nazev (klíč z vlastnosti přílohy → řádek číselníku → cílová vlastnost). + private static string? Resolve(string zdroj, Projekt p, Priloha r, + IReadOnlyDictionary revLookup, + IReadOnlyDictionary firmaLookup, + IReadOnlyDictionary castLookup) + { + int colon = zdroj.IndexOf(':'); + if (colon > 0) + { + var kind = zdroj[..colon]; + var rest = zdroj[(colon + 1)..]; // "ZhotovitelCasti.Adresa" + int dot = rest.IndexOf('.'); + if (dot <= 0) return null; + var klic = GetProp(r, rest[..dot]); // hodnota klíče z přílohy + var cilProp = rest[(dot + 1)..]; + if (string.IsNullOrWhiteSpace(klic)) return null; + return kind switch + { + "Revize" => revLookup.TryGetValue(klic, out var rev) ? GetProp(rev, cilProp) : null, + "Firma" => firmaLookup.TryGetValue(klic, out var f) ? GetProp(f, cilProp) : null, + "Cast" => castLookup.TryGetValue(klic, out var ca) ? GetProp(ca, cilProp) : null, + _ => null, + }; + } + + int sep = zdroj.IndexOf('.'); + if (sep <= 0) return null; + object? obj = zdroj[..sep] switch + { + "Projekt" => p, + "Priloha" => r, + _ => null, + }; + return obj is null ? null : GetProp(obj, zdroj[(sep + 1)..]); + } + + /// Pojmenované úpravy hodnoty. FormatA4: čistě číselný počet → „4 x A4". + private static string ApplyTransform(string? transform, string val) => transform switch + { + "FormatA4" => IsNumeric(val) ? $"{val.Trim()} x A4" : val, + _ => val, + }; + + private static bool IsNumeric(string s) + { + s = s.Trim(); + return s.Length > 0 && s.All(char.IsDigit); + } + + /// Slovník klíč→první výskyt (case-insensitive), prázdné klíče ignoruje. + private static Dictionary ToLookup(IEnumerable src, Func key) + { + var d = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var x in src) + { + var k = key(x); + if (!string.IsNullOrWhiteSpace(k)) d.TryAdd(k, x); + } + return d; + } + + // Cache PropertyInfo – Build se volá pro každý řádek (rozpisku) při exportu. + private static readonly ConcurrentDictionary<(Type, string), PropertyInfo?> PropCache = new(); + + private static string? GetProp(object obj, string name) + { + var pi = PropCache.GetOrAdd((obj.GetType(), name), + key => key.Item1.GetProperty(key.Item2, BindingFlags.Public | BindingFlags.Instance)); + return pi?.GetValue(obj) as string; + } +} diff --git a/Rozpisky/MainWindow.xaml b/Rozpisky/MainWindow.xaml new file mode 100644 index 0000000..112816b --- /dev/null +++ b/Rozpisky/MainWindow.xaml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +