mirror of
https://github.com/spacedriveapp/spacedrive.git
synced 2025-12-11 20:15:30 +01:00
refactor: update Cargo.toml and FK handling
This commit is contained in:
parent
db1dbf6655
commit
4c35d6d7f7
@ -3,11 +3,6 @@ name = "sd-server"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[features]
|
|
||||||
default = []
|
|
||||||
# Include bundled web assets (production builds)
|
|
||||||
assets = []
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# Spacedrive core
|
# Spacedrive core
|
||||||
sd-core = { path = "../../core", features = ["ffmpeg", "heif"] }
|
sd-core = { path = "../../core", features = ["ffmpeg", "heif"] }
|
||||||
@ -23,10 +18,6 @@ tower-http = { version = "0.5", features = ["fs", "cors"] }
|
|||||||
# Auth
|
# Auth
|
||||||
secstr = "0.5"
|
secstr = "0.5"
|
||||||
|
|
||||||
# Static assets
|
|
||||||
include_dir = "0.7"
|
|
||||||
mime_guess = "2.0"
|
|
||||||
|
|
||||||
# Serialization
|
# Serialization
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
|
|||||||
@ -86,6 +86,8 @@ impl crate::infra::sync::Syncable for Model {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn foreign_key_mappings() -> Vec<crate::infra::sync::FKMapping> {
|
fn foreign_key_mappings() -> Vec<crate::infra::sync::FKMapping> {
|
||||||
|
// All FKs use dependency tracking - NEVER set to NULL on missing reference
|
||||||
|
// Source data with NULL values is handled correctly (null UUID → null FK)
|
||||||
vec![
|
vec![
|
||||||
crate::infra::sync::FKMapping::new("parent_id", "entries"),
|
crate::infra::sync::FKMapping::new("parent_id", "entries"),
|
||||||
crate::infra::sync::FKMapping::new("metadata_id", "user_metadata"),
|
crate::infra::sync::FKMapping::new("metadata_id", "user_metadata"),
|
||||||
|
|||||||
@ -39,9 +39,6 @@ pub struct FKMapping {
|
|||||||
|
|
||||||
/// Target table name (e.g., "devices")
|
/// Target table name (e.g., "devices")
|
||||||
pub target_table: &'static str,
|
pub target_table: &'static str,
|
||||||
|
|
||||||
/// Whether this FK can be null (for circular dependencies)
|
|
||||||
pub nullable: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FKMapping {
|
impl FKMapping {
|
||||||
@ -49,15 +46,6 @@ impl FKMapping {
|
|||||||
Self {
|
Self {
|
||||||
local_field,
|
local_field,
|
||||||
target_table,
|
target_table,
|
||||||
nullable: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_nullable(local_field: &'static str, target_table: &'static str) -> Self {
|
|
||||||
Self {
|
|
||||||
local_field,
|
|
||||||
target_table,
|
|
||||||
nullable: true,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,29 +197,18 @@ pub async fn map_sync_json_to_local(
|
|||||||
|
|
||||||
// Map UUID to local ID
|
// Map UUID to local ID
|
||||||
// If the referenced record doesn't exist yet (sync dependency), return error for retry
|
// If the referenced record doesn't exist yet (sync dependency), return error for retry
|
||||||
let local_id = match lookup_local_id_for_uuid(fk.target_table, uuid, db).await {
|
// NEVER set to NULL - that corrupts data. Caller must use dependency tracking.
|
||||||
Ok(id) => id,
|
let local_id = lookup_local_id_for_uuid(fk.target_table, uuid, db)
|
||||||
Err(e) => {
|
.await
|
||||||
// Referenced record not found - this is a sync dependency issue
|
.map_err(|e| {
|
||||||
// For nullable FKs (circular dependencies), set to NULL instead of erroring
|
anyhow::anyhow!(
|
||||||
if fk.nullable {
|
|
||||||
data[fk.local_field] = Value::Null;
|
|
||||||
if let Some(obj) = data.as_object_mut() {
|
|
||||||
obj.remove(&uuid_field);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For non-nullable FKs, propagate error so caller can buffer/retry
|
|
||||||
return Err(anyhow::anyhow!(
|
|
||||||
"Sync dependency missing: {} -> {} (uuid={}): {}",
|
"Sync dependency missing: {} -> {} (uuid={}): {}",
|
||||||
fk.local_field,
|
fk.local_field,
|
||||||
fk.target_table,
|
fk.target_table,
|
||||||
uuid,
|
uuid,
|
||||||
e
|
e
|
||||||
));
|
)
|
||||||
}
|
})?;
|
||||||
};
|
|
||||||
|
|
||||||
// Replace UUID with local ID
|
// Replace UUID with local ID
|
||||||
data[fk.local_field] = json!(local_id);
|
data[fk.local_field] = json!(local_id);
|
||||||
@ -250,8 +227,8 @@ pub async fn map_sync_json_to_local(
|
|||||||
pub struct BatchFkMapResult {
|
pub struct BatchFkMapResult {
|
||||||
/// Records that were successfully mapped (all FKs resolved)
|
/// Records that were successfully mapped (all FKs resolved)
|
||||||
pub succeeded: Vec<Value>,
|
pub succeeded: Vec<Value>,
|
||||||
/// Records that failed due to missing non-nullable FK references
|
/// Records that failed due to missing FK references
|
||||||
/// Contains (record, missing_fk_field, missing_uuid) for retry/buffering
|
/// Contains (record, missing_fk_field, missing_uuid) for retry/dependency tracking
|
||||||
pub failed: Vec<(Value, String, Uuid)>,
|
pub failed: Vec<(Value, String, Uuid)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,8 +237,8 @@ pub struct BatchFkMapResult {
|
|||||||
/// This function processes multiple records at once, using batch FK lookups
|
/// This function processes multiple records at once, using batch FK lookups
|
||||||
/// to reduce database queries from N*M (N records × M FKs) to M (one per FK type).
|
/// to reduce database queries from N*M (N records × M FKs) to M (one per FK type).
|
||||||
///
|
///
|
||||||
/// Records with missing non-nullable FK references are returned in `failed` for retry.
|
/// Records with missing FK references are returned in `failed` for retry via dependency tracking.
|
||||||
/// Records with missing nullable FK references have the FK set to NULL and succeed.
|
/// NEVER sets FK to NULL on missing reference - that would corrupt data.
|
||||||
pub async fn batch_map_sync_json_to_local(
|
pub async fn batch_map_sync_json_to_local(
|
||||||
records: Vec<Value>,
|
records: Vec<Value>,
|
||||||
mappings: Vec<FKMapping>,
|
mappings: Vec<FKMapping>,
|
||||||
@ -330,49 +307,32 @@ pub async fn batch_map_sync_json_to_local(
|
|||||||
{
|
{
|
||||||
Some(uuid) => uuid,
|
Some(uuid) => uuid,
|
||||||
None => {
|
None => {
|
||||||
// Invalid UUID format - set to NULL (this is a data error, not missing dep)
|
// Invalid UUID format - this is a data error, mark as failed
|
||||||
tracing::warn!(
|
tracing::warn!(
|
||||||
fk_field = %fk.local_field,
|
fk_field = %fk.local_field,
|
||||||
"Invalid UUID format in FK field, setting to NULL"
|
"Invalid UUID format in FK field"
|
||||||
);
|
);
|
||||||
data[fk.local_field] = Value::Null;
|
// Use a nil UUID to indicate parse failure
|
||||||
if let Some(obj) = data.as_object_mut() {
|
failed_records.insert(idx, (fk.local_field.to_string(), Uuid::nil()));
|
||||||
obj.remove(&uuid_field);
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Look up local ID from batch results
|
// Look up local ID from batch results
|
||||||
|
// NEVER set to NULL on missing - that corrupts data. Always fail for retry.
|
||||||
let local_id = match uuid_to_id_map.get(&uuid) {
|
let local_id = match uuid_to_id_map.get(&uuid) {
|
||||||
Some(&id) => id,
|
Some(&id) => id,
|
||||||
None => {
|
None => {
|
||||||
// Referenced record not found
|
// Referenced record not found - mark for retry via dependency tracking
|
||||||
if fk.nullable {
|
|
||||||
// Nullable FK - set to NULL and continue
|
|
||||||
tracing::debug!(
|
tracing::debug!(
|
||||||
fk_field = %fk.local_field,
|
fk_field = %fk.local_field,
|
||||||
target_table = %fk.target_table,
|
target_table = %fk.target_table,
|
||||||
uuid = %uuid,
|
uuid = %uuid,
|
||||||
"Nullable FK reference not found, setting to NULL"
|
"FK reference not found, marking for retry"
|
||||||
);
|
|
||||||
data[fk.local_field] = Value::Null;
|
|
||||||
if let Some(obj) = data.as_object_mut() {
|
|
||||||
obj.remove(&uuid_field);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
// Non-nullable FK - mark record as failed for retry
|
|
||||||
tracing::debug!(
|
|
||||||
fk_field = %fk.local_field,
|
|
||||||
target_table = %fk.target_table,
|
|
||||||
uuid = %uuid,
|
|
||||||
"Non-nullable FK reference not found, marking for retry"
|
|
||||||
);
|
);
|
||||||
failed_records.insert(idx, (fk.local_field.to_string(), uuid));
|
failed_records.insert(idx, (fk.local_field.to_string(), uuid));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Replace UUID with local ID
|
// Replace UUID with local ID
|
||||||
@ -469,13 +429,4 @@ mod tests {
|
|||||||
let fk = FKMapping::new("entry_id", "entries");
|
let fk = FKMapping::new("entry_id", "entries");
|
||||||
assert_eq!(fk.uuid_field_name(), "entry_uuid");
|
assert_eq!(fk.uuid_field_name(), "entry_uuid");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_fk_mapping_nullable() {
|
|
||||||
let non_nullable = FKMapping::new("device_id", "devices");
|
|
||||||
assert!(!non_nullable.nullable, "default should be non-nullable");
|
|
||||||
|
|
||||||
let nullable = FKMapping::new_nullable("parent_id", "entries");
|
|
||||||
assert!(nullable.nullable, "new_nullable should create nullable FK");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
14
whitepaper/.gitignore
vendored
Normal file
14
whitepaper/.gitignore
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# LaTeX build artifacts
|
||||||
|
*.aux
|
||||||
|
*.bbl
|
||||||
|
*.blg
|
||||||
|
*.fdb_latexmk
|
||||||
|
*.fls
|
||||||
|
*.log
|
||||||
|
*.out
|
||||||
|
*.synctex.gz
|
||||||
|
*.synctex(busy)
|
||||||
|
*.cut
|
||||||
|
|
||||||
|
# Keep PDF output
|
||||||
|
!spacedrive.pdf
|
||||||
@ -14,50 +14,49 @@
|
|||||||
\BOOKMARK [2][-]{subsection.3.2}{\376\377\0003\000.\0002\000\040\000S\000p\000a\000c\000e\000d\000r\000i\000v\000e\000\040\000v\0002\000\040\000a\000s\000\040\000a\000n\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000a\000l\000\040\000S\000o\000l\000u\000t\000i\000o\000n}{section.3}% 14
|
\BOOKMARK [2][-]{subsection.3.2}{\376\377\0003\000.\0002\000\040\000S\000p\000a\000c\000e\000d\000r\000i\000v\000e\000\040\000v\0002\000\040\000a\000s\000\040\000a\000n\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000a\000l\000\040\000S\000o\000l\000u\000t\000i\000o\000n}{section.3}% 14
|
||||||
\BOOKMARK [1][-]{section.4}{\376\377\0004\000\040\000T\000h\000e\000\040\000S\000p\000a\000c\000e\000d\000r\000i\000v\000e\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{}% 15
|
\BOOKMARK [1][-]{section.4}{\376\377\0004\000\040\000T\000h\000e\000\040\000S\000p\000a\000c\000e\000d\000r\000i\000v\000e\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{}% 15
|
||||||
\BOOKMARK [2][-]{subsection.4.1}{\376\377\0004\000.\0001\000\040\000T\000h\000e\000\040\000V\000D\000F\000S\000\040\000M\000o\000d\000e\000l}{section.4}% 16
|
\BOOKMARK [2][-]{subsection.4.1}{\376\377\0004\000.\0001\000\040\000T\000h\000e\000\040\000V\000D\000F\000S\000\040\000M\000o\000d\000e\000l}{section.4}% 16
|
||||||
\BOOKMARK [2][-]{subsection.4.2}{\376\377\0004\000.\0002\000\040\000C\000o\000n\000t\000e\000n\000t\000\040\000I\000d\000e\000n\000t\000i\000t\000y\000:\000\040\000T\000h\000e\000\040\000F\000o\000u\000n\000d\000a\000t\000i\000o\000n\000\040\000f\000o\000r\000\040\000D\000e\000d\000u\000p\000l\000i\000c\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000R\000e\000d\000u\000n\000d\000a\000n\000c\000y}{section.4}% 17
|
\BOOKMARK [2][-]{subsection.4.2}{\376\377\0004\000.\0002\000\040\000C\000o\000n\000t\000e\000n\000t\000\040\000I\000d\000e\000n\000t\000i\000t\000y\000:\000\040\000D\000e\000d\000u\000p\000l\000i\000c\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000R\000e\000d\000u\000n\000d\000a\000n\000c\000y}{section.4}% 17
|
||||||
\BOOKMARK [2][-]{subsection.4.3}{\376\377\0004\000.\0003\000\040\000T\000h\000e\000\040\000I\000n\000d\000e\000x\000i\000n\000g\000\040\000E\000n\000g\000i\000n\000e\000:\000\040\000A\000\040\000M\000u\000l\000t\000i\000-\000P\000h\000a\000s\000e\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{section.4}% 18
|
\BOOKMARK [2][-]{subsection.4.3}{\376\377\0004\000.\0003\000\040\000T\000h\000e\000\040\000I\000n\000d\000e\000x\000i\000n\000g\000\040\000E\000n\000g\000i\000n\000e}{section.4}% 18
|
||||||
\BOOKMARK [2][-]{subsection.4.4}{\376\377\0004\000.\0004\000\040\000T\000h\000e\000\040\000T\000r\000a\000n\000s\000a\000c\000t\000i\000o\000n\000a\000l\000\040\000A\000c\000t\000i\000o\000n\000\040\000S\000y\000s\000t\000e\000m}{section.4}% 19
|
\BOOKMARK [2][-]{subsection.4.4}{\376\377\0004\000.\0004\000\040\000T\000h\000e\000\040\000T\000r\000a\000n\000s\000a\000c\000t\000i\000o\000n\000a\000l\000\040\000A\000c\000t\000i\000o\000n\000\040\000S\000y\000s\000t\000e\000m}{section.4}% 19
|
||||||
\BOOKMARK [2][-]{subsection.4.5}{\376\377\0004\000.\0005\000\040\000L\000i\000b\000r\000a\000r\000y\000\040\000S\000y\000n\000c\000\040\000a\000n\000d\000\040\000N\000e\000t\000w\000o\000r\000k\000i\000n\000g}{section.4}% 20
|
\BOOKMARK [2][-]{subsection.4.5}{\376\377\0004\000.\0005\000\040\000L\000i\000b\000r\000a\000r\000y\000\040\000S\000y\000n\000c\000\040\000a\000n\000d\000\040\000N\000e\000t\000w\000o\000r\000k\000i\000n\000g}{section.4}% 20
|
||||||
\BOOKMARK [2][-]{subsection.4.6}{\376\377\0004\000.\0006\000\040\000P\000r\000a\000c\000t\000i\000c\000a\000l\000\040\000C\000o\000n\000f\000l\000i\000c\000t\000\040\000R\000e\000s\000o\000l\000u\000t\000i\000o\000n}{section.4}% 21
|
\BOOKMARK [2][-]{subsection.4.6}{\376\377\0004\000.\0006\000\040\000A\000I\000-\000N\000a\000t\000i\000v\000e\000\040\000V\000D\000F\000S\000:\000\040\000F\000r\000o\000m\000\040\000S\000e\000m\000a\000n\000t\000i\000c\000\040\000S\000e\000a\000r\000c\000h\000\040\000t\000o\000\040\000I\000n\000t\000e\000l\000l\000i\000g\000e\000n\000t\000\040\000M\000a\000n\000a\000g\000e\000m\000e\000n\000t}{section.4}% 21
|
||||||
\BOOKMARK [2][-]{subsection.4.7}{\376\377\0004\000.\0007\000\040\000A\000I\000-\000N\000a\000t\000i\000v\000e\000\040\000V\000D\000F\000S\000:\000\040\000F\000r\000o\000m\000\040\000S\000e\000m\000a\000n\000t\000i\000c\000\040\000S\000e\000a\000r\000c\000h\000\040\000t\000o\000\040\000I\000n\000t\000e\000l\000l\000i\000g\000e\000n\000t\000\040\000M\000a\000n\000a\000g\000e\000m\000e\000n\000t}{section.4}% 22
|
\BOOKMARK [2][-]{subsection.4.7}{\376\377\0004\000.\0007\000\040\000T\000e\000m\000p\000o\000r\000a\000l\000-\000S\000e\000m\000a\000n\000t\000i\000c\000\040\000S\000e\000a\000r\000c\000h\000:\000\040\000A\000n\000\040\000A\000s\000y\000n\000c\000h\000r\000o\000n\000o\000u\000s\000,\000\040\000J\000o\000b\000-\000B\000a\000s\000e\000d\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{section.4}% 22
|
||||||
\BOOKMARK [2][-]{subsection.4.8}{\376\377\0004\000.\0008\000\040\000T\000e\000m\000p\000o\000r\000a\000l\000-\000S\000e\000m\000a\000n\000t\000i\000c\000\040\000S\000e\000a\000r\000c\000h\000:\000\040\000A\000n\000\040\000A\000s\000y\000n\000c\000h\000r\000o\000n\000o\000u\000s\000,\000\040\000J\000o\000b\000-\000B\000a\000s\000e\000d\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{section.4}% 23
|
\BOOKMARK [2][-]{subsection.4.8}{\376\377\0004\000.\0008\000\040\000N\000a\000t\000i\000v\000e\000\040\000S\000t\000o\000r\000a\000g\000e\000\040\000T\000i\000e\000r\000i\000n\000g\000:\000\040\000R\000e\000c\000o\000n\000c\000i\000l\000i\000n\000g\000\040\000P\000h\000y\000s\000i\000c\000a\000l\000\040\000R\000e\000a\000l\000i\000t\000y\000\040\000a\000n\000d\000\040\000U\000s\000e\000r\000\040\000I\000n\000t\000e\000n\000t}{section.4}% 23
|
||||||
\BOOKMARK [2][-]{subsection.4.9}{\376\377\0004\000.\0009\000\040\000N\000a\000t\000i\000v\000e\000\040\000S\000t\000o\000r\000a\000g\000e\000\040\000T\000i\000e\000r\000i\000n\000g\000:\000\040\000R\000e\000c\000o\000n\000c\000i\000l\000i\000n\000g\000\040\000P\000h\000y\000s\000i\000c\000a\000l\000\040\000R\000e\000a\000l\000i\000t\000y\000\040\000a\000n\000d\000\040\000U\000s\000e\000r\000\040\000I\000n\000t\000e\000n\000t}{section.4}% 24
|
\BOOKMARK [2][-]{subsection.4.9}{\376\377\0004\000.\0009\000\040\000V\000o\000l\000u\000m\000e\000\040\000C\000l\000a\000s\000s\000i\000f\000i\000c\000a\000t\000i\000o\000n}{section.4}% 24
|
||||||
\BOOKMARK [2][-]{subsection.4.10}{\376\377\0004\000.\0001\0000\000\040\000V\000o\000l\000u\000m\000e\000\040\000C\000l\000a\000s\000s\000i\000f\000i\000c\000a\000t\000i\000o\000n}{section.4}% 25
|
\BOOKMARK [2][-]{subsection.4.10}{\376\377\0004\000.\0001\0000\000\040\000P\000l\000a\000t\000f\000o\000r\000m\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n\000s\000:\000\040\000U\000n\000i\000f\000i\000e\000d\000\040\000A\000c\000c\000e\000s\000s\000\040\000t\000o\000\040\000T\000r\000a\000d\000i\000t\000i\000o\000n\000a\000l\000\040\000a\000n\000d\000\040\000M\000o\000d\000e\000r\000n\000\040\000S\000t\000o\000r\000a\000g\000e}{section.4}% 25
|
||||||
\BOOKMARK [2][-]{subsection.4.11}{\376\377\0004\000.\0001\0001\000\040\000P\000l\000a\000t\000f\000o\000r\000m\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n\000s\000:\000\040\000U\000n\000i\000f\000i\000e\000d\000\040\000A\000c\000c\000e\000s\000s\000\040\000t\000o\000\040\000T\000r\000a\000d\000i\000t\000i\000o\000n\000a\000l\000\040\000a\000n\000d\000\040\000M\000o\000d\000e\000r\000n\000\040\000S\000t\000o\000r\000a\000g\000e}{section.4}% 26
|
\BOOKMARK [1][-]{section.5}{\376\377\0005\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000a\000l\000\040\000A\000p\000p\000l\000i\000c\000a\000t\000i\000o\000n\000:\000\040\000A\000\040\000N\000a\000t\000i\000v\000e\000\040\000C\000l\000o\000u\000d\000\040\000S\000e\000r\000v\000i\000c\000e}{}% 26
|
||||||
\BOOKMARK [1][-]{section.5}{\376\377\0005\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000a\000l\000\040\000A\000p\000p\000l\000i\000c\000a\000t\000i\000o\000n\000:\000\040\000A\000\040\000N\000a\000t\000i\000v\000e\000\040\000C\000l\000o\000u\000d\000\040\000S\000e\000r\000v\000i\000c\000e}{}% 27
|
\BOOKMARK [2][-]{subsection.5.1}{\376\377\0005\000.\0001\000\040\000C\000o\000r\000e\000\040\000P\000r\000i\000n\000c\000i\000p\000l\000e\000:\000\040\000M\000a\000n\000a\000g\000e\000d\000\040\000C\000o\000r\000e\000s\000\040\000a\000s\000\040\000F\000i\000r\000s\000t\000-\000C\000l\000a\000s\000s\000\040\000D\000e\000v\000i\000c\000e\000s}{section.5}% 27
|
||||||
\BOOKMARK [2][-]{subsection.5.1}{\376\377\0005\000.\0001\000\040\000C\000o\000r\000e\000\040\000P\000r\000i\000n\000c\000i\000p\000l\000e\000:\000\040\000M\000a\000n\000a\000g\000e\000d\000\040\000C\000o\000r\000e\000s\000\040\000a\000s\000\040\000F\000i\000r\000s\000t\000-\000C\000l\000a\000s\000s\000\040\000D\000e\000v\000i\000c\000e\000s}{section.5}% 28
|
\BOOKMARK [2][-]{subsection.5.2}{\376\377\0005\000.\0002\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000U\000s\000e\000r\000\040\000E\000x\000p\000e\000r\000i\000e\000n\000c\000e}{section.5}% 28
|
||||||
\BOOKMARK [2][-]{subsection.5.2}{\376\377\0005\000.\0002\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000U\000s\000e\000r\000\040\000E\000x\000p\000e\000r\000i\000e\000n\000c\000e}{section.5}% 29
|
\BOOKMARK [2][-]{subsection.5.3}{\376\377\0005\000.\0003\000\040\000C\000l\000o\000u\000d\000-\000N\000a\000t\000i\000v\000e\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e\000\040\000a\000n\000d\000\040\000D\000a\000t\000a\000\040\000I\000s\000o\000l\000a\000t\000i\000o\000n}{section.5}% 29
|
||||||
\BOOKMARK [2][-]{subsection.5.3}{\376\377\0005\000.\0003\000\040\000C\000l\000o\000u\000d\000-\000N\000a\000t\000i\000v\000e\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e\000\040\000a\000n\000d\000\040\000D\000a\000t\000a\000\040\000I\000s\000o\000l\000a\000t\000i\000o\000n}{section.5}% 30
|
\BOOKMARK [2][-]{subsection.5.4}{\376\377\0005\000.\0004\000\040\000B\000e\000n\000e\000f\000i\000t\000s\000\040\000o\000f\000\040\000t\000h\000e\000\040\000H\000y\000b\000r\000i\000d\000\040\000M\000o\000d\000e\000l}{section.5}% 30
|
||||||
\BOOKMARK [2][-]{subsection.5.4}{\376\377\0005\000.\0004\000\040\000B\000e\000n\000e\000f\000i\000t\000s\000\040\000o\000f\000\040\000t\000h\000e\000\040\000H\000y\000b\000r\000i\000d\000\040\000M\000o\000d\000e\000l}{section.5}% 31
|
\BOOKMARK [2][-]{subsection.5.5}{\376\377\0005\000.\0005\000\040\000E\000n\000t\000e\000r\000p\000r\000i\000s\000e\000\040\000D\000e\000p\000l\000o\000y\000m\000e\000n\000t\000\040\000a\000n\000d\000\040\000D\000a\000t\000a\000\040\000S\000o\000v\000e\000r\000e\000i\000g\000n\000t\000y}{section.5}% 31
|
||||||
\BOOKMARK [2][-]{subsection.5.5}{\376\377\0005\000.\0005\000\040\000E\000n\000t\000e\000r\000p\000r\000i\000s\000e\000\040\000D\000e\000p\000l\000o\000y\000m\000e\000n\000t\000\040\000a\000n\000d\000\040\000D\000a\000t\000a\000\040\000S\000o\000v\000e\000r\000e\000i\000g\000n\000t\000y}{section.5}% 32
|
\BOOKMARK [2][-]{subsection.5.6}{\376\377\0005\000.\0006\000\040\000C\000o\000l\000l\000a\000b\000o\000r\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000P\000u\000b\000l\000i\000c\000\040\000S\000h\000a\000r\000i\000n\000g}{section.5}% 32
|
||||||
\BOOKMARK [2][-]{subsection.5.6}{\376\377\0005\000.\0006\000\040\000C\000o\000l\000l\000a\000b\000o\000r\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000P\000u\000b\000l\000i\000c\000\040\000S\000h\000a\000r\000i\000n\000g}{section.5}% 33
|
\BOOKMARK [1][-]{section.6}{\376\377\0006\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000E\000v\000a\000l\000u\000a\000t\000i\000o\000n}{}% 33
|
||||||
\BOOKMARK [1][-]{section.6}{\376\377\0006\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000E\000v\000a\000l\000u\000a\000t\000i\000o\000n}{}% 34
|
\BOOKMARK [2][-]{subsection.6.1}{\376\377\0006\000.\0001\000\040\000T\000e\000c\000h\000n\000o\000l\000o\000g\000y\000\040\000S\000t\000a\000c\000k}{section.6}% 34
|
||||||
\BOOKMARK [2][-]{subsection.6.1}{\376\377\0006\000.\0001\000\040\000T\000e\000c\000h\000n\000o\000l\000o\000g\000y\000\040\000S\000t\000a\000c\000k}{section.6}% 35
|
\BOOKMARK [2][-]{subsection.Alph0.1}{\376\377\000.\0001\000\040\000D\000a\000t\000a\000b\000a\000s\000e\000\040\000S\000c\000h\000e\000m\000a\000\040\000O\000p\000t\000i\000m\000i\000z\000a\000t\000i\000o\000n}{section.6}% 35
|
||||||
\BOOKMARK [2][-]{subsection.Alph0.1}{\376\377\000.\0001\000\040\000D\000a\000t\000a\000b\000a\000s\000e\000\040\000S\000c\000h\000e\000m\000a\000\040\000O\000p\000t\000i\000m\000i\000z\000a\000t\000i\000o\000n}{section.6}% 36
|
\BOOKMARK [2][-]{subsection.Alph0.2}{\376\377\000.\0002\000\040\000T\000e\000s\000t\000i\000n\000g\000\040\000a\000n\000d\000\040\000V\000a\000l\000i\000d\000a\000t\000i\000o\000n\000\040\000F\000r\000a\000m\000e\000w\000o\000r\000k}{section.6}% 36
|
||||||
\BOOKMARK [2][-]{subsection.Alph0.2}{\376\377\000.\0002\000\040\000T\000e\000s\000t\000i\000n\000g\000\040\000a\000n\000d\000\040\000V\000a\000l\000i\000d\000a\000t\000i\000o\000n\000\040\000F\000r\000a\000m\000e\000w\000o\000r\000k}{section.6}% 37
|
\BOOKMARK [2][-]{subsection.Alph0.3}{\376\377\000.\0003\000\040\000C\000o\000m\000p\000a\000t\000i\000b\000i\000l\000i\000t\000y\000\040\000a\000n\000d\000\040\000I\000n\000t\000e\000r\000o\000p\000e\000r\000a\000b\000i\000l\000i\000t\000y}{section.6}% 37
|
||||||
\BOOKMARK [2][-]{subsection.Alph0.3}{\376\377\000.\0003\000\040\000C\000o\000m\000p\000a\000t\000i\000b\000i\000l\000i\000t\000y\000\040\000a\000n\000d\000\040\000I\000n\000t\000e\000r\000o\000p\000e\000r\000a\000b\000i\000l\000i\000t\000y}{section.6}% 38
|
\BOOKMARK [2][-]{subsection.Alph0.4}{\376\377\000.\0004\000\040\000S\000c\000a\000l\000a\000b\000i\000l\000i\000t\000y\000\040\000L\000i\000m\000i\000t\000s\000\040\000a\000n\000d\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000a\000l\000\040\000B\000o\000u\000n\000d\000a\000r\000i\000e\000s}{section.6}% 38
|
||||||
\BOOKMARK [2][-]{subsection.Alph0.4}{\376\377\000.\0004\000\040\000S\000c\000a\000l\000a\000b\000i\000l\000i\000t\000y\000\040\000L\000i\000m\000i\000t\000s\000\040\000a\000n\000d\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000a\000l\000\040\000B\000o\000u\000n\000d\000a\000r\000i\000e\000s}{section.6}% 39
|
\BOOKMARK [2][-]{subsection.Alph0.5}{\376\377\000.\0005\000\040\000F\000a\000i\000l\000u\000r\000e\000\040\000R\000e\000c\000o\000v\000e\000r\000y\000\040\000S\000c\000e\000n\000a\000r\000i\000o\000s}{section.6}% 39
|
||||||
\BOOKMARK [2][-]{subsection.Alph0.5}{\376\377\000.\0005\000\040\000F\000a\000i\000l\000u\000r\000e\000\040\000R\000e\000c\000o\000v\000e\000r\000y\000\040\000S\000c\000e\000n\000a\000r\000i\000o\000s}{section.6}% 40
|
\BOOKMARK [2][-]{subsection.Alph0.6}{\376\377\000.\0006\000\040\000E\000x\000t\000e\000n\000s\000i\000b\000i\000l\000i\000t\000y\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{section.6}% 40
|
||||||
\BOOKMARK [2][-]{subsection.Alph0.6}{\376\377\000.\0006\000\040\000E\000x\000t\000e\000n\000s\000i\000b\000i\000l\000i\000t\000y\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{section.6}% 41
|
\BOOKMARK [2][-]{subsection.Alph0.7}{\376\377\000.\0007\000\040\000E\000x\000t\000e\000n\000s\000i\000b\000i\000l\000i\000t\000y\000\040\000B\000e\000y\000o\000n\000d\000\040\000S\000t\000o\000r\000a\000g\000e\000:\000\040\000D\000a\000t\000a\000\040\000I\000n\000g\000e\000s\000t\000i\000o\000n\000\040\000A\000g\000e\000n\000t\000s}{section.6}% 41
|
||||||
\BOOKMARK [2][-]{subsection.Alph0.7}{\376\377\000.\0007\000\040\000E\000x\000t\000e\000n\000s\000i\000b\000i\000l\000i\000t\000y\000\040\000B\000e\000y\000o\000n\000d\000\040\000S\000t\000o\000r\000a\000g\000e\000:\000\040\000D\000a\000t\000a\000\040\000I\000n\000g\000e\000s\000t\000i\000o\000n\000\040\000A\000g\000e\000n\000t\000s}{section.6}% 42
|
\BOOKMARK [1][-]{appendix.A}{\376\377\000A\000\040\000S\000e\000c\000u\000r\000i\000t\000y\000\040\000a\000n\000d\000\040\000P\000r\000i\000v\000a\000c\000y\000\040\000M\000o\000d\000e\000l}{}% 42
|
||||||
\BOOKMARK [1][-]{appendix.A}{\376\377\000A\000\040\000S\000e\000c\000u\000r\000i\000t\000y\000\040\000a\000n\000d\000\040\000P\000r\000i\000v\000a\000c\000y\000\040\000M\000o\000d\000e\000l}{}% 43
|
\BOOKMARK [2][-]{subsection.A.1}{\376\377\000A\000.\0001\000\040\000D\000a\000t\000a\000\040\000P\000r\000o\000t\000e\000c\000t\000i\000o\000n\000\040\000a\000t\000\040\000R\000e\000s\000t}{appendix.A}% 43
|
||||||
\BOOKMARK [2][-]{subsection.A.1}{\376\377\000A\000.\0001\000\040\000D\000a\000t\000a\000\040\000P\000r\000o\000t\000e\000c\000t\000i\000o\000n\000\040\000a\000t\000\040\000R\000e\000s\000t}{appendix.A}% 44
|
\BOOKMARK [2][-]{subsection.A.2}{\376\377\000A\000.\0002\000\040\000N\000e\000t\000w\000o\000r\000k\000\040\000S\000e\000c\000u\000r\000i\000t\000y}{appendix.A}% 44
|
||||||
\BOOKMARK [2][-]{subsection.A.2}{\376\377\000A\000.\0002\000\040\000N\000e\000t\000w\000o\000r\000k\000\040\000S\000e\000c\000u\000r\000i\000t\000y}{appendix.A}% 45
|
\BOOKMARK [2][-]{subsection.A.3}{\376\377\000A\000.\0003\000\040\000C\000r\000e\000d\000e\000n\000t\000i\000a\000l\000\040\000M\000a\000n\000a\000g\000e\000m\000e\000n\000t}{appendix.A}% 45
|
||||||
\BOOKMARK [2][-]{subsection.A.3}{\376\377\000A\000.\0003\000\040\000C\000r\000e\000d\000e\000n\000t\000i\000a\000l\000\040\000M\000a\000n\000a\000g\000e\000m\000e\000n\000t}{appendix.A}% 46
|
\BOOKMARK [2][-]{subsection.A.4}{\376\377\000A\000.\0004\000\040\000T\000h\000r\000e\000a\000t\000\040\000M\000o\000d\000e\000l}{appendix.A}% 46
|
||||||
\BOOKMARK [2][-]{subsection.A.4}{\376\377\000A\000.\0004\000\040\000T\000h\000r\000e\000a\000t\000\040\000M\000o\000d\000e\000l}{appendix.A}% 47
|
\BOOKMARK [2][-]{subsection.A.5}{\376\377\000A\000.\0005\000\040\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000\040\000P\000i\000n\000n\000i\000n\000g\000\040\000a\000n\000d\000\040\000A\000P\000I\000\040\000S\000e\000c\000u\000r\000i\000t\000y}{appendix.A}% 47
|
||||||
\BOOKMARK [2][-]{subsection.A.5}{\376\377\000A\000.\0005\000\040\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000\040\000P\000i\000n\000n\000i\000n\000g\000\040\000a\000n\000d\000\040\000A\000P\000I\000\040\000S\000e\000c\000u\000r\000i\000t\000y}{appendix.A}% 48
|
\BOOKMARK [2][-]{subsection.A.6}{\376\377\000A\000.\0006\000\040\000R\000a\000t\000e\000\040\000L\000i\000m\000i\000t\000i\000n\000g\000\040\000a\000n\000d\000\040\000A\000b\000u\000s\000e\000\040\000P\000r\000e\000v\000e\000n\000t\000i\000o\000n}{appendix.A}% 48
|
||||||
\BOOKMARK [2][-]{subsection.A.6}{\376\377\000A\000.\0006\000\040\000R\000a\000t\000e\000\040\000L\000i\000m\000i\000t\000i\000n\000g\000\040\000a\000n\000d\000\040\000A\000b\000u\000s\000e\000\040\000P\000r\000e\000v\000e\000n\000t\000i\000o\000n}{appendix.A}% 49
|
\BOOKMARK [2][-]{subsection.A.7}{\376\377\000A\000.\0007\000\040\000A\000u\000d\000i\000t\000\040\000L\000o\000g\000\040\000S\000y\000s\000t\000e\000m}{appendix.A}% 49
|
||||||
\BOOKMARK [2][-]{subsection.A.7}{\376\377\000A\000.\0007\000\040\000A\000u\000d\000i\000t\000\040\000L\000o\000g\000\040\000S\000y\000s\000t\000e\000m}{appendix.A}% 50
|
\BOOKMARK [2][-]{subsection.A.8}{\376\377\000A\000.\0008\000\040\000S\000p\000a\000c\000e\000d\000r\000i\000v\000e\000\040\000C\000l\000o\000u\000d\000\040\000S\000e\000r\000v\000i\000c\000e\000\040\000P\000r\000i\000v\000a\000c\000y\000\040\000M\000o\000d\000e\000l}{appendix.A}% 50
|
||||||
\BOOKMARK [2][-]{subsection.A.8}{\376\377\000A\000.\0008\000\040\000S\000p\000a\000c\000e\000d\000r\000i\000v\000e\000\040\000C\000l\000o\000u\000d\000\040\000S\000e\000r\000v\000i\000c\000e\000\040\000P\000r\000i\000v\000a\000c\000y\000\040\000M\000o\000d\000e\000l}{appendix.A}% 51
|
\BOOKMARK [2][-]{subsection.A.9}{\376\377\000A\000.\0009\000\040\000P\000r\000i\000v\000a\000c\000y\000-\000P\000r\000e\000s\000e\000r\000v\000i\000n\000g\000\040\000A\000I}{appendix.A}% 51
|
||||||
\BOOKMARK [2][-]{subsection.A.9}{\376\377\000A\000.\0009\000\040\000P\000r\000i\000v\000a\000c\000y\000-\000P\000r\000e\000s\000e\000r\000v\000i\000n\000g\000\040\000A\000I}{appendix.A}% 52
|
\BOOKMARK [2][-]{subsection.A.10}{\376\377\000A\000.\0001\0000\000\040\000B\000a\000l\000a\000n\000c\000i\000n\000g\000\040\000P\000r\000i\000v\000a\000c\000y\000\040\000a\000n\000d\000\040\000P\000u\000b\000l\000i\000c\000\040\000S\000h\000a\000r\000i\000n\000g}{appendix.A}% 52
|
||||||
\BOOKMARK [2][-]{subsection.A.10}{\376\377\000A\000.\0001\0000\000\040\000B\000a\000l\000a\000n\000c\000i\000n\000g\000\040\000P\000r\000i\000v\000a\000c\000y\000\040\000a\000n\000d\000\040\000P\000u\000b\000l\000i\000c\000\040\000S\000h\000a\000r\000i\000n\000g}{appendix.A}% 53
|
\BOOKMARK [1][-]{appendix.B}{\376\377\000B\000\040\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n}{}% 53
|
||||||
\BOOKMARK [1][-]{appendix.B}{\376\377\000B\000\040\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n}{}% 54
|
\BOOKMARK [2][-]{subsection.B.1}{\376\377\000B\000.\0001\000\040\000K\000e\000y\000\040\000C\000o\000n\000t\000r\000i\000b\000u\000t\000i\000o\000n\000s\000\040\000a\000n\000d\000\040\000R\000e\000a\000l\000-\000W\000o\000r\000l\000d\000\040\000I\000m\000p\000a\000c\000t}{appendix.B}% 54
|
||||||
\BOOKMARK [2][-]{subsection.B.1}{\376\377\000B\000.\0001\000\040\000K\000e\000y\000\040\000C\000o\000n\000t\000r\000i\000b\000u\000t\000i\000o\000n\000s\000\040\000a\000n\000d\000\040\000R\000e\000a\000l\000-\000W\000o\000r\000l\000d\000\040\000I\000m\000p\000a\000c\000t}{appendix.B}% 55
|
\BOOKMARK [2][-]{subsection.B.2}{\376\377\000B\000.\0002\000\040\000S\000y\000s\000t\000e\000m\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n}{appendix.B}% 55
|
||||||
\BOOKMARK [2][-]{subsection.B.2}{\376\377\000B\000.\0002\000\040\000S\000y\000s\000t\000e\000m\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n}{appendix.B}% 56
|
\BOOKMARK [2][-]{subsection.B.3}{\376\377\000B\000.\0003\000\040\000V\000a\000l\000i\000d\000a\000t\000i\000o\000n\000\040\000i\000n\000\040\000P\000r\000o\000d\000u\000c\000t\000i\000o\000n}{appendix.B}% 56
|
||||||
\BOOKMARK [2][-]{subsection.B.3}{\376\377\000B\000.\0003\000\040\000V\000a\000l\000i\000d\000a\000t\000i\000o\000n\000\040\000i\000n\000\040\000P\000r\000o\000d\000u\000c\000t\000i\000o\000n}{appendix.B}% 57
|
\BOOKMARK [2][-]{subsection.B.4}{\376\377\000B\000.\0004\000\040\000F\000u\000t\000u\000r\000e\000\040\000W\000o\000r\000k\000\040\000a\000n\000d\000\040\000R\000o\000a\000d\000m\000a\000p}{appendix.B}% 57
|
||||||
\BOOKMARK [2][-]{subsection.B.4}{\376\377\000B\000.\0004\000\040\000F\000u\000t\000u\000r\000e\000\040\000W\000o\000r\000k\000\040\000a\000n\000d\000\040\000R\000o\000a\000d\000m\000a\000p}{appendix.B}% 58
|
\BOOKMARK [2][-]{subsection.B.5}{\376\377\000B\000.\0005\000\040\000L\000i\000m\000i\000t\000a\000t\000i\000o\000n\000s}{appendix.B}% 58
|
||||||
\BOOKMARK [2][-]{subsection.B.5}{\376\377\000B\000.\0005\000\040\000L\000i\000m\000i\000t\000a\000t\000i\000o\000n\000s}{appendix.B}% 59
|
\BOOKMARK [2][-]{subsection.B.6}{\376\377\000B\000.\0006\000\040\000B\000r\000o\000a\000d\000e\000r\000\040\000I\000m\000p\000l\000i\000c\000a\000t\000i\000o\000n\000s}{appendix.B}% 59
|
||||||
\BOOKMARK [2][-]{subsection.B.6}{\376\377\000B\000.\0006\000\040\000B\000r\000o\000a\000d\000e\000r\000\040\000I\000m\000p\000l\000i\000c\000a\000t\000i\000o\000n\000s}{appendix.B}% 60
|
\BOOKMARK [1][-]{section*.57}{\376\377\000A\000c\000k\000n\000o\000w\000l\000e\000d\000g\000m\000e\000n\000t\000s}{}% 60
|
||||||
\BOOKMARK [1][-]{section*.74}{\376\377\000A\000c\000k\000n\000o\000w\000l\000e\000d\000g\000m\000e\000n\000t\000s}{}% 61
|
\BOOKMARK [1][-]{appendix.A}{\376\377\000A\000\040\000G\000l\000o\000s\000s\000a\000r\000y\000\040\000o\000f\000\040\000T\000e\000r\000m\000s}{}% 61
|
||||||
\BOOKMARK [1][-]{appendix.A}{\376\377\000A\000\040\000G\000l\000o\000s\000s\000a\000r\000y\000\040\000o\000f\000\040\000T\000e\000r\000m\000s}{}% 62
|
\BOOKMARK [1][-]{section*.67}{\376\377\000R\000e\000f\000e\000r\000e\000n\000c\000e\000s}{}% 62
|
||||||
\BOOKMARK [1][-]{section*.84}{\376\377\000R\000e\000f\000e\000r\000e\000n\000c\000e\000s}{}% 63
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user