{ Analytica Model Portfolio_optimizati, encoding="UTF-8" } SoftwareVersion 6.4.8 { System Variables with non-default values: } SampleSize := 1000 TypeChecking := 1 Checking := 1 SaveOptions := 2 SaveValues := 0 ShowDescriptionMarks := 1 Sys_DefaultNumberFmt := 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 Graph_PageBrush := 65281,65281,65281 Graph_AxisTitleFont := Segoe UI,15,1 Graph_AxisLabelFont := Segoe UI,15,0 Graph_KeyFont := Segoe UI,15,0 Graph_KeyTitleFont := Segoe UI,15,1 Graph_GridColor := 58881,58881,58881 Graph_FrameColor := 7681,7681,7681 Graph_AxisTitleColor := 7681,7681,7681 Graph_AxisLabelColor := 7681,7681,7681 Graph_KeyTextColor := 7681,7681,7681 Graph_KeyLabelColor := 7681,7681,7681 Graph_LineThickness := 4 {!50007|Graph_BarOutline := 0} {!60200|Att_AreaFillBorder Graph_Primary_Valdim: 0} {!60200|Att_AreaFillBorder Graph_KDE_Valdim: 0} Graph_ColorSeq := [13313,42241,43777,60929,42497,25857,57089,29953,36609,25089,37889,56833,23553,52481,41729,63489,56577,33025,18945,50177,60417,65281,44801,50945,37377,39169,57089,46337,35841,46337,38401,40193,42241] {!60300|Sys_SliderStyles := Table(Sys_SliderStyleItem)(Choice(Self,1,0),Choice(Self,1,0),Choice(Self,1,0),8,'rgb(220,220,220)','rgb(220,220,220)','rgb(125,125,125)',Checkbox(0),'rgb(125,125,125)','rgb(125,125,125)')} DisplayInputs Object: Object Self, Object Function, Object Keyword, Object Decision, Object Index, Keyword Self, Variable ACP_reset DisplayOutputs Object: Object Self, Object Function, Object Keyword, Object Module, Keyword Self, Function ACP_Summary_of_modul, Variable ACP_Prefix_by_module, Module ACP_Dashboard_sizes, Module ACP_Top_styles, Module ACP_autocalc_UI NodeInfo Function: 1,,,,0 NodeColor Function: 0x000000ffb58cb5 DisplayInputs Function: Object Object, Object Self, Object Decision, Object Index, Keyword Self, Function ACP_Objectsinmod, Function ACP_IsaVariable, Function ACP_Isamodule, Variable ACP_reset, Index ACP_Module_review_fi, Function ACP_Has_User_IO_node, Decision ACP_Min_description_ DisplayOutputs Function: Object Object, Object Self, Object Variable, Keyword Self, Function ACP_Summary_of_modul, Variable ACP_Prefix_by_module NodeFontColor Function: 0x000000ff1e1e1e {!50400|NodeBorderColor Function: 0x000000ff646464} DisplayOutputs Keyword: Object Object DisplayInputs Keyword: Object Object NodeInfo Model: 1,,,,0 NodeFontColor Model: 0x000000ff1e1e1e {!-50299|DiagramColor Model: 65535,65535,65535} NodeBorderColor Model: 0x000000ff646464 NodeInfo Module: 1,,,,0 NodeFontColor Module: 0x000000ff1e1e1e {!-50299|DiagramColor Module: 65535,65535,65535} {!-50299|DisplayInputs Module: Object Object, Object Decision, Object Index, Index ACP_handles_to_objec, Decision ACP_node_radius, Decision ACP_Autocalc_default, Decision ACP_User_output, Decision ACP_Select_a_diagram, Decision ACP_Diagrams_that_ov, Decision ACP_Autocalc_for_thi, Variable ACP_Autocalc_status_, Variable ACP_Autocalc_statu2, Decision ACP_Autocalc_defdiag} NodeBorderColor Module: 0x000000ff646464 NodeInfo LinkModule: 1,,,,0 NodeFontColor LinkModule: 0x000000ff1e1e1e {!-50299|DiagramColor LinkModule: 65535,65535,65535} NodeBorderColor LinkModule: 0x000000ff646464 NodeInfo Library: 1,,,,0 {!-50299|DiagramColor Library: 65535,65535,65535} {!-50299|DisplayInputs Library: Object Decision, Decision ACP_Select_module2} NodeBorderColor Library: 0x000000ff646464 NodeInfo LinkLibrary: 1,,,,0 NodeFontColor LinkLibrary: 0x000000ff1e1e1e {!-50299|DiagramColor LinkLibrary: 65535,65535,65535} NodeBorderColor LinkLibrary: 0x000000ff646464 NodeInfo Form: 1,,,,0 NodeFontColor Form: 0x000000ff1e1e1e {!-50299|DiagramColor Form: 65535,65535,65535} NodeBorderColor Form: 0x000000ff646464 {!50500|NodeInfo MissingLinkModule: 1,,,,0} {!50500|NodeColor MissingLinkModule: 0x000000ff6294de} {!50500|NodeFontColor MissingLinkModule: 0x000000ff1e1e1e} {!50500|NodeBorderColor MissingLinkModule: 0x000000ff646464} {!50500|NodeInfo MissingLinkLibrary: 1,,,,0} {!50500|NodeColor MissingLinkLibrary: 0x000000ff6294de} {!50500|NodeFontColor MissingLinkLibrary: 0x000000ff1e1e1e} {!50500|NodeBorderColor MissingLinkLibrary: 0x000000ff646464} NodeColor Variable: 0x000000ff4ac4ec DisplayInputs Variable: Object Function, Function ACP_Prefix_from_obj DisplayOutputs Variable: Module ACP_autocalc_UI NodeFontColor Variable: 0x000000ff1e1e1e NodeInfo Variable: 1,,,,0 {!50400|NodeBorderColor Variable: 0x000000ff646464} NodeColor Decision: 0x000000ff5ccda3 DisplayOutputs Decision: Object Object, Object Function, Object Module, Object Library, Library ACP_IT_and_alias_fun, Function ACP_Summary_of_modul, Module ACP_Top_styles, Module ACP_old_autocalc, Module ACP_autocalc_UI NodeFontColor Decision: 0x000000ff1e1e1e NodeInfo Decision: 1,,,,0 {!50400|NodeBorderColor Decision: 0x000000ff646464} NodeColor Chance: 0x000000ff50b4be NodeFontColor Chance: 0x000000ff1e1e1e NodeInfo Chance: 1,,,,0 {!50400|NodeBorderColor Chance: 0x000000ff646464} NodeColor Objective: 0x000000ffdf758f NodeFontColor Objective: 0x000000ff1e1e1e NodeInfo Objective: 1,,,,0 {!50400|NodeBorderColor Objective: 0x000000ff646464} NodeColor Constraint: 0x000000fff8dd81 NodeFontColor Constraint: 0x000000ff1e1e1e NodeInfo Constraint: 1,,,,0 {!50400|NodeBorderColor Constraint: 0x000000ff646464} NodeColor GradientClass: 0x000000ffffafc7 NodeFontColor GradientClass: 0x000000ff1e1e1e NodeInfo GradientClass: 1,,,,0 {!50400|NodeBorderColor GradientClass: 0x000000ff646464} DisplayInputs Index: Object FrameNode NodeColor Index: 0x000000ff9299df DisplayOutputs Index: Object Object, Object Function, Object Module, Module ACP_Attrib_field_ind, Function ACP_Summary_of_modul, Module ACP_Dashboard_sizes NodeFontColor Index: 0x000000ff1e1e1e NodeInfo Index: 1,,,,0 {!50400|NodeBorderColor Index: 0x000000ff646464} NodeColor Constant: 0x000000ffeea665 NodeFontColor Constant: 0x000000ff1e1e1e NodeInfo Constant: 1,,,,0 {!50400|NodeBorderColor Constant: 0x000000ff646464} NodeColor Determ: 0x000000ff4ac4ec NodeFontColor Determ: 0x000000ff1e1e1e NodeInfo Determ: 1,,,,0 {!50400|NodeBorderColor Determ: 0x000000ff646464} NodeInfo FormNode: 1,0,0,,0,0,,,,0,,,0,,,,,16 NodeFontColor FormNode: 0x000000ff1e1e1e NodeInfo Button: 1,,,,0 NodeColor Button: 0x000000ff969da5 NodeFontColor Button: 0x000000ff1e1e1e {!50400|NodeBorderColor Button: 0x000000ff646464} NodeInfo Text: 1,0,0,,0,1,,,,,,,0,,,,,16 NodeColor Text: 0x000000ffffffff {!50400|NodeBorderColor Text: 0x000000ff7d7d7d} NodeFontColor Text: 0x000000ff1e1e1e {!50500|NodeColor ArrowClass: 0x000000ff646464} {!50500|Att_ArrowProperties ArrowClass: ,,1} {!50500|DisplayOutputs FrameNode: Object Index} {!50500|NodeBorderColor FrameNode: 0x000000ff7d7d7d} {!50500|NodeInfo FrameNode: 1,0,0,0,0,1,,,,,,,0,,,,,16} {!50500|NodeColor FrameNode: 0x000000ffffffff} {!50500|NodeFontColor FrameNode: 0x000000ff1e1e1e} {!-60000|Attribute AcpStyles} Attribute Prev_attribute Title: Prev_attribute Attribute Saved_frame_view Title: Saved_frame_view AskAttribute Saved_frame_view,Function,Yes AskAttribute Saved_frame_view,Module,Yes AskAttribute OnChange,Variable,Yes AskAttribute Saved_frame_view,Variable,Yes Model Portfolio_optimizati Title: Portfolio optimization with dependencies Description: This model shows an example of how you can use Optimizer to select the optimal mix of projects for a portfolio that maximize total value subject to each project's costs and dependencies on other projects. Author: Karen Lee~ Lumina Decision Systems Date: Wed, Apr 24, 2024 6:30 AM NodeInfo: 1,,,,,,,,,,,0 DiagState: 2,613,190,1205,594,17,10,4 DiagramColor: 0x000000fff5f5f5 FontStyle: Segoe UI,15 FileInfo: 0,Model Portfolio_optimizati,2,2,0,0,C:\Users\karen\Desktop\PortfolioOptimizationwithDependencies.ana AcpStyles: Navigation_style: Top_tabs~ Show_outline: No~ Show_tabs: No~ Use_top_diagram_size: No~ Node_drop_shadow: No~ Bevel_node_border: No~ Show_title: Yes~ Show_uncertainty_view: Yes~ Show_graph_table_icon: Yes~ Show_description: 20~ Show_index_menus: Fly-in~ Tab_color: Background~ auto_zoom_diagrams: Yes~ Show_As_Tab: Yes Module Details Title: Details Description: This module contains the details of the model. Author: Max Henrion~ Lumina Date: Thu, Apr 25, 2024 2:36 PM NodeLocation: 184,536,1 NodeSize: 64,24 NodeInfo: 1,,,,,,,,,,,0 DiagState: 2,153,108,1071,669,17,10 DiagramColor: 0x000000fff5f5f5 FontStyle: Segoe UI,15 Decision Fund_project Title: Fund project Description: Decision whether to fund a project (1= fund, 0= do not fund) Definition: Table(Project)(0,0,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,1,1,1,1,0,1,0,0,1,1,1,0,1,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1) NodeLocation: 528,168,1 NodeSize: 64,24 WindState: 2,815,380,720,350 DefnState: 2,164,170,409,514,0,DFNM ValueState: 2,196,202,416,549,,MIDM NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 {!40300|DomainExpr: Boolean()} {!40200|OptDimensions: [Project]} Constant Budget_by_group Title: Budget by group Description: Each group's budget Definition: Table(Group)(442,578,689,416,531) NodeLocation: 232,104,1 NodeSize: 64,24 WindState: 2,925,445,720,350 DefnState: 2,532,538,416,303,0,DFNM Aliases: FormNode Fo1929292339 NumberFormat: 2,I,4,0,1,1,4,0,$,0,"ABBREV",0,,,0,0,15,,0 {!50000|Att_ColumnWidths: [63]} Constant Group_by_project Title: Group by project Description: The group for each project Definition: Table(Project)(Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,1,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,2,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,3,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,4,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0),Choice(Group,5,0)) NodeLocation: 232,40,1 NodeSize: 64,24 WindState: 2,98,81,719,351 DefnState: 2,484,195,416,598,0,DFNM TableCellDefault: Choice(Group, 1, 0) Constant Value_by_project Title: Value by project Description: The value of each project Definition: Table(Project)(62,31,19,24,87,86,47,3,12,3,51,17,39,23,59,58,93,76,46,3,13,91,58,97,77,89,7,99,99,100,56,40,22,70,33,97,47,87,46,12,63,100,15,34,39,92,50,26,95,79,64,50,65,75,34,5,79,62,18,71,96,30,47,49,73,42,23,71,41,16,71,20,6,73,5,26,78,36,87,57,46,75,48,79,29,59,3,10,45,34,97,90,56,44,9,23,93,70,85,31,3,11,11,4,22,10,3,13,21,9,10,15,4,5,4,11,23,25,14,13,9,15,10,7,12,4,3,23,7,3,23,22,22,6,5,3,17,5,3,21,3,21,25,23,22,13,10,6,24,3) NodeLocation: 232,232,1 NodeSize: 64,24 Constant Cost_by_project Title: Cost by project Description: Each project's cost Definition: Table(Project)(59,28,15,11,15,77,13,2,12,2,49,15,28,18,12,36,64,54,46,3,13,75,56,30,28,44,7,99,29,69,28,15,15,61,28,72,43,20,16,11,37,55,13,25,35,70,18,24,35,51,38,46,62,62,28,5,69,30,14,40,47,20,46,35,64,41,18,37,39,13,11,17,6,17,5,10,70,14,11,24,22,22,43,10,20,26,2,10,29,29,63,63,34,25,9,18,69,24,54,16,1,10,10,3,9,8,9,14,3,4,3,10,8,9,6,3,6,5,4,4,2,9,5,2,21,20,11,11,10,20,17,10,16,11,10,16,16,17,15,14,1,1,1,1,1,10,11,11,10,9) NodeLocation: 232,168,1 NodeSize: 64,24 DefnState: 2,691,79,672,529,0,DFNM {!50000|Att_ColumnWidths: [62]} Variable Net_value Title: Net value Description: Value of each poject with costs subtracted Definition: Value_by_project - Cost_by_project NodeLocation: 384,232,1 NodeSize: 64,24 WindState: 2,439,541,720,350 ValueState: 2,1727,476,416,303,,MIDM Objective Total_value Title: Total value Description: Total value of funded projects Definition: SUM(Net_value * Fund_project, Project) NodeLocation: 616,232,1 NodeSize: 64,24 ValueState: 2,813,267,416,303,,MIDM ReformVal: [Comparisons,Undefined] Constant Dependency_table Title: Dependency table Description: A list of enabler projects required for each project. If any enabler projects for a project are not selected, then that project cannot be completed. Definition: Table(Enabler_number,Project)(~ 146,127,118,129,Null,143,Null,Null,Null,121,Null,Null,Null,18,106,57,Null,Null,24,Null,Null,8,149,104,119,Null,70,Null,108,132,Null,12,143,Null,29,122,Null,134,144,Null,Null,108,125,120,142,Null,Null,128,125,139,Null,Null,143,Null,Null,20,144,118,50,132,149,Null,138,Null,23,106,92,Null,Null,122,Null,Null,18,122,Null,42,Null,117,101,36,121,Null,116,Null,Null,21,32,Null,Null,Null,124,Null,Null,31,Null,Null,106,147,68,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,~ 133,137,126,140,Null,121,Null,Null,Null,Null,Null,Null,Null,125,Null,140,Null,Null,135,Null,Null,120,Null,137,Null,Null,139,Null,150,125,Null,122,Null,Null,109,123,Null,146,22,Null,Null,103,137,14,144,Null,Null,118,Null,133,Null,Null,Null,Null,Null,129,51,Null,133,35,112,Null,116,Null,146,110,136,Null,Null,128,Null,Null,98,Null,Null,3,Null,103,106,Null,104,Null,101,Null,Null,Null,Null,Null,Null,Null,149,Null,Null,25,Null,Null,131,122,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,~ 126,111,131,113,Null,128,Null,Null,Null,Null,Null,Null,Null,150,Null,Null,Null,Null,103,Null,Null,Null,Null,112,Null,Null,Null,Null,131,120,Null,112,Null,Null,Null,131,Null,103,133,Null,Null,142,128,123,124,Null,Null,104,Null,143,Null,Null,Null,Null,Null,Null,124,Null,Null,132,128,Null,149,Null,Null,146,Null,Null,Null,138,Null,Null,Null,Null,Null,Null,Null,148,139,Null,142,Null,150,Null,Null,Null,Null,Null,Null,Null,123,Null,Null,Null,Null,Null,101,149,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,~ 129,132,141,118,Null,129,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,150,Null,Null,Null,Null,112,122,Null,Null,Null,Null,Null,136,Null,Null,101,Null,Null,107,108,147,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,143,Null,Null,117,110,Null,133,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,142,Null,Null,Null,Null,106,Null,Null,Null,Null,Null,Null,Null,124,Null,Null,Null,Null,Null,143,145,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,~ 149,Null,114,145,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,112,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,132,145,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,147,Null,101,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,106,Null,Null,Null,Null,Null,Null,Null,124,Null,Null,Null,Null,Null,Null,137,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,~ 150,Null,102,148,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,101,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,144,138,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,126,Null,147,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,135,Null,Null,Null,Null,Null,Null,Null,131,Null,Null,Null,Null,Null,Null,111,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null) NodeLocation: 232,296,1 NodeSize: 64,24 WindState: 2,529,193,720,350 DefnState: 2,52,58,1016,730,0,DFNM ValueState: 2,943,157,726,518,,MIDM Aliases: FormNode Fo1795074611 ReformDef: [Enabler_number,Project] ReformVal: [Enabler_number,Project] NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 Constraint Budget Title: Budget Description: The budget constraint: for the Group optimization, this means each group's project costs needs to be under their group budget. For the Global optimization, this means the total project cost needs to be under the total budget, which is the sum of all group budgets. Definition: IF Comparisons='Global' THEN SUM(Cost_by_project * Fund_project, Project) <= Sum(Budget_by_group, Group)~ ~ ELSE Aggregate(Cost_by_project * Fund_project, Group_by_project, Project, Group) <= Budget_by_group NodeLocation: 528,104,1 NodeSize: 64,24 WindState: 2,302,329,720,350 ValueState: 2,1074,62,416,303,,MIDM ReformVal: [Comparisons,Group] {!40200|OptDimensions: [Group]} {!50000|Att_ColumnWidths: [85]} Variable Dependencies Title: Dependencies Description: List of dependencies with each relationship on its own row. Definition: local endPos := Cumulate( SUM(Dependency_table <> Null, Enabler_number) );~ local startPos := If @Project-1=0 THEN 1 ELSE endPos[@Project=@Project-1] + 1;~ local dependents := Array(Dependency_number, 1);~ ~ For i := Project DO (~ localindex reIndex := SUBSET(startPos[Project=i] <= Dependency_number <= endPos[Project=i]);~ dependents[Dependency_number=reIndex] := i;~ );~ ~ local dependees := Flatten(Dependency_table, Project, Enabler_number, condition:Dependency_table<>Null, ResultIndex:Dependency_number);~ ~ IF Dependency_field='Dependent' THEN dependents ELSE dependees NodeLocation: 384,296,1 NodeSize: 64,24 WindState: 2,146,304,720,350 ValueState: 2,476,47,664,638,,MIDM ReformVal: [Dependency_field,Dependency_number] NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 {!50000|Att_ColumnWidths: [,Sys_LocalIndex('K'),\([61])]} Constraint Dependency1 Title: Dependency Description: The project dependency constraint: for each funded project, all enabler projects must also be funded. Definition: Fund_project[Project=Dependencies[Dependency_field='Dependent']] <= Fund_project[Project=Dependencies[Dependency_field='Enabler']] NodeLocation: 528,296,1 NodeSize: 64,24 ValueState: 2,1024,70,1196,537,,MIDM NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 {!40200|OptDimensions: [Dependency_number]} Decision Comparisons Title: Comparisons Description: The different ways to solve the problem. Group shows the optimal solution using the group budget constraint whereas Global shows the optimal solution using only total budget. Definition: Choice(Self,0) NodeLocation: 776,104,1 NodeSize: 64,24 WindState: 2,98,81,720,351 NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 {!40300|DomainExpr: Discrete('Group','Global')} Module Indexes Title: Indexes Description: Module containing the indexes used throughout this model Author: Max Henrion~ Lumina Date: Thu, Apr 25, 2024 2:36 PM NodeLocation: 88,296,1 NodeSize: 64,24 DiagState: 2,110,135,805,318,17,10 DiagramColor: 0x000000fff5f5f5 FontStyle: Segoe UI,15 Index Project Att_PrevIndexValue: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150] Title: Project Description: List of projects by project number Definition: 1..150 NodeLocation: 104,48,1 NodeSize: 64,24 WindState: 2,938,284,720,350 NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 Index Group Att_PrevIndexValue: ['A','B','C','D','E'] Title: Group Description: List of groups Definition: ['A','B','C','D','E'] NodeLocation: 104,104,1 NodeSize: 64,24 Index Enabler_number Title: Enabler number Definition: 1..6 NodeLocation: 104,216,1 NodeSize: 64,24 NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 Index Dependency_field Title: Dependency field Definition: ['Dependent','Enabler'] NodeLocation: 104,160,1 NodeSize: 64,24 Index Dependency_number Title: Dependency number Definition: 1..SUM(Dependency_table <> Null, Enabler_number, Project) NodeLocation: 264,48,1 NodeSize: 64,24 NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 Index Projects_for_sensiti Title: Projects for sensitivity Description: List of all projects Definition: 1..150 NodeLocation: 264,104,1 NodeSize: 64,24 WindState: 2,126,258,720,422 NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 Index Fields Title: Fields Definition: ['Marginal value','Cost'] NodeLocation: 104,272,1 NodeSize: 64,24 Index Ranking Title: Ranking Definition: 1.. Max( SUM( Group_by_project=Group, Project ) ) NodeLocation: 264,160,1 NodeSize: 64,24 WindState: 2,1105,419,720,346 NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 Index Field Title: Field Definition: ['Project','Marginal Value'] NodeLocation: 264,272,1 NodeSize: 64,24 WindState: 2,98,91,720,350 Index Project_data_fields Att_PrevIndexValue: ['Group','Cost','Value'] Title: Project data fields Definition: ['Group','Cost','Value'] NodeLocation: 264,216,1 NodeSize: 64,24 Close Indexes Module Sensitivity_analysis Title: Sensitivity analysis Description: Module containing sensitivity analysis of the solution Author: Max Henrion~ Lumina Date: Thu, Apr 25, 2024 2:36 PM NodeLocation: 776,296,1 NodeSize: 64,24 NodeInfo: 1,0,,,,,,,,,0 DiagState: 2,421,188,1284,638,17,10 WindState: 2,776,615,720,291 DiagramColor: 0x000000fff5f5f5 FontStyle: Segoe UI,15 Constraint Sensitivity Title: Sensitivity Description: Sensitivity constraint that reruns the optimization for each project, including the project if it was not in the optimal solution and excluding the project if it was in the optimal solution Definition: (Fund_project[Project=Projects_for_sensiti] = NOT Optimal_funded_proj1[Project=Projects_for_sensiti, Comparisons='Group']) NodeLocation: 96,360,1 NodeSize: 64,24 WindState: 2,1286,366,704,340 ValueState: 2,99,197,416,665,,MIDM ReformVal: [Comparisons,Projects_for_sensiti] Variable Marginal_value_sorte Title: Marginal value sorted Units: $ Description: The marginal value of each project sorted from most valuable to least valuable. Definition: Marginal_value[Projects_for_sensiti=Sorted_projects] NodeLocation: 384,432,1 NodeSize: 64,24 WindState: 2,274,632,720,350 ValueState: 2,1197,240,808,602,0,MIDM GraphSetup: Flip:8~ Att_ForceCategorical Graph_Primary_Valdim:1 NumberFormat: 2,I,4,0,1,1,4,0,$,0,"ABBREV",0,,,0,0,15,,0 {!40700|Att_CellFormat: CellSpan((Self.projects),CellNumberFormat('Integer',thousandsSeparators:$1,dateFormat:'ABBREV',fullPrecision:$0,numbersAsDates:$0,datesAsNumbers:$0,digits_:$4,zeroes_:$0,showZeroImPart:$0),$1,$150,header:$1)} Variable Marginal_value_vs_co Title: Marginal value vs cost Description: Marginal value of each project compared to the cost of the project. The marginal value of each project is the reduction in value of the optimal solution (with Group budget constraints) when that project is disabled or enabled. Definition: MultiTable(Fields)(Marginal_value[Projects_for_sensiti=Sorted_projects], Cost_by_project[Project=Sorted_projects]) NodeLocation: 240,512,1 NodeSize: 64,32 NodeInfo: 1,,,,,,,,,,0 ValueState: 2,989,269,808,513,1,MIDM Aliases: FormNode Fo206432819 GraphSetup: Flip:8~ Att_ContLineStyle Graph_Primary_Valdim:4~ Att_GraphValueRange Marginal_value_vs_co:|1:1,0~ Att_StackedBar Graph_Primary_Valdim:1 ReformVal: [Sorted_projects,Project] Att_XRole: -1 Att_YRole: -2 Att_CoordinateIndex: Fields {!40200|Att_GraphSetupSlices: [3,1,Fields,1]} {!40600|Att_StackingIndex: Fields} {!40600|Att_ClusterIndex: Null} {!50000|Att_RowHeights: [,Project,\([,,,,,,19])]} Variable Optimization_with_se Title: Optimization with sensitivity Description: The optimization problem with the sensitivity constraint Definition: DefineOptimization(Decisions: Fund_project, ~ Maximize: Total_value,~ Constraints: Budget,Dependency1,Sensitivity) NodeLocation: 96,432,1 NodeSize: 64,24 WindState: 2,1319,92,720,350 ValueState: 2,567,44,851,795,,MIDM ReformVal: [Comparisons,Projects_for_sensiti] Decision Optimal_projects_w_s Title: Optimal projects w sensitivity Description: Optimal funding solution for each subproblem in the sensitivity analysis. For each optimal project (for the Group problem), re-runs the optimization without that project. Definition: OptSolution(Optimization_with_se, Fund_project) NodeLocation: 96,512,1 NodeSize: 64,32 WindState: 2,102,150,718,350 ValueState: 2,1141,92,567,660,,MIDM ReformVal: [Comparisons,Project] NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 Att_ResultSliceState: [Projects_for_sensiti,1,Project,1,Comparisons,1] {!50000|Att_ColumnWidths: [,Comparisons,\([67])]} Variable Marginal_value Title: Marginal value Description: The marginal value of each optimally funded project in the Group solution. This is the difference between the total value of the optimal solution (including all costs and values) including that project and the total value of the optimal solution when excluding that project. Definition: (Optimal_total_value - OptObjective(Optimization_with_se))[Comparisons='Group'] NodeLocation: 240,432,1 NodeSize: 64,24 WindState: 2,671,70,720,350 ValueState: 2,203,44,823,865,1,MIDM GraphSetup: BarOverlap:100~ Att_StackedBar Graph_Primary_Valdim:0~ Flip:8~ Att__BarOrigin Marginal_value:0~ Att_ForceCategorical Graph_Primary_Valdim:1 ReformVal: [Projects_for_sensiti,Comparisons] Att_OriginRole: Null {!40600|Att_ClusterIndex: Comparisons} Variable Most_valuable_projec Title: Most valuable projects by group Description: Projects by group ranked by their marginal value. Definition: FOR i := Group DO (~ localindex groupProjects := SUBSET(Group_by_project=i);~ localindex sorted := SortIndex(Marginal_value_sorte[Sorted_projects=groupProjects], descending:True);~ IF Field='Project' THEN sorted[@sorted=Ranking] ELSE Marginal_value_sorte[Sorted_projects=sorted, @sorted=Ranking]~ ) NodeLocation: 384,512,1 NodeSize: 64,32 NodeInfo: 1,,,,,,,,,,0 WindState: 2,640,275,826,604 ValueState: 2,413,49,808,708,0,MIDM Aliases: FormNode Fo207727155 GraphSetup: Flip:8~ Att_ForceCategorical Graph_Primary_Valdim:1 ReformVal: [Field,Ranking] Att__TotalsIndex: [Ranking] Att_ResultSliceState: [Group,1,Ranking,5,Field,1] {!40600|Att_ClusterIndex: Group} {!40700|Att_CellFormat: CellFormats(CellSpan(Field,CellNumberFormat('Integer',thousandsSeparators:0,dateFormat:'ABBREV',fullPrecision:0,numbersAsDates:0,datesAsNumbers:0,digits_:4,zeroes_:0,showZeroImPart:0),1,header:0),CellSpan(Field,CellNumberFormat('Integer',thousandsSeparators:1,currency:'$-#',dateFormat:'ABBREV',fullPrecision:0,numbersAsDates:0,datesAsNumbers:0,digits_:4,zeroes_:0,showZeroImPart:0),2,header:0))} Index Sorted_projects Title: Sorted projects Description: The list of projects reordered Definition: SortIndex(Marginal_value, descending:True) NodeLocation: 384,360,1 NodeSize: 64,24 WindState: 2,718,109,720,350 NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 {!50500|FrameNode Te378907187} {!50500|NodeLocation: 828,300,-1} {!50500|NodeSize: 356,276} Text Te990774835 Title: Sensitivity analysis Description: This module conducts sensitivity analysis on the original optimization problem by adding a new sensitivity constraint. This constraint re-runs the optimization for each project when that project is excluded if it was included in the optimal solution (in the Group problem) or included if it was originally excluded. ~ ~ The marginal value of each project is the reduction in value of the global solution when that project is disabled or enabled. It shows which projects provide the most value; the higher the marginal value, the greater effect choosing or not choosing that project has on the total value. NodeLocation: 240,168,-1 NodeSize: 208,144 Close Sensitivity_analysis Variable Optimization Title: Optimization Description: The optimization problem. Definition: DefineOptimization(Decisions: Fund_project, ~ Maximize: Total_value, ~ Constraints: Budget,Dependency1)~ ~ NodeLocation: 776,232,1 NodeSize: 64,24 WindState: 2,118,298,720,350 ValueState: 2,1058,43,851,795,,MIDM ReformVal: [Group,Project] Decision Optimal_funded_proj1 Title: Optimal funded projects Description: Funded projects in the optimal solutions (1=fund, 0=do not fund). The Group solution is when the optimization is run with group budget constraints; the Global solution is when the optimization is run with a global budget constraint which is the sum of the group budgets. Definition: OptSolution(Optimization, Fund_project) NodeLocation: 952,168,1 NodeSize: 64,24 WindState: 2,314,172,720,350 ValueState: 2,498,39,672,529,,MIDM Aliases: FormNode Fo369207859 ReformVal: [Comparisons,Project] NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 Button Use_optimal_solution Title: Use optimal solution Description: Press this button to assign the optimal solution to "Fund project". NodeLocation: 776,168,1 NodeSize: 64,24 OnClick: Fund_project := Optimal_funded_proj1 Objective Optimal_total_value Title: Optimal total value Description: Total value of optimal solution. The global optimal solution subject to a single global budget is a bit higher than the solution optimized constrained to be within each Group budget where the sum of the group budgets equals the global budget. Definition: OptObjective(Optimization) NodeLocation: 952,232,1 NodeSize: 64,24 ValueState: 2,464,657,416,303,,MIDM Aliases: FormNode Fo928098867 NumberFormat: 2,I,4,0,1,1,4,0,$,0,"ABBREV",0,,,0,0,15,,0 {!50500|ArrowClass Arrow1140763187} {!50500|Att_HeadNode: Sensitivity_analysis} {!50500|Att_TailNode: Dependency1} {!50500|Att_ArrowWayPoints: [Null,Null,0.625,0.25]} {!50500|Att_ArrowProperties: 1} {!50500|FrameNode Te120171059} {!50500|NodeLocation: 524,496,-1} {!50500|NodeSize: 500,160} Decision Group_vs_global_fund Title: Group vs global funded projects Description: Projects whose selection changes from the Group to Global optimization. The Group solution is when the optimization is run with group budget constraints; the Global solution is when the optimization is run with a global budget constraint which is the sum of the group budgets. If there are projects here, this means there are projects that would increase the total value that aren't being selected because of group budget constraints or dependencies. Definition: INDEX Projects_diff := Subset(Optimal_funded_proj1[Comparisons='Group'] <> Optimal_funded_proj1[Comparisons='Global']);~ Optimal_funded_proj1[Project = Projects_diff] NodeLocation: 952,104,1 NodeSize: 64,24 WindState: 2,554,438,720,350 ValueState: 2,636,61,808,513,,MIDM Aliases: FormNode Fo1526049331 ReformVal: [Comparisons,Sys_LocalIndex('Projects_diff')] NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15,,0 {!40700|Att_CellFormat: CellFormats(CellSpan((Self.Projects_diff),CellNumberFormat('Integer',thousandsSeparators:$0,dateFormat:'ABBREV',fullPrecision:$0,numbersAsDates:$0,datesAsNumbers:$0,digits_:$4,zeroes_:$0,showZeroImPart:$0),$1,$8,header:$1),CellSpan(Comparisons,CellNumberFormat('Integer',thousandsSeparators:$0,dateFormat:'ABBREV',fullPrecision:$0,numbersAsDates:$0,datesAsNumbers:$0,digits_:$4,zeroes_:$0,showZeroImPart:$0),$1,$2,header:$1))} Constant Project_data Title: Project data Description: Input information about each project here. Definition: MultiTable(Project_data_fields)(Group_by_project,Cost_by_project,Value_by_project) NodeLocation: 88,40,1 NodeSize: 64,24 DefnState: 2,1217,84,808,655,0,DFNM ValueState: 2,84,90,577,684,,MIDM Aliases: FormNode Fo88451635 ReformDef: [Project_data_fields,Project] ReformVal: [Project_data_fields,Project] {!40700|Att_CellFormat: CellFormats(CellSpan(Project_data_fields,CellNumberFormat('Integer',thousandsSeparators:0,dateFormat:'ABBREV',fullPrecision:0,numbersAsDates:0,datesAsNumbers:0,digits_:4,zeroes_:0,showZeroImPart:0),4,header:0))} Module Incentive_adjustments Title: Incentive adjustments Description: This module contains a 2nd-level optimization that computes an inventive value for each project. If you add these incentive values to each project's starting value, each group will independently choose the same solution as was found by the global optimization, without any consideration of dependencies! Because you can assume each group will select the global optimum independently, each group can assume the required dependencies will be satisfied.~ ~ This assumes that each group maximizes total value, and that upper management can add these incentive values to the values used by each group.~ ~ How does it work?~ ~ From the solution of a continuous LP, you can obtain the sensitivity range -- the range by which you can adjust the objective coefficients (net_value in our case) without changing the solution. This sentitivity range (sa) is returned by Analytica's OptObjectiveSa() function. This would yield the incentive adjustment pretty directly if not for the fact that it the same is not possible for an integer (or binary) constrained LP.~ ~ So, to compute the sensitivity, we create a continuous LP that yields the same solution as the global optimization, even when each group is optimizing independently. It is a formulation WITHOUT the dependency constraint. This is actually easy to do given that we know what the global solution is (the Desired solution) since all we need to do is assign a positive objective coeff (the net value) for each project in the desired solution, and a <=0 coef for each that we do not want in the solution. ~ ~ We can now use a separate budget constraint for each group, and no dependency constraint, so that each group optimizes independently, without changing the solution. The result is a continuous LP with the same solution as the global integer LP. This we can compute the sa, and hence the required incentive adjustment. Author: Karen Lee~ Lumina Decision Systems Date: Fri, Apr 26, 2024 6:57 AM NodeLocation: 952,296,1 NodeSize: 64,24 NodeInfo: 1,0,,,,,,,,,0 DiagState: 2,490,78,1098,611,17,10 WindState: 2,1350,50,940,792 DiagramColor: 0x000000fff5f5f5 FontStyle: Segoe UI,15 Variable Optimization_Incentived_w_o_dependency Title: Optimization~ Incentived, w/o dependency Description: The continuous LP. Definition: DefineOptimization(Decisions: Fund_project_continuous, ~ Maximize: Total_group_value, ~ Constraints: Group_budget_continuous )~ ~ NodeLocation: 280,216,1 NodeSize: 64,32 WindState: 2,118,298,721,350 ValueState: 2,482,68,851,795,,MIDM ReformVal: [Undefined,Group] Variable Signed_incentived_net_value Title: Signed incentived net value Description: A net_value that will result in the solution we want. Easy, set those we don't want included to have a negative value, and those we do want to have a positive value. The projects with positive values will fit within the budget, so will be chosen. Definition: If Desired_solution Then Max([1,net_value]) else -1 NodeLocation: 112,64,1 NodeSize: 72,24 ValueState: 2,212,218,416,561,,MIDM ReformVal: [Comparisons,Project] Att__TotalsIndex: [Project] Objective Total_group_value Title: Total group value Description: The total value. TO DO: This should be indexed by Group, with null used for project not in group's purview. But it works this way also. Definition: sum(Signed_incentived_net_value * Fund_project_continuous, Project);~ Aggregate(Signed_incentived_net_value * Fund_project_continuous, Group_by_project, Project, Group) NodeLocation: 280,136,1 NodeSize: 64,24 ValueState: 2,532,538,415,303,,MIDM ReformVal: [Comparisons,Group] Decision Opt_Fund_Project_continuous Title: Opt Fund Project continuous Description: The optimal funding decisions with this continuous formulation. If we did it right, it should yield the same solution as the global optimization. Definition: OptSolution(Optimization_Incentived_w_o_dependency, Fund_project_continuous)[Group=Group_by_project] NodeLocation: 440,216,1 NodeSize: 64,32 ValueState: 2,421,65,334,690,,MIDM ReformVal: [Comparisons,Project] Decision Fund_project_continuous Title: Fund project continuous Description: Whether to fund the project. We constrain it to be between 0 and 1, but allow it to be continuous. The nature of the LP will push it to one extreme or the other (there is no aspect of the formulation that would balance it). Definition: 0 NodeLocation: 112,136,1 NodeSize: 64,24 {!40300|DomainExpr: Continuous(0,1)} {!40200|OptDimensions: [Project]} Constraint Group_budget_continuous Title: Group budget continuous Description: Each group has a budget constraint. Definition: Aggregate(Cost_by_project * Fund_project_continuous, Group_by_project, Project, Group) <= Budget_by_group NodeLocation: 112,216,1 NodeSize: 64,24 ValueState: 2,484,490,416,303,,MIDM ReformVal: [Comparisons,Group] {!40200|OptDimensions: [Group]} Variable Compare_solution_to_original Title: Compare solution to original Description: Compare to the global to make sure it is the same solution. Definition: [Desired_solution,Opt_Fund_Project_continuous] NodeLocation: 608,216,1 NodeSize: 64,32 ValueState: 2,336,72,623,787,,MIDM ReformVal: [Self,Project] Att_ResultSliceState: [Comparisons,1,Project,1,Self,1] Objective Incentive_value2 Title: Incentive value Description: This is an adjustment that can be made to project value in order to incentivize each group to prefer the global solution to all others, even when they don't pay attention to the dependencies of other groups.~ ~ We need to add back in the net_value for those projects outside the desired solution so that it is an adjustment to the original net_value. Also, I add in 0.95 times the maximal adjustment. This is because at the exact boundary, we may end up in a situation where there are ties. Although the incentive should make the global solution maximally attractive to each group, if there is a tie a group might arbitrarily select the wrong projects, which would violate dependencies. Definition: (Signed_incentived_net_value - Net_value)~ -Incentive_adj NodeLocation: 768,136,1 NodeSize: 64,24 WindState: 2,98,82,720,350 ValueState: 2,989,269,808,513,0,MIDM Aliases: FormNode Fo1151265331 ReformVal: [Comparisons,Project] NumberFormat: 2,I,4,0,1,1,4,0,$,0,"ABBREV",0,,,0,0,15,,0 Att__TotalsIndex: [Project] Variable Incentive_adj Title: Incentive adj Description: The inventive adjustment to make to signed_incentivized_net_value to yield the global solution independently. Definition: local lowerSa := Sensitivity_of_coeff[.Range='lower'], upperSa := Sensitivity_of_coeff[.Range='upper'];~ Local v := ~ if lowerSa=-INF then~ if upperSa=INF then 0~ else upperSa~ else~ -lowerSa;~ if abs(v)<1e-4 then 0 else v NodeLocation: 608,136,1 NodeSize: 64,24 WindState: 2,561,164,720,350 ValueState: 2,389,12,1040,864,,MIDM Att__TotalsIndex: [Project] Variable Desired_solution Title: Desired solution Description: The solution we want for the continuous non-global solution. Definition: Optimal_funded_proj1[Comparisons='Group'] NodeLocation: 280,64,1 NodeSize: 64,24 WindState: 2,436,556,720,351 ValueState: 2,100,106,416,303,,MIDM ReformVal: [Comparisons,Project] Variable Sensitivity_of_coeff Title: Sensitivity of coefficients Description: How much we can adjust the objective coefficients by (e.g., signed_incentivized_net_value) without altering the solution. Definition: OptObjectiveSa(Optimization_Incentived_w_o_dependency, Fund_project_continuous)[Group=Group_by_project] NodeLocation: 440,136,1 NodeSize: 64,24 ValueState: 2,226,121,2175,246,,MIDM Module Each_group_solves_with_incentive Title: Each group solves with incentive Description: In this module, we have each group solve the original problem independently but with the incentive value added to the project values. If all works out, this should prove that we get the same global solution. Author: Karen Lee~ Lumina Decision Systems Date: Fri, Apr 26, 2024 6:57 AM NodeLocation: 928,136,1 NodeSize: 64,32 DiagState: 2,802,50,1121,662,17,10 DiagramColor: 0x000000fff5f5f5 FontStyle: Segoe UI,15 Variable Incentived_net_value Title: Incentived net value Description: New net value for each project after incentive values are added Definition: net_value + Incentive_value2 NodeLocation: 88,232,1 NodeSize: 64,32 ValueState: 2,63,41,462,688,,MIDM Att__TotalsIndex: [Project] Objective Incentivized_total_group_value Title: Incentivized total group value Description: Total value by group for the optimal solution when incentive values are included in each project's net value Definition: Aggregate(Incentived_net_value * Fund_project, Group_by_project, Project, Group) NodeLocation: 296,232,1 NodeSize: 64,32 WindState: 2,228,356,720,351 ValueState: 2,1035,340,416,303,,MIDM ReformVal: [Comparisons,Group] Variable Optimization_w_incentives Title: Optimization w/incentives Description: The optimization problem when incentive values are added to each project's net value Definition: DefineOptimization(Decisions: Fund_project, ~ Maximize: Incentivized_total_group_value, ~ Constraints: Budget[Comparisons='Group'])~ ~ NodeLocation: 472,160,1 NodeSize: 64,32 WindState: 2,118,297,720,351 ValueState: 2,1058,43,851,795,,MIDM ReformVal: [Undefined,Group] Decision Opt_Fund_project_w_i Title: Opt Fund project w/ incentives Description: The optimally funded projects for the incentive optimization problem Definition: OptSolution(Optimization_w_incentives, Fund_project)[Group=Group_by_project] NodeLocation: 632,56,1 NodeSize: 64,32 ValueState: 2,986,54,416,809,,MIDM Att__TotalsIndex: [] Variable Compare_to_global_solution Title: Compare to global solution Description: Comparing the incentive optimization problem, the continuous optimization problem, and the original optimal solution Definition: [Opt_Fund_project_w_i,Optimal_funded_proj1[Comparisons='Group'],Opt_Fund_Project_continuous] NodeLocation: 800,136,1 NodeSize: 64,24 WindState: 2,635,417,720,350 ValueState: 2,84,90,1042,947,,MIDM ReformVal: [Self,Project] Alias Al1254730291 Title: Group by project NodeLocation: 88,56,1 NodeSize: 64,24 Original: Group_by_project Objective total_value_not_including_incentives Title: total value not including incentives Description: The total value of the incentive optimization problem not including incentive values Definition: sum( Opt_Fund_project_w_i * net_value, Project ) NodeLocation: 632,160,1 NodeSize: 64,32 ValueState: 2,482,258,416,303,,MIDM Alias Al1771678259 Title: Incentive value NodeLocation: 88,160,1 NodeSize: 64,24 Original: Incentive_value2 Alias Al1482271283 Title: Opt Fund Project continuous NodeLocation: 960,56,1 NodeSize: 64,32 Original: Opt_Fund_Project_continuous {!50500|ArrowClass Arrow1173989939} {!50500|NodeInfo: ,,,,,,,,,,,1} {!50500|Att_HeadNode: Al1482271283} {!50500|Att_TailNode: Al1254730291} Variable differences Title: differences Description: Differences between the optimal solutions for the incentive optimization problem, the continuous optimization problem, and the original optimal solution Definition: (Opt_Fund_project_w_i-Optimal_funded_proj1[Comparisons='Group']) * (Optimal_funded_proj1[Comparisons='Group']-Opt_Fund_Project_continuous) NodeLocation: 800,232,1 NodeSize: 64,24 WindState: 2,277,453,720,350 ValueState: 2,212,218,577,740,,MIDM ReformVal: [Comparisons,Project] Att__TotalsIndex: [Project] Alias Al1036642867 Title: Fund project NodeLocation: 296,160,1 NodeSize: 64,24 Original: Fund_project Alias Al197782067 Title: Budget NodeLocation: 296,96,1 NodeSize: 64,24 Original: Budget Alias Al131459635 Title: OPT fund projects NodeLocation: 800,56,1 NodeSize: 64,32 Original: Optimal_funded_proj1 {!50500|FrameNode Te991816243} {!50500|NodeLocation: 704,444,-1} {!50500|NodeSize: 328,164} {!50500|ArrowClass Arrow954074675} {!50500|Att_HeadNode: Incentivized_total_group_value} {!50500|Att_TailNode: Al1254730291} {!50500|Att_ArrowWayPoints: [Null,Null,0.46153846153846156,0.6818181818181818]} {!50500|Att_ArrowProperties: 1} Text Te1524500019 Title: Incentive adjustments Description: This module confims that when the incentive values calculated in the Incentive adjustments module are added to each project's value, they will result in the Global optimal solution when solved with Group budget constraints. NodeLocation: 192,444,-1 NodeSize: 168,164 Close Each_group_solves_with_incentive {!50500|ArrowClass Arrow1134668339} {!50500|Att_HeadNode: Incentive_value2} {!50500|Att_TailNode: Desired_solution} {!50500|Att_ArrowWayPoints: [Null,Null,0.7411764705882353,0.2127659574468085]} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass Arrow989440563} {!50500|Att_HeadNode: Incentive_value2} {!50500|Att_TailNode: Signed_incentived_net_value} {!50500|Att_ArrowWayPoints: [Null,Null,0.24390243902439024,-40,0.573170731707317,-24]} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass Arrow167356979} {!50500|NodeInfo: ,,,,,,,,,,,1} {!50500|Att_HeadNode: Each_group_solves_with_incentive} {!50500|Att_TailNode: Opt_Fund_Project_continuous} {!50500|ArrowClass Arrow1344203315} {!50500|Att_HeadNode: Compare_solution_to_original} {!50500|Att_TailNode: Desired_solution} {!50500|Att_ArrowWayPoints: [0.8951737173277154,-156.12472359533993,0.6666666666666666,0.1111111111111111,0.7380952380952381,0.6666666666666666]} {!50500|Att_ArrowProperties: 1} {!50500|FrameNode Te958261811} {!50500|NodeLocation: 696,432,-1} {!50500|NodeSize: 320,160} Text Te1210975795 Title: Incentive adjustments Description: This module computes an inventive value for each project. The incentive value of each project is an amount you would have to add to (or subtract from) its direct value to incentivize the group manager to select the project (or not) to reach the global optimal solution without having to consider dependencies on projects in other groups. By adding (or subtracting) the incentive value to each project, the individual decisions by group managers to optimize their own project would lead to the global optimum. NodeLocation: 192,432,-1 NodeSize: 168,160 Close Incentive_adjustments {!50500|ArrowClass Arrow1814693427} {!50500|Att_HeadNode: Project_data} {!50500|Att_TailNode: Value_by_project} {!50500|Att_ArrowWayPoints: [-178.12212645893138,Null,0.6666666666666666,0.25]} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass Arrow170526259} {!50500|Att_HeadNode: Project_data} {!50500|Att_TailNode: Cost_by_project} {!50500|Att_ArrowWayPoints: [-178.12212645893138,Null,0.6666666666666666,0.3125]} {!50500|Att_ArrowProperties: 1} Close Details FormNode Fo1929292339 Title: Budget by group Definition: 0 NodeLocation: 184,136,1 NodeSize: 160,16 Original: Budget_by_group FormNode Fo1795074611 Title: Dependency table Definition: 0 NodeLocation: 184,104,1 NodeSize: 160,16 Original: Dependency_table FormNode Fo369207859 Title: OPT fund projects Definition: 1 NodeLocation: 184,248,1 NodeSize: 160,16 Original: Optimal_funded_proj1 FormNode Fo207727155 Title: Most valuable projects by group Definition: 1 NodeLocation: 184,408,4 NodeSize: 160,16 Original: Most_valuable_projec FormNode Fo928098867 Title: OPT Total value Definition: 1 NodeLocation: 184,280,1 NodeSize: 160,16 Original: Optimal_total_value Text Te1867098675 Title: Inputs NodeLocation: 184,100,-1 NodeSize: 168,76 NodeInfo: 1,,,,,,,,,,0 Text Te214542899 Title: Results NodeLocation: 184,384,-1 NodeSize: 168,192 NodeInfo: 1,,,,,,,,,,0 {!50500|FrameNode Te1160358451} {!50500|NodeLocation: 780,300,-1} {!50500|NodeSize: 412,276} FormNode Fo88451635 Title: Project data Definition: 0 NodeLocation: 184,72,1 NodeSize: 160,16 Original: Project_data FormNode Fo1526049331 Title: Funding projects diff group vs global Definition: 1 NodeLocation: 184,312,1 NodeSize: 160,16 Original: Group_vs_global_fund FormNode Fo1151265331 Title: Incentive value Definition: 1 NodeLocation: 184,472,1 NodeSize: 160,16 NodeInfo: 1,,,,,,,16,,,,,,0 Original: Incentive_value2 FormNode Fo206432819 Title: Marginal value vs cost Definition: 1 NodeLocation: 184,376,1 NodeSize: 160,16 NodeInfo: 1,,,,,,,16,,,,,,0 Original: Marginal_value_vs_co {!40404|FreePassObjectCount JOQSqwy5jj2MNB76AAHtFYqpbdKuFv6EVNHQRXZiKGJOI41$T8jAOPbpiltx6mj5F8_xxW8j7FawgINXdqWVv50utvWAnDNk6pDKWetbhtCx51iK36c3LLYn5LiYhFbgir1ocNzHoKp9Qm2RJpIj7Qklnb8eFwgM9R5rcAcDr2IVXHEDHHO_jrlfFAiRrWGyl1VF8Hp7RRmirfku_BtlvCzrrnUDVtELBM8FRZoWQcxgkXFaGgv38Z3V24U_dg29BqqY5ZyhVF6SB$xogwGlesphA0azkaMFdII1hpR0Rdw8Pl1QIrLtNUWQFIQUfJ8KVQc5vSwexKaiyfku_BtlvCvxiOhLjw2X5bCIa8ryOZfTRaIHLLS2qu5gcGl9U9vbOg8un2g0BHkGkJNd9qtHPHJWILTXiMOWnSSBrDlSkHvT8IrTDuaeo5oqbH5fOiHxXEQ_eReARdQaSdt3M8JZxEYE0xGwJdYqq7VpE8Ec7u2_wYV3qG$cIwftS8yiDmKkqvkib5oApXByCrZPAy6Ml962mUudzeO4t9qaSF3FXyOzxhRtTExjRGaH6sgW2Wj5EANftC0CUvkuniaA2Qv8ewu7Rh2u6QtLyykWWuQ7Pya8pzJxij7JVNPcORZdoSIQhzocCocCY39Yp9RqiyInWeYS6sRAdI2kXpbaTEm5jrvtnplkoovVWWhgWQF5RzXuw9ELXfucUiDa0Otrva9cqrlrsYRAxnZSqTNLE8dCeyOfVQVflyeUgBWwGjfzNo06NNNGGyQ1Min8ayRPmCmFldbi3pLt9Xk5UyMtt8m6CStt8Um91Cix5jrwrXK2rWGyl1SGsS7Rrln4LhzMEg2eNVPJIwesCpO2eLXp1MeFr8ESlwAMfR1Vjww8zbKpKeCZl1EWk3tt9apzsgSDmM3rZOiC_vEuHbTknt6DPXmUam5quhPhMpJAOSXOXlvAwp1A8KHGGzbyEUjkozDPiUeuH4C3rBwR$wCKl2Qk93LjE_ERUIDe6XxRpEkAjl9fIAYt2_1aAjFtY5jHy6QLpNuFPpotbP$sogf7_wFRXcZP8jGd3Rwud3d7Oh0QmD9TtQNfgcL$XkZTJGiXRTQOkAlk253eaED40utL$x0VJsKbnraxNlECMoNWaW7MgwH7m4WtF7B128AJxku$v30yf5fGyaJX2kcVN5hDkAPbkffbeA$$BPckfTBxZ6RrBeai6fDHSNZXB_o6d2Mj9X0_9f_Ekx3wiltx6m1DEAMF3c4rUCsdtVG2se7Xgk3TpGCWzRxPagVFIDD9Ckm$89xWPNHIohflmoc6lPZwBKExy24DrzIXeWBC53z_ULJPB62U7g5HGQdv7SGAh6PTKMQKCo5Qacp2MczppQaq14w0vTErTo21IewJBZ8d_61F2oO$O3pVIaF$tgU4MnD9ILGyRDwiQFZgSMB1fzQus163nkZTJGiENQL1WAsOcvw8xhH84yxP22ulOIqLcoBBJUkwD$AQo5PVHC8aDmBNp6UoD7kGXjq_149JPcIbhurqcWSBlPnszvjq08N5BNi2uxutxx2eQUhvdYNEA21VLHMS2rYGZpv0v4KWpbZpCcWdegHrFgtMwQ17b9k6MnD9ILGyRDrRyY4jr8utiP$VvKYnouw3hPkz4ydb8e_LUuwxiltx6mZljhLKwjBvCSYfYafpv6ox$_Jj3WSr9qaG3L2kVJnV$QShblUAiFykSHbC8pPzWrDhkkaR4shbROqd9Wblr2kj142XTI7zOm_DEObt5QERjMrDapw23skYTtaicFrYId$KUMRXCqfZPMohVBYXbbiIKSZQ0xTCcGVhjmbZagirTEKLO0zXIkQhvz2vvy48JzjyVv9NVWSFucG1HwegfcN1Z0Pgp1BSCKYnpjouiDm8Op7UwInluUL$b7Xo267_wonFvrw0C$iHdmCDB$qRKICDjOWn4FGAzmSyPi4Opj0OzOqmvytZ2kJZxMsIrtHnIco9B6I_tgLn0QtPtSWlRG1jHmCakuzqmed5OGJ7jEpBqYCzDfNE6U3Y5W0S$1EuhO$W0Shsy$qkaXzVcdVPMH4qUzJgvy48Jzj2HNVepldT7qPq7IYk1ph8VjzEUeigaGtQr8WqF99kDZxRo$9BD7yfAmIx3H4nLxaCd1LZhfcL9vm6YZUG4wlT7Z2IUfcechFv8HHJMLJ7oMvJjy1BHUAyJais1CBC4qZ9Zw7Pdyml5QVrvgT5bGqQer9OiyJ99myBTOEzzfHeATZwMkDBS2Nd7LWN92_R9p9RqIiDDfAcs5XfjWUDlP5auJpFoqEkFZl683F7xUChzNqMqPTvh4Yy5PUMMPXbmQOTaWKJBpQwMX_W_ZdyYCnBMahZiw4L59KXZTYW7$b7Oq11IewJBNw9JaiXOIFHFKumlmcKD$pFgCXaYaedhhoO8Ecr9Pmcm1Kg28BwaLpAoxLhyIazrtFuP$XAIaIzcEo17HMTfn0knvCCFIM6oDpAKlFhEGvLuBWe0BBHAnJvXrIqItxO4hNl3643CQarbZw138DzcW6evLYYgr5HaMXn9SmidIuXAUh9JPcu6RFBWims6gL2a_Z9t2yBVl6yAkv9LGMDtfT5Wjt_FbtG8RjAOOJI46gHd9bjzGeyNHP$DGIVTDud9yqeZzYUN3eUc4HfokwePvkeURtXfPkQ3Vqo69NM8BJNYCGXaaXHwq0YpFSSiUZjp0ic__5pkR5i6PLdeqnu4CR99VaqrfjJyKuMWo7XtKGQ2Iewx74qrxz6kapoifca7jGskyv1wz59K_k4DVxjlggcfBp12CWA6vnbWwQWPRd9ydN3s8WUF9WF3pg0gREsM1bvC_6z$oOE$rdWuekRDxO0PbvIZvBaS6ivBPMUN3tnYOA3R10lP6pXn02FWs8XPZ3Iitr3ookIr8MduBZtICKr6IXmgTXHzO_LuJpFoq9fL2lKoAXkuxsbP90M$pptoeP2iDi1AOYpZe3BEEN7_uTv8XZm_9PbugglFUfXK4zT4kx3KCPhvE2dvJPevFXwoySh5GESR7_YyYm5UyMtt9n8gz3PWKJ$XFxCQrLnKMmGn5He044pjOseH$fQg8hf7i1djuwkkmN7gL5nasMxx1c2Gg6LZYGFJJQ0$3FMUTMD910UAx7PAoCo4Uw4$AQcvhs6Un5VO8gOoKuADWuCdXfsUCPTJLPG6j3f26RrBeaj3b97NJMSm4uPr06TvHmk5X5a4nhnvRFlM0um9d1YYzNyapr3J6md5wdP7yGtfdcYSEqQqCRijpr_cXdvKapqspcEtIoEnp8eK2eAc3KTYXO7xhYuXLLSSNCuS$QfzDaQYwHlmimULzcDZv8Ul5NmeuUs88JVdT4wSw7VexJd2yEsGacp1B3iaEq1JXsGc3$KkGjBRdbT3qcKmzSpFd64L1Vl6EA_tvdHgEZh4YyTTrZ3TbuCSUSC4e8NnCi8hj7tPr$KgyyjjP1OwVyUyXb0YFfvLlkgSFqYJ9xqCoTZZ6aAQpz8H91oYLD1yM3x$45$tfMyUuDKWetbcoAf3OccbYL2Z9hKSgNMAveFn6LYZfhqSPiidVW8tf0Wpr2_wz59K_$7IA8uiDmVJ3wGzndPCeKl6A95ADLPaEDYaXRUUAo9h_4RtFki1TxLmq8BAsT1kOk0PtHoo0iBTuDDKVlxE00Ulp07vokTtPs_DWuCdXfFWmuy5GWi$nnFOWWSTVKqS$DYxPpKKfKi$Fe_vwoYQ0Je9lHw2GrKvQent6Jbp8ysY9h8Wp1A4vfKwRt6Qg1t2Znw0FRC3nN5co6LcyEdVmJVdh$gSHpRvMc5f9mslJ$cEBUUPHIG8iCRyY4jrB$Rc7LUap0IWrfs8YtDnptRJwTju0HWq4RHW1BHJbcZDoK$eM0n1eM7b9V5YzTvSUoSrPks6Rew8THTl286FP31hHc6NRo1Lbyo0awA8HRXJ1U6Vh7KbxDcUj3aos6K33$jNe_GHayGhbqPhu2LbMOM0cxRim5VrIEV6QfrASJD4_h6SsIf5Tyw6N3rAPUgofSyNlGlJpQWqD1Nb284DFKUanTZuxrykmU8X5QYwzt_AIXFGSqDdv2750raFgAc9BW0iT5c3Uiu38ztjg6rlry14ziLvOm3CQarbesGh$IYccTHyX_W_Zdnt4mBYcbXcfnr0gf_0IJGwV1iKl$L016GMZF31yGsaTQSQV34pZlDpaPJ96YMVdS4yVv6cfdkSCvmiaZ1CI7tte2PlBVsIg97pCdt$IcjpgG_lbNGeeiofT4bxGOlBZ20HjLiw75KeuF54Kmxw0olOI_Q1DXuKiB9VvSis3N2qkU5lIasFj7eenJdxKMUkmYV1pOah6c2bdoEsDn7DUKQEzg6YtKsKvzOwa_ZjVXY7pdHoMpIsMz3W4mCp$ptw4$dNA2snBzrs7fNqyEhj0Oi71UoIXakabIG0WBRyY4jr3sZ7jKuPn19BA5qeOFbE2231siT4XyHWZhlwaXfzPlvx$rhP0T$T26G$e8gDi6MaljjaHsW6p$H8vXBsQuOgz5763mYG5P13_hFo6g395DKdFi4iik$v3jU$nx7Ycwkt5FWGPn3C5tqJpEqTBrcsUF1rdCVf39ByeLBqVFxk0gT3cEuOxZ7oyDre4X$W6eHPoeGkBLpy2wqqllhkGw1xhYWBdFcq1$5ESctdm_X_HfzOIbzmJxVAKsXDxdsyEFTUE3g4lVB_GfL8rJuWp359JzkF1kWE3NnpkUKiyHNmEe99SsV7XsAB$4EKXDCIdfttoiJjO8qdvaKPLA4wtJz0odV0HnCiIUiJxULH98cSRRTn5Iq5HwAJME$usmnH95AyeNDrDmuHl9ggtPnGOhfckoNrUAMUvPrOQEzh6Ko2_3AMUjRGObimkbZFqWuCWiajx5M6z7MVbbUU1V_Ci9h9kozR_Rr9MgXJ6eSCUlEoIv$JsKrMcjnhimS7vCOvV1go3fAe5Nkqwv$jQEZnKyWBLuWRFykSHbC8pPFi4KVeeWJC6aJ7tk4pdllfWH$d5Yt0EOfPyKd$33oiNrR4oSDT5seSEi6FZeWWY4oYDzfSkonlQucw6RoEc53qGqJpPxaicRFm4eoBf3aaM3l8KmztvdUNLFGmfduBHIA3raDi$Nh607Zq0SbfcZ7cOsGPj2SoFBGg$9Xgr1reBfKyGMj9X0_5Xu4Ufs4R7xP0On8X$PwwJnZDpOqEWckhUMA5VHC862oLdrARJD6$ticSPrt_kdIArLdp_yAxdE51vuMD5u_cKvRwT5fKUnPyKwHg4GNTGsiNdC8DJRXOyeGf4WljmbDzmeSNntvgM3v6Qs_FYwEfZsEvY1Pp4CGB8rdLAUCnA6mBriqz4GBnNraO8$L42xvfK_LVn6WsJFvGfDaw1trrhV4IrT1isCqbNw6FNbhq2CTDIjr88_00oVBam4RtFkiI7qcK9TH0gdfdiGUtLlGGyaxDWyAJRGueRJ72S8AxdKA6_zRhs0tXRGA0zPFNB64gFmGfxF4ACKB7$_STPGysXEqSb$Ln9ecVTNOumz92kgBfzIPfyKe3zfGs9FTjbS5naSGBbnu_nNDsUt$OsGnnZGyLXz42pkI1nTisHnmy9FE3uZ5YrD4763rZFk9Vot17K0Pp$JJFwkawS0NLEIPbjyguKfp3C4sWJIclp7eQD_qMg1PfyKe3z4SrCemgdbZFsRl3Gb$Lok2hJem8B5ooZ1Lc6YvLjCAFlKjEqM$7lbKuAKZZreiirNh$YAkPZ5jUG8e1FB$uYVXVa8o4FFzZEgOfryu2zwvzz4gPXRLLNFpSpNLbXaghnpyaIetxjN6cOuJiqyzz08CN1n9QWK0nJ7jEMhx3EUgzlv9YySabR$RyEo8Pi4OpjjLsCGCD$3rYDd1a$VxUWGtGw4SjpdJ4cRLB8aKUXQI3rSe$Hc0Mpl5j1Sw6INIC$qkaXznhcKwhTlLUcWQP1lcYQPtlvliiQ8lCezBRJA81$vwQ35vjc8mO2Vgep$vqllhkGIPQaYOwZFf3MVdeYVXVa8w55A_aFnUmIdn1pTSWWdDvDQSCqX$l0Y011GNZhweSuDNF$qQIlFiCVWSbpzE_qIfrlXO0wcDRsCQgr5HaMEk7LH5_eaIxBe0Sl7RsmmOvFJFG26jFi1LRXsGc3$1hEcigjXdDua6k_Da0OtrYBhuOQYYVPMOMR$htypdJ7oApXByC8wXPpJh0KXLM6sV7oYE1JhhaIk2Rb158I0dDubN5wEwidZd4Oaont0meZZVY4x8CyeV5o8k6NJYs6TJxSe69C_meZZVY4_w5vODvHb4r0wqqt$3EutCOG43nc4oIo1$GcuH97g7RnDVnvupbM5a8eFLpNyKa$Rz7A2e6fzaGudrohRuewIYlv8FRZoWKm5F7tiIAg9lvyJYs6TJYsT1Xr7OSVSB$lcyfTC1ZDcCWlyuqfTKG87bNUKDGBB7AiXXj0AHJDzkHo7XtKGVvV6kAVpx14zsVDteuR931ypV3c0Lehpt2ifn5Qjw$yunT9g1TrKIZ$dGoFhzGSTSFwgM9R0migWP3d9Xq9KJNNU4AUhjT5oG0A2X5bCInLC0iO_StAMPIGABhhmltjZItRuMfXaYYTTPS_q$vswX7VtKQczCWm7zAUw2JbNE$vX9g1NctDVum1N5dCgw9EKJ4wibzeUWcbTE1jFgxHZyq$LtQtEat10_sfEuUBNsWMH9pN_Ml0BAEELxqu8PfoppeM1eBUsAbVi4eFk7Vmxz0zgSA$JwigfaUFuX2Ndopvx4idj$PftyuoYBk9f5eg$VBud9bxFVXWRA_kbxnplR$aGfzA8MND9nYOA3Rvs$24$nT5b2Teu4N9JZyMsIrthQ8Zn7VNas4PDOwFhru2qaHtQvQ0YBJoOyVtKorx_sfNqCqN$ZEOwYJ5zni63xkMCpS_ZDpWiGwjX9fr8USPIAxbHuaCx9fHzTDky01HTE2pd3iQ4r5ZQ6tf9Y2DL9wz59K_08PhVI6kAYAKTTLFKUanTy6ObppVKAYvHTTPbiu0FzTuIPJLP2kN3Smpnt0EOfPKlpzv5_oLpP2mQBR51fOAgAZo07Ftc5rWGyl1hgeJnN$8YuxvcE75$0WKFC_eTBxX5MYdpYC7736eTdWKOE$lCSqFlBkmb1T7Ik6GLPAkZTJGiMPCwrjHd0Qqy$0mWNJBAeFBFzqS5pFcx9PVZA31xySkx70iWMjLvAMH7GHNPYAdfmu2nZI4EUtHTagjrv4kAXtwmkkF1lAWbbv4KWpb4Udh$566pJxeDtTAMjXbRG3eAZyHMWcpVbz1CQMI7oS$RvDVUbnv8sg6RbTD2eWvZ9SgdVes0H1tLiuoaR3zO4i1HgxHZyq6gwHhpxypfO8bz46Pn5WQQvfMuLdr4BE1vje2yxqsj9m8INWSWcVD2yolB_uzhWH3d6aljpxscTPHGkNTisurqhR7kFWs8XPQm17RWdllL3pGe7hBouOAeDrBXmrvsibZTU_dbUC8raKAe$B5tkMHHDGoTTO86rcOGm9NJ7ILTXiMo9VYOMMxZ8m5LUNBGQ3weHuPsBSXUWUZ7OalxlYSAm2bDnScb9uYEm_HIW82eL59kO_htCoa5Qs_HGOZp$I4FRitBC8pP7ukWPnYKBysT$GSu0_x$gC$thc0qwibXhEjBYo5TnC6BjCWy59ygWPNHIo429H1mFfGq46BHOaixfl_EWm9tjDsGh4CZo6MjZq4VhfYVF71Z4iTVj_Kc$ttKWt$_AIbOqMgEVh_Mg5$4ftBHdogOI2rjXSs29F2eM6UrJWffRIshbROqmpcgEzcuHTXrsoT3wskjBy2tdVP6eGOhukhR3ywqrL8G7vxlUqLoGbuGa$v6ev5XaUM6nYLD1yMsxwYHpDtq6737EQYnVJi$x_qYWBn6Mk8LDMak$lvnFGG2qicBjzVXgZk_ATFIc_HbdQSu2CsDVWSfx9UIPr06SadH6tfJwcEzBiY7dNzFMdcp5JeSewLGC3dY9hK1pXMgHDuUCyKh91dq6KfTNsFHQMAE5ZyW9gGoRZ_kDdH7BOh3NoilBPdwsu2pR1VuNuU0fn2i8a5FVt5$kdE3zpmCkrsWHrHzQas4346_rnfe6jjVH9yMzFn12IyKIB934aFNex477xfJvQj5Pqkk5Mu$C2_ihllsSjnmt$zd6l6hLxeqIuf9b0ZBlQaqfOmFXh5G88A2c9S1hH_AXLID1lNsFZryx$$6ibfvAKWXTF2gDi$Nh60Db9oKo9OadZQ7vdSmM4sSIe5Immstxxf4pdNEaH95phJv5OhjqgMA1zrqIIOPTTBc3LVqDUq6VNXp9Jjx1pieClEi3Jc_IjdfBe8aqymhfFqLrEf9b8AcKkFp$AHNMMsZAfvMuMx$BtU8k33E2ySOkUSpIsMz3RxVtVxFFMWI3mSBoU6r3cE1X4dBJeWUPAkYL_iM7N$yWHjTAkJi1BJKB7$_SBHPZgedQ9jFgxHZyq_OdBi4TgpnjYDzfSkD1jKC1jQxOgw3266Dpn4_5tyztlXEqMm5COWlTSoAZu6IOPJ9tWxRtQSmKjQ3b5Vq2CEBwkULhE6sXSJ3nPyOm0B8A8Dnmk4HZn6wqDTVjncb9uhZNIiEGDD9pAZnt8Rp7YSS3az74CMJ5zNtImBh7giGwV7hzyzpXQOD7zwM6zsomMxd$JMaZLOWalPBWYQVFFzOr7HczPnGEb1b4aCNFzuUKu9SazRrMMXCWw6YhbhrwzraFoDj9ik8tDm_V_Qiy$xqhMvX5mwL7xmZJvTq4HSRIE65ZJJ8HOSMEvT_TmxBNgSRlx2Pk08E7veLsFj7ee0j1YkDbt7JMLF_fAmIx3SC_nT3d7Un$21smcZ$jhUbbVNBsT$Mfo0ARB8Qaf_CKQSLAwV0NpBgeBq6UewELHJuSo8Zd0UuPPWE$eM0n1eMCoZvVXfmdZXLC80$TIEI65fTj3OTdpryx$$6iTbiZhXKAiyGOmjmSTZbkMpry6w_qbzYoJvR4CjJ1gK4BCloUGqfZPMopwgW80c5hemmhiltx6mow3$pooU6T$IOctDVumRnKj712prS9Vx9do5TnC6Bm_IOknlS4yg4Jip8YuLHQuBPt28zjjIqCbm4RtFki1T1Xo5PIHvd7ukWPnHHA3Z5c6eg0xycMuhZNIiHM4uUKtBhCc_KZcaPJ96YHBHOXWPFvTzPmv7HYILZzPkyDOMCyfCqO3DgI6xhR1azGYejaWONrhggii7f1b7HQg50aTRLMsgbYK_pfKiwKjBb66U$X5dlyonYWJp9hFgAc9B0W8hFXasWckolUI2vFp_EQjVW7pRAO$hVE_vKOYU3zcA$vli8ifPGwSEpDjXSPBrgXTLKoeddffCk2MlnvAWoB3Fm0JjrgXZR$YrDd0UuPPnIqOwmjiWC3xe2Ik9f5eg4dBnL280urR7xaw6Z5Z8CeDpR1DUORGI9j7jKpNtUa2fHxZacZaOSLxN$e9lHw2YBrXBOWZeqrZ7tcQA1NH4sjbGYl04Pp9cYsJnHlnicbbOo7Wi9h9koAfAWk7XmiUSRIE65ZPOOQQ0h$Sh7OMAAD64_$VAL93lU8XrPQMAfmy4J1Yk2HXZK6wjbPKkGFB5hXDby3FTgyAVJiBJXXaYFtl4KSFfu7Rh2u7RtEchhQ4_lR$EhDhGKX7VtTnsrxjebdbgE656ygZTCewOuFh3YWfIay6v1ugApT9XuPoGgBBUycItOnCWfheXE0kZtUGEIB0oS1SuDKWetb4Gaajt7_lXuLRdbclz7O8DewvnaO9nT4Qa0HFQgs9xuLRdbpXMxnQg$EchuAOjXj$IOMVfRCj9e7HKetBRoei9MUfqgPP5j4cv$LcyEdVf9Oozx9zscMxT2iI$BlP4YuPx9JCG5jb3cDvXGU_qP9g_Qu9FRP3kCYBvZKa_$ZDqHX1MGFHzvyjZLEcI5wa6pXmCXmqnrdI5zni6E3wcAvfwOl065BE9958gbbu6CHE8sW7i1RnEAVvcIoKet2881maKBXzyraQCmFjusy4$lcYQPt3ytdF2kS0GbeuEWvomghBTgslRF5S4ewvwmUNIIEHpZigjndCoQ0ERledFCECHrBSifPHBpCq1KGI6A9DDKwIbtseYU$Z4ebZcZfgmoxZIVRUOScivbf2QVNNQYcnREQOMP5tnCuWj0y_ot17K0PjmkqybVLk6GQfXVcow9tzOovpzoUzl6Zfrp2MczpyGmIj3KXiieQBkMwblCqeXL0b2RmzA797Cmdft7OUYVN1jEb1Pus7ZBqPxPlw7E6$gQ6vBeYgfbN4fEg3EUD8$lR0Z0PbifhC$jKp7SadaPJiHtLes08A1qR7Ij_HLQJAxc5f9msKxZDr2LHJ7B4g6kL1fOcF$bN7gCVXpcggW2ZCwaLbH3qLxZ9Yw3xx_6AL$q97B17vP4Uq9c8cBFS2Qow8LIKOQAh6esLvP06OyfvFafp$iKq$n8b6iEt$FuKtDRQWSaOBM1LlIwU9JhS2jPg117$74kEwS1hH_AJB_oRf2URfpYNrPlM2gPdQJrTtX0CESfx9UIk9PkoeZdG$Nr5Tt4JdtE4IY19ASvsS8cKt7DVm6OnfKg8Xx7$02fMi8MrPvWc4aJhJ6PLNBF8kAoGnNvYgNAc8S0PVRZXXKygvS4eJTPzmCX7u933rtkI5mWlAVs68D3pY7a6a9DcLxElz1HW7pvpgV5b6Qls2AP7DLiiyniGwM2Znr5KeuF5KeIpCg4bb_SDuR3dIS1bKq6JaeyqvXFwRlK_aHToS_W6So1NHO2oV2O$hJ2G2yiRrMek6GLPAkQ9zjawRPYfgcTCrNm$JZwmiBaigpbU6gU0JrADUq6VNe_hLrGcv45_lbNGe672iCtBwbAf0FUcdQI61R8049ED3oV4bw7Pdymt9d6Wt4BILC3mHtP2AbBzsZDmAcu8D8847fUUgw49B6tV3cxLh84JjJwVwNhqw_vgJ1hSiFztwscLxQvCVYgkvZWeyHWejhfWArIqItxIqYHwa4Qnx45_lbNGeBBQXWN9uU1Qh1Jiad7oTzLgw532pfRKiAB6mGxiU9lBXly45urFtSo6KUZWN2oUHZDvqOCY4TmmpswZIgN9ti06uplnlqOk$FCyyeG$pZQmVJQWUPG_X4Tkt5FWGPdBd$DMPONCrZD_EGD9oEoOZnyABwaI2jT9yEI2icCk$BOksvxgCsZL3uCugbXAkBlsurddOB$kYI9V0_572zoU2YuBKYizje0YyIZhnrofKtV3kuR35xnP4d0HQeo3ps4UvKfosvoYLwNvNy0FxmaHvLl6HSRIE65ZQMbovtqgM_VyDZrE6NjMyRtBOVVOJ_kQDV4qmkaL3fBd_BMLPPW6$3Jfx$54whQvTzag3dN8pRwQk3BJG3xlg4fhtxwsgQ4f4TgyAVJIkO_Mm3DIL80ql9uq043$pZDoDcp5JeSbxbBZzGQVYLSmKm7RdlnkXItX7q0bFCB_iLuIhw98CCJveieaaK4jTnIMWdajkqs$dgivtdI1ZLhEKWfeps_2DtvGcfVTT8g$dt6LSQVflyedn7Ur15C8xhLuHl9ggzR5mOxLiu3CE9seMBV6uszsjV8j7Yry8GVDEQoBcw9CD7zkPqKmJLgAsaEoHfz9EF4_qnDysy361zjT7b0PYmwBx_Cc7Zo_14znY5jHy6ZB$qgN_RsFQbaRNFEiTPXknlkcHzazEasF7IeAjEi2JPQPCzYCoVhAqgeR6nJpEZkjnnuUNRhyCGKI4pU3SwKrr8cG3gDgzDSTMKEFlYWgrw_zncFoDcp5JeSRtSxOn_AIC0nO4iRf2uyseM5i6Zov5DSADT$On3GHB3qR7lUiF$_zpY8lAVjyz35EsfvIhw0873vfEf9b8Axe2dv1LdI_lQElBMpLpOSozpWI0r9JRE_W4kwCLRUSTZbkMNTzHTZfifS9gGoRZ2eMmJtz2wvhL7ysif5JSaP1nZZyLckzHXukvQe173BH8iO0PqH20KYffTGuV4Pp9cYrFh3SUmjX8j3V1tDazMmCe5Z2Y2Z5eDoO$dGwaGygO7tePC$peVME71yuqonmnoqtx06CJSblx7KXm0HZr9To8VtGf3UxOsMsMuR$a9mN$fIzfL2mWG1qcRG5yqibWRNKIHGGIKOSXdkt$9KViv8Mdu9Sl4Pm7WvJkAd5Z3Z4c9jItU6kO2kQ7raK5seRF4wnfYSMIECA88ABEIMRYfnw4FRer3JZq6Qj2Ol7WvJlBe6b5b6eCmLxYApT7pVCxgQBylZNC3wpicWSPNLKLMORVafmu1ALWiv7Mct8Qk2Nj4SrFf4X$TyS_W2cAmM_cGwbH_iQ9vhTG4vlcTMFA52$zyyz_048DJRYhr0BObp3Jar8Sm6SpCb$QsJnGlFmJrP$aBpR5lR6pXG0mYL8zoeVNF94$yvtttuwz16BHOXgq$BOcq4KcuCVqAXuHh5XzQvNtOwT0bAnN$eIyeL2nWG1pcQE4wogZTPLIGEEEGILPUbhox5FQdp2GWn3Mf_If0NmAb1TxQvQxT0a9lMzcFvaFzgP9whUH5xneVOHC741$z__037CHNUdlv4GSgv8OfxEYtCZxKj7Z$SwOtOwS$Z8kLzcGxcI0kTD$mYMA0sjcUOJFC98889BEHMSYgoy6HTgu7NduAUo7TqCb$PrIlEjCjFnKvU5iKzdI_gO7sdO9ymbRIA2ysnjgeddefhkpu_5DMWht3GVk_GYr8Sn8VtGg5WyQuOvQyV3eErT6lP4mTBwgRD$pdSJA2xrlgcaYXXYZcfkpw1AJTeq1FTj_FXq9To9XvJj9b2W$V$X3dBmN_bEtYEweM5rcPB_pfVME81yurpoonprtx16DKTdny8Lap2IatAVqAXvIi6Y_SwQwQyV2dCoQ2iM1iP7raL7viWLC2wpidYVSQQQQRUXbhnu09JUgs4JXn2KdwFbxJh4UvLoGkDjFnKvT3gIwaEwcJ1mWH2qeSH8$tmgbXTRPPPQSVZejpx3CNYkx8Nct8Qk2Mj3QpDd2VxQvPwS_Y6hIvYAqUAtaJ2oZM8zndTLD61xtpommmoquy17EMVep_ANcq4LcuBVqAWuHh5WzRwPwRzX4eErS4kO3lSAueOAylZOE5zsmgcYVUTTTVYbglqx4CMYjw7Mbr6Oh$Jf0Nl9Z_QtLpIpLtR$aBoQ3jN2kR9uePC$odTJB2xrmiecaZZZbdhlqw2AJTfq1GUjzEWp6Rn8VuHi7a1W$V0Y5fDpQ1gJzeJ0jSBxjVI7xneVNHB730_zz_$249EJQYhr0BOcq3Jbs8Sn6SqCc0RtKnGlFmIrP$bBpS5lQ6pXG0nZM9_pfXPIB62_xvuvwy$37DJPXhr0CPds5MdwDXsCYwIi6X_RvOuPxU1cBnO0gJzeL2nWG2qcRF5ypibWRNJGFFFHJMRWcjqz6HTer3IYo4Nh0Lh3RqEf4X$TySzV2cBnO$dHxcJ0kSByjVI6xneWPID8520$00259DHNVdmv4GTgv8OgyFZtCZwJi6Y_RvOuOwS0a8lLybFvbH_iRCzlXK8_qhZSMHDA866679CGLRXenw4FSes5Lbs9Sm5RoAZzOpFiAf9gClItT3gIybHyeL4pZL7wkZPG70vplgdbaZabehlrx2AJSdp$DRgwASl2Mh1Nl7XxMpGkEkFnKvT3gIwZEvbI0lVF0pcQF5yqjcXTPNLKKLNQTXdjqy5GQco0EUk$HauDYvHf3TvLoGlFmHqNxW6jL_dIzgN6rbM8xlZPF6_tnidaXVVVWZcgkqx3BLVgt4IXm1IbuCXsDayLmBd4Y1X2a7hFrS3hL$gM3nVF$mYL9_qgYQJD9520$$$147CHNUclv4FRet6MdvCVqAWuGf3VwNrKpJqMvT1dDqS5lQ6pXG$mXJ6wlaRIA4$wsqonnoqtx06CKSbmx6JWl_FWn4Oi1Ol7WwLnFiBhDkGqP_aCqT6nTAtbK4rdPD1siYQJC730zxxyz$37CIPXgq_AMZo0GWo5Oj2Om8XxLnEiAgAhDlJuT4hJxbFxdK2nYJ5ujYOF7$vplhecabbdgkou_5DMVfs2FTixCUm3Ni2QoBb0SvNsMsNvR$Z9lM$fJ_gN6rbM7viWLB1vnhcXTRPOPQSVZdiov1AJUft4IYp4Mg_Jf$Ml8YzOrKoIoLtR$bBoQ2iM1jQ8ueOA_ncSJB2xrmhebZYZacfkov08HQalx7LZp3KexFaxHg3TuKmDhAfAiEnNyY9oR6nTAudN8viVK9$tldWRNJGEEEFHJNSYemu1BMXkyAQgxEXrAWtEd1RtJmEiCjEnKuU4hJycHyfN5qbL7vjYNE5ztniebYXXXYbeimsz4DNXiv6KZp4LdwFawHf2StIlChAgBiFpNzaBqT7oUBudM7ugTH6yphZTOJFDBA99BEHLRXemv3EQcp1GWn3Mg$Kh3RrFg6Z1W$V0Z6gEqR2gK_gM3oXH1pcPE3vnfYSMHEBA899BEIMSYgpy7IUhv7MduATo7TqCb_PqHkChAhDlJtT3gJycHzfN5rbN8xkZPG70vqlhecaZZbdglqw18HRcnzBPeu9Rj0Lg0Om9Z_QsKpIoKsPzX7jLzcGxdL2nXH2rfSI7$skeYUQNMLLMOQUZfls_7ISdq2GVm1JcwFbxJh5VwMqHlFmHpNxW6jLzdIzfM4pZK6viXMD4yrlgcZWVUUVXaejov19ISeq1FUk_FXr9UqBZyLmCe5a3Z4c9iGsS3hK$fL2mUE_lXK8zpgXPJD841$__$036BGMUbjt2DQdr4KcuAUo7UrDc0RtKoHmHoKtR1cDrT6mR8rZH1nZL8yodVNG94$xusrrsux$39EMUdmy7KYn0HYp6Rl5SpCc0RuKpHnIqNwU3fGuXBsXEygP9wiUI6ypgYSMHDA865679CGLRXfox6HUhv8NevCVq9VsEe1SuLoHmGnKsP_aAnQ3jO4nVEzkVI4vjZPHA3_vqnkjiijloty29HPZkv5IWl_FWp7Rm6UsGg5X_SwQxS$Y6hHvW8nS7pXF_kVH3tiXNF70wqligedefhkosx29IRcnzAOds7Oh_JezKh4UuKmDiBhCkGqP_bCqT6nT9tbL5sfSG4wneWQJEA7533458BFKQXfoy7IViv8OfwDXrBXuHg4VxOrJoJpMvT2eFtV8oT9raI2oaMA_pgWPHA40ywutuuwz05AHOXgq_AMao1IZr8Sn7UsEe2UwNqJoJqNwV4gHvYBsXExgP9vhTH6xofYQKFB8644557BEJOVclu3EQes5Kbt8Sm5Qo9YyMnDg7c5c7fDnMyaCrVArXEyhRCznaPE5zrlfZVRPNMMNPTWbhow3DNYkx8Nct9Rl3Pl6VuIj9c4Y2Z4cAkJvV6lO3kR8sbL6ugUI8_rjcVQLIFEDDEHKOSYfmv2CNZlzBRhzFZtCYvHf3UvLoGlElHpNxW7kM_eJ$iP8tdPAymbQH91wqmifdcccegjosy2AJSdo_CQfvASl3Ni2Pn9Z_QsKoHoJrOyX6jLzbFxcJ1mWG2qdRH7_skeZUQMLKJKMOQUZflt$9KVhu7Mcu9Sl3Ok5TsGh6Z1V$V0X4eCoO$eHxcJ0kTD_mZMB1tkcWPKGDA8779BEIMSZgpy6GTft6MduBUp8UrDc$PqHkChBiEnLvV5iL_dIzgO6rcN9zncRIA2ysokgeccdehkou_5DLUfr1EShyDUn5Ql6TrFf3VxPtNtOwT2dCoP2hM1jQ8tdO9ylaPF6zsmgcYVUTTUWZdiou$8GQanzAPevASl4Pk4SqDd2TwNrLrMtQ_Y8kN$eJ_hO6rcN9ymaQH80wqlgdaZYZacfjou$6FOZkx7LZp4MeyHcyJh4UvLnFjCiDkHrP$bDrU8pWCvdN7vhUJ7zqibUPKGECBABCFINSYfnw4FQdq3IYo5Nh0Li3SrFg5Y0U_U0Y5gEqQ2gK_fM3nWG1pbPD3vmdXQKFCA8789BEINTZhpy7IUgu6McuATn7TqCa_PqGkChAhClItS2gIxbGyfM4qaL8wjYOE6_tnjfcaZYZbdglqw07GQamx9Ncs7Pi$Kf0Nl7XyNqImFmHpMwV4gHwZDuaH$kUF0pcQF5yqjcWSOLJIHHJLOSWcjr_7IUgu6Lbr7Pi0Mi3RqEg5Y0U_U_W3cBmN$dGwcI$kSByjVI6xmdVOHC8410$0136AFLRYhq_9MZn0FWo4Oi1Ol7WvJkBe6a5b7gEoNzbDrVAsYG$kUF1qeTJA1wpkfbYWVVVXZcgmsz5DNYkw7Mbr6Ng_Ie_Lj7XyOrJnHnIqNxW6jL_dHzfM4oYJ4sgUJA1vngbXTQONNPQTXchow2BLWhu6KZq5Nh$Kf0OnAb0SwNsLsNwT1dDqS5lQ6oWEzkUG2sgWME60wrnkigghikorw$6EMWgs2FTiyCUn4Pk5RpBc0SuMqJpKsQzY8lMzcHxdK2mWG1qdRH6yqjcWSOLJIIJLORWbhow2CNYlzBQfwBUn5Qm7VuIj9c4Y1W1Z6fDpP1fIyeK1lUDzkWJ7yofWPJE9532111358CHNUclv4FSgv8PhyFYtCYwIh5WyPtMsNuR$Z9lN$eIzeL2nWG1pcRF5xphbVQMJHGFFHJMRWciqz6HSfs3IYp5Oh0Mi3SrFf5Y0U_U_W4dCoO0eIydJ$jSBykWJ8zofXPJE963101136AEJPXeox6IVjxBRi$HcxGczMl9a$TwOuPwS$a8kLzbFwbI$jTD_mZNB1tkcUPJFC98789CFJOTair_8JViv8OfxDWrAWtEd1RsJnFkFmHrOyX8lN0gL1kSBwhSD0qfVLC5_tolhgeefhjmrw07FOXiu4HVk_FXq7Sn7VtFg5X_RwPvQzW4fErT6lQ5nVCxgRC$odSI91wqlgdbZYYZadhmry4CLWgt4HVk$GYr9UqBZyLmBe5Z2Y2a6gDpP0eHxcI_hQ9wgSE2siYQIC61zwusstuw_16BIQYis2ERfu8Ph_HcxHe0OoDe5Y1W0X3cAlLyZBrU9rYF_jTE0pdSI90vpjfbYWVVWYbejot_7FPZkw7LZp4LdyGbxJh5VwNqHmGmIrNxW6jKzdIzgN5qaL7wjYOD4yrlgcZWVUVWYbejpv19JTep0ETj_FYr9VqBYxLmBe5Z2Y3b8iGrR2gJydI_hP7tePC0qgXOG94$xusrrrtvz16DJQZjt2ESgv9Ri$JdzJh3SsGi8c4Z4b7gFpP$dGvZFxdL3paL7wjYNE5zsmiebZYYZbeimsy3CLVgs2GVk_FXq8TpAYwKk9b2X$V0Y4cAmMzaDtYDwdM5qbN9zndTLD71yuronnnpruy17ELUeo_ANbq4LcvCWrBYwJj8Z0TxQxSzW3eDqQ2hK_gM3nWG1pcQF4xphbVQMJIHHHJLPTYdlt09KWjw9OewBTn6Ro9YxLnCf7c6d8gDnLxY9oS6oUBveO9wiWK9$tldYTOLJHGHIJMPUagnv2CNZmzCRhyFYsBWtFd1RtJmFkElGpNxW6jL_dI_hO5qbM8ylaQH80upkgdbaZabehlrx2AIScmyAOdt7Pi0Kg0Nm8YyOrImFlGoMwU4hIwaEvbI$kTE0ocQF5yqjcXSOLJIIJLOSWcipy4EOan$DTj_HatCYvGf2SuJmDiBhCjGqO_bDrU8oUBudM6uhUI8_rjdXSNKIGGHIKNRWbhox4FQcq2HWn3LeyHe_Ml8Z$RvNsMtOxU3eEsU7nS8rZH1nZL8xmbSKC60xurpnnoqsv_39GNWgq$CPes6MfxFavGd$OoDf6Z2X1Z5dBmMyaDsWCubI1nYJ5ujXOF7$vqlifdccefimqv07FOYjv6KYo2KcvDYuFc_NoDf6a3Z4b8hGrR2gJ_eJ$jQAwhTG3ukaSKD73$xusssuwz16CJQZit2FSgv8OgyGawGd$NoCe5Y1V$W1a8jIvW9oS7pWEyiSD$ocRH80vojeaYWVUUWZchms_6FPaly9Ncs7Pi0Kg1OnAa$RuMqKqLtQ_Z9mO1hL1jQ9uePB_maPG7$tnieaYXWWXZcglrx2AKUfr2GVk$HZtBWsDb_NnCf5a3Z3b8hGrS3hL_fL1kSCxjVI6wmcUNGB62_ywvvxz05AGMUdnx7JXl_EVm2Mg$Mj5UuJlBf8d7fBkItS2gIxcHzgN6sdOB_pdTKB3ztpljhgghjlptz3AIRblx7LZp3KcvDYuEc$OoEg7a2Y3b7gFqQ1fIycHzgO7teQD1rhXOG83_vsqoooqsvz28EMVeoz9MZo2JatAUqAXvIh6X_RvNuOwT1bBnO0fJ$gN5pYI4rfTH7_skeYUQNLJJJLNRVbhov2CNYkxAOewBUo6SoAXxKlBe5a3Z4dAkJvV7mP4lS8tbK5tfSH6ypgYRLGC976668BEJOVcku1DPcp2HXp5Nh0Mj5TtHj9c4Z3Z4cAkJwX9nR6oUCwfPAykYMC2vngZTPLIGFGGILPUahpx5FRdq2HXo4Ng_Jf0OnBb1TwOtNuQzW4fFrT6lR6oWF_kWI4uiXNF7$vrnjhgghjlnrw06EMVgr1FTiyEVn4Oj3QoBa0RtLqJpLtPzX6jKybFwcJ1mWG2qdRG5yphbVRNKIIIJLOSXcjrz6GRcp1FVl0HatCXuFd1RsIlDiCjFoMwW6kM$fK0jQ8tdOAzncSJA2ysnigdbbbdfinsy3BJTeq0EShxCTl3Oj3Pn9YzOqHmEkFnKuT2eFtW9qVCweN8viVJ7zpgZSLGCA76678BFJOTahqz8JWjxAQhzHauDZwIh5VxOrKpKrOxV3fFsU7oS9saI3pbOB$qgWOHA4$yvtttuwz15AGNVeoy9LZn1HZs8Sn6SqCb$QtJnGmHpMwU4hIwaEvbI0kUE$naNC1ulcVPKFC98789CFJOVbjr$AMZm_EUl1JdxHd_NmAb2UyRwRyV2bAmM_cGwcI$jSCzlXL9$qhZSLGC95323458CHMTajs$AMZm$FWn3Nh0Mj5TtIj9c3Z2Z4dBlKxYApT8pWEyhRB_maPE5zrlfaWSQPOOPSVZekrz5FPbn_CRhyDVo7SpAYxLmCf6a4a5dAkIuU5kN2jP6qZI3rdQE3vneWPKFB865668BEJPUbjs0BMZn$FVm3Mg_Kh2RqDe5X$U_U0Y6gFrS4jN1hO5pYI2qdRF5yphaUPLIFDCCDFIMRXdlu1BNYlyBRizGZtDZwIh4VwMpHmGnIrP_ZAnP2iO3mUCxhSE1rfVME60wroljiijkloty2AIQalw7KZo2JatAUpAXvIi8Z0UzSyT0Z7iIuV8nS7pWEzjUG2sgVLB4yrlhebZYYacfinsy4BKUfq1EShxBTl2Nj3QoCc1UxPuOvQzW5gHuW9oS8qXG$lWI5ujYPH92ytpljhhgiknrw07ENXht3FTixBTm3Nj3QoBb0SvMqKqLsPyX6iJxZDtYFygQ9wiWJ8_rjcVQLHECBBCEHJNSZfnw4FRer4JZq6Pj2Ok5TsGh6Y$TySzV1bAlMzcFvbH_iRBykXK9_rhZRLGC8644457AEJPVckt1CObp1HYp5Oj2Nk6VuIj9c4Z3a5eCmLyZBqT8pVCxgRC_nbQF6_smgbXUSQQPQSUYciov2BLWjw8NduATn5Rn8VuIj9b3Y1X3b8iHsT5jM0gM3nVF0nZMB0sjaSMHC85333458CGLRYgpz8JWkyCSj0IcxHe$NmAc1UyRxRzV3dCpP0fJzeL2mWG0obPD2uleXRMIECAAACEHLQVbir_8KWjx9PgxEXsBWtFd0RsJmEjDkGpNxX7kM$fK$hP7tdOAzodSJA3ytokhfdddfhkpu_5DMWhs2FTizEWp6Rn7UtGg5X_RwPvQyV3eErS5kP4mTBwgRC_nbRG8$uojfbZXWWXZcgkpv09ISdo$DShyDWp7Sn7VuHh7Z0UzTzV2b9jKwYBrWBubJ3paM9ymbSJB4_vromlklmosw$5BIQakv6JXm$GYr8So8VtGf4VyPtMtOwT1bBnO1gK$hN5pZJ4tgUJ90umgbWSPMMLMOQUYekrz6GQbo$DTj_GYsBWtFc$PqGjAf9fBjHrP$cDrV9qXEyhRC_mZOD3wngaUQNKJIIJLORVbhpx4EPbp0FVl0JcwFaxJh5VxNqIoHoKtR_Z9nO1hM2kSAwgRE1rgVMD5_vpligfefgjmrw06ENXhs2FTixBTl2Lg0Mk7XxMpGlEkFoLuT3fGuYCtZG_jTE$obPD3wogaVQNKIGGHILPTZfmv2CNZmzCRiyEWr9VrCayMmCe5Z3Z4dAkJvW7lO2jP5pXH2pcQE3wmeWQKFB866568BFKPWemw4FRes5LcuATn6SpBazOqGkChBiEnLwU4hKzdI_hP7tdOAznbRH91wrmifeccdfhlpv$6DMVgr2FUjzEWp7Sn8VuHh5X_RwPwRzX5gGtU7nR6pVDxhSD0qeUKB3xrmhebZZYZaehlrx3BLVgs3HVl$GYr8UpAYwKkAc3X0W1Y5eCnN_cEuZFxeM4qaM8xlbRH93zuqmjhgghilotz3AJSdo_AOcr5MexGawHf2SsIkBe7c7eAkJuU5jM1hO4nVE_lXJ7xneVNGB620zxxxy_159FMUcmx6JWkzCTk0KezJg2RrGi9c5a4b6fCnMzaDsWBtaI1nXI5uiYOF70wrnjhfeefhkotz3BJSco_AOcs6OgzIdzKi5UvKnEjBhBjGpO_aBpS6nT9tbJ3rdPD2ulcVOJEA7543347AEJPWenw5GTgu7NdvCVq9WtFe2SuLpHnHoKtQ$bBpR4lQ6pXF_kVH4tjYPG93zvromkkklnquz3AIRalx8LZo2IasAUp9XvIi7Z0UyRxS_W4eEqS5kO4mTBxgQC_nbPF6ztmhcZXVVVWYadint_6EOaly9PevASl3Nj3QoCc1TwOtNuQyV3eEqS4kO4nUCyiTF2rgVLC4zsnjgdcbcegkotz5DMWgs2GUj_EVo6Qm5TrEd3UxPtNtPxU2dDqS5kO2lSAvfQB_ncRH80vojeaYWVVWYbfkqw1AJTeq1FTiyEWp7To9XwJk9c2W$V$X4dCnN_bEuZExeM5rcOB$qgWOG93_wtrpopqsv_28FNWgq$CPds6MdwEYuEc_NmBd4X$V$W3b8jJvW8oS7pWEziTF1qeUJ91wpjfbYXWVWYbejou08GQamzAPeuASl3Nj4RpCc1TwOtMtOxU2eDqS5kP4mTBwgRC$pdTJA1vpjeaYWVVWYbfjou$7FPZlx9Odt9Rk2Ni2QoBb$RvMrLsNwU1cCpQ2iM1jR9uePB_odTKB4zupligfefgilpu_5DLVgs2FUjzDVo5Pl6TrEe3VyQuOuPxU1cCpQ3iN2kR9udN8xkYMD3xqjdZVTQPPQRUYdiow2BLWhu6KZp4NfzIe_Ml8Z_QtLqJqMuR$aAnP2iN2lSAvfRC_odSIA2xrmifdbbbdfjmqw18HQbmy9Ncs7Oh$Je$Lj5VwLoFkDjElIsR0dEtWAqWDwfO9xjWK9$skcWQLHEBAABCFINSYfnw4FQdq2IXo3Ng$Kh3RqEf5Y0V_V0Y5fEqQ2hL$gN4oWG0oaOC2uldWQLHDB9899BDHMRYfnx5GSft5Lbs8Rl4Qn9YxLnDh9e8fAjGpO$cEtXBtaH$lVG2qeSI80unidZWUTSTUWZdiov19JUfr3HWm0IauCYuFd0QrGjBf8e9hFoMyYAoR6nTAudM7vhVJ8zqiaUOJGDBAABDGJNSZgox4FRes4Jaq7Pj1Nj5TsHh8a2X0X3b8iHtT5kN1jP5pXH1oaNB1tjbUOJFB8644568CHMSZis0BNao1GXp5Pj2Ol7VvJlBe6b5c8hEpP$cFuYDuaI0lWH3sgVLB3yrlhdaYXWWYadint_6FPZlx9Ncs7Ph_Je$Mk7XyOrJnHnIqOyW6iKycGxdK3nXI4sgVJ9$umgbWSQOOOPRUXciow1AKVgt5KZp5Nh$Kg1OnAb$RuMqKrNvT1dDqS5kP4nUCxhSE0qfULC5_upligffefhlpuz4CKUeq0EShxBTl2Mh1Ol8XxMoEiBgCjFpOzZAoQ4kP6pXG0nZMA_qhZSMGC85323358BFKQYfoy7JVjyBRi_HauEaxJj7Y_RvOuOwS$Z8kLzcFvaGzhQAxjWJ8_qhZSMHD9643457AEJPVdlv3EQdr4JZq6Qk3Pm8XwLnDg8d7eAiFpP$cEtXCtZG$kVG2rfUJ90voidZWUSSTUXafjpw2BKUgs3HWm1JcwEawHf2StIkCg9gBjGqP$bDsV9qWExfO9wjWK8_qhZSMHDA86679BFJOUaiqz7JWjxAQhzGauDZwIh4VxOrJpKrOwU2eErU7nR8rZH2oaM9zoeUME83_xurqqrsvy05CJSakv4HUixBTl2Mg0Mj6VvKlDhAf9hDmKvU5kM0gM3mVF$nZMA$riZSLGB6310$0258DIOVdmw5HThu7NewDWrAXvHg5VxOsKpJqNwU3fFtW9pVBubK4qcOB$rhYQJD830zxxwxz037DJRZis1DQdr5MdwCWqAXuHg5WyPtMsNuR_Y8jKybEvbH$jTD_lZNB1tleWQKHDB99ABEHLQWdlt1BNZlzCSj_HavFbyKj6XyPsLqKrNwU3eFsV8oUAsZI2oZM9zodUMF83_xusrrrsvz17DKTbmx6JWl_EVm3Ni1Ol8XxMoFjChCjGpNxX8mP2jO5oWF$mYL8zofWNGA50zxvvuwy$27DKRZis1COcq3JZr8Sn6TrDd1TvMrKqLsOxV4gGuW9qWCveN7ugTH6yogZSMHEB86678ADGMRYfox6HSgu6MdvBVp9VsEd1SuLoHmHnJsQ_aAoR4kQ6pXG$mYK7xmcTLD72zwtrrrsux_39ELTcmx6IVjyCSk0Kf_Ki4UuJlCg9f9hEnLxX8lO1iN3mUCyiTG3siYPHA4$xtrppoprtx$4AHQZju4HVkzDUm2Mh0Ml7WwMoGkDiCkGpNyY8nP3kQ6qYH1oZM9zpfXPIC730_yyyz$15AFMUcmx6IWjyBSj$IcxHf1PpEg6a2X1Y3c9kJwX9oT8qXFziSD$ocQH7$tnidaXUTTTUWaeipw2BLWiu5JYo2KdwFbxIh4VvLnFjCjEmJtS2fHwaEwcJ1mVG1pcRG6zskeYUQNLKKMNQUZflt0AKWiv7Mct9Sl4Pk5UtGh7Z0U_U$Y5eDpQ1fIydJ0jRAwhSF3tiZRJC72_xussstvy05BIPZju4GUiyCTl3Nh1Om8XxLoFjBhCjFpNyY9nQ4kQ6pWG$mYL9zpfWOHB62$yxwwxz038DJPXgq_9Mao1HZr9Sm6SpBa_PrImFkFnKtQ$bCpS5mR7rZI3qbOB$qgXPIB72$yyxxy_149ELSaju3FSgv9PgyFZuEayKl9a1VzSyS_W4eDpQ2hL0iP7rbL6uhUJ8_skeYTPNKKKKLNRVZfmu1ALXkxAPevATm5Qm7WuIjAc4Y1X2a7hFrR3hL$hN4oWG0oaNB1tjbVOJFB8544569CHNTajs0BNZm$EUl2Lf_Jg1PoCd3W_TzT0Y6gFqR3hL$gN5pYI3reSH7_skeYUQNLKJKLNQVagnv2CNYlyBQgxDVp7TpAYyMnDg8d6c8gEoNzaBpS7oUCvdN7ugSG5wofYRMHEC98789BFJOUbjs0BNZn$EUl1JdxGd$NmBc2VzRwRyU1a9lM_cGxcJ0kTCzkWK8zqgYRMGC97543469CHMTais0BObp1GWo4Mg$Mi4StHj9c4Z2Z4dAkJwX9oS7pWDxgQBzlZNE4xqkeZWSQOOOPRUYcjqx4EPan_CRgxCVo6So9XxLmCe6a3Z4b8iHsT4jN1jP5pXG1oaOC1tkcVPJEA7544468CHMSair$9LXkzCSj_IcwGd$NmAb1UxQvPxU1bBnO$eHydJ0kSD_lYMB0sjbUOIEA755679CGLRXenw4FQdr4Kas9Sn7TqDc0RsJnGlGnJsP_aAnP3jO3nVE_kWJ6wmcTLE82zvtrqpqrtw_39GOXgr1ERgvARj1Kf$Mk6VvKnEiBhCjGpNzZAoR4kQ6qYI2pbOC0sjaSMGB62$zyyy_159FLTblv5HUixBS} Library ACP_Styles Title: ACP Styles Description: To set navigation and node styles and options for Analytica Cloud Platform (ACP). Most of these styles and options are available in ACP, but not desktop Analytica editions. Author: Max Henrion, Fred Brunton, and David Paine, Lumina Decision Systems Date: Mon, Jul 11, 2011 10:16 PM DefaultSize: 48,24 NodeLocation: 168,640,1 NodeSize: 72,24 NodeInfo: 1,0,0,,,,,,,,,1 DiagState: 2,2,4,1463,570,17,10,4 WindState: 2,121,149,681,532 DiagramColor: 55705,55705,55705 FontStyle: Century Gothic,15 OutlinerState: 2,38,26,450,600 Att_PreLoadScript: {!40404|FreePassObjectCount JOQSqwy5jj2MNB76AAHtFYqpbdKuFv6EVNHQRXZiKGJOI41$T8jAOPbpiltx6mj5F8_xxW8j7FawgINXdqWVv50utvWAnDNk6pDKWetbhtCx51iK36c3LLYn5LiYhFbgir1ocNzHoKp9Qm2RJpIj7Qklnb8eFwgM9R5rcAcDr2IVXHEDHHO_jrlfFAiRrWGyl1VF8Hp7RRmirfku_BtlvCzrrnUDVtELBM8FRZoWQcxgkXFaGgv38Z3V24U_dg29BqqY5ZyhVF6SB$xogwGlesphA0azkaMFdII1hpR0Rdw8Pl1QIrLtNUWQFIQUfJ8KVQc5vSwexKaiyfku_BtlvCvxiOhLjw2X5bCIa8ryOZfTRaIHLLS2qu5gcGl9U9vbOg8un2g0BHkGkJNd9qtHPHJWILTXiMOWnSSBrDlSkHvT8IrTDuaeo5oqbH5fOiHxXEQ_eReARdQaSdt3M8JZxEYE0xGwJdYqq7VpE8Ec7u2_wYV3qG$cIwftS8yiDmKkqvkib5oApXByCrZPAy6Ml962mUudzeO4t9qaSF3FXyOzxhRtTExjRGaH6sgW2Wj5EANftC0CUvkuniaA2Qv8ewu7Rh2u6QtLyykWWuQ7Pya8pzJxij7JVNPcORZdoSIQhzocCocCY39Yp9RqiyInWeYS6sRAdI2kXpbaTEm5jrvtnplkoovVWWhgWQF5RzXuw9ELXfucUiDa0Otrva9cqrlrsYRAxnZSqTNLE8dCeyOfVQVflyeUgBWwGjfzNo06NNNGGyQ1Min8ayRPmCmFldbi3pLt9Xk5UyMtt8m6CStt8Um91Cix5jrwrXK2rWGyl1SGsS7Rrln4LhzMEg2eNVPJIwesCpO2eLXp1MeFr8ESlwAMfR1Vjww8zbKpKeCZl1EWk3tt9apzsgSDmM3rZOiC_vEuHbTknt6DPXmUam5quhPhMpJAOSXOXlvAwp1A8KHGGzbyEUjkozDPiUeuH4C3rBwR$wCKl2Qk93LjE_ERUIDe6XxRpEkAjl9fIAYt2_1aAjFtY5jHy6QLpNuFPpotbP$sogf7_wFRXcZP8jGd3Rwud3d7Oh0QmD9TtQNfgcL$XkZTJGiXRTQOkAlk253eaED40utL$x0VJsKbnraxNlECMoNWaW7MgwH7m4WtF7B128AJxku$v30yf5fGyaJX2kcVN5hDkAPbkffbeA$$BPckfTBxZ6RrBeai6fDHSNZXB_o6d2Mj9X0_9f_Ekx3wiltx6m1DEAMF3c4rUCsdtVG2se7Xgk3TpGCWzRxPagVFIDD9Ckm$89xWPNHIohflmoc6lPZwBKExy24DrzIXeWBC53z_ULJPB62U7g5HGQdv7SGAh6PTKMQKCo5Qacp2MczppQaq14w0vTErTo21IewJBZ8d_61F2oO$O3pVIaF$tgU4MnD9ILGyRDwiQFZgSMB1fzQus163nkZTJGiENQL1WAsOcvw8xhH84yxP22ulOIqLcoBBJUkwD$AQo5PVHC8aDmBNp6UoD7kGXjq_149JPcIbhurqcWSBlPnszvjq08N5BNi2uxutxx2eQUhvdYNEA21VLHMS2rYGZpv0v4KWpbZpCcWdegHrFgtMwQ17b9k6MnD9ILGyRDrRyY4jr8utiP$VvKYnouw3hPkz4ydb8e_LUuwxiltx6mZljhLKwjBvCSYfYafpv6ox$_Jj3WSr9qaG3L2kVJnV$QShblUAiFykSHbC8pPzWrDhkkaR4shbROqd9Wblr2kj142XTI7zOm_DEObt5QERjMrDapw23skYTtaicFrYId$KUMRXCqfZPMohVBYXbbiIKSZQ0xTCcGVhjmbZagirTEKLO0zXIkQhvz2vvy48JzjyVv9NVWSFucG1HwegfcN1Z0Pgp1BSCKYnpjouiDm8Op7UwInluUL$b7Xo267_wonFvrw0C$iHdmCDB$qRKICDjOWn4FGAzmSyPi4Opj0OzOqmvytZ2kJZxMsIrtHnIco9B6I_tgLn0QtPtSWlRG1jHmCakuzqmed5OGJ7jEpBqYCzDfNE6U3Y5W0S$1EuhO$W0Shsy$qkaXzVcdVPMH4qUzJgvy48Jzj2HNVepldT7qPq7IYk1ph8VjzEUeigaGtQr8WqF99kDZxRo$9BD7yfAmIx3H4nLxaCd1LZhfcL9vm6YZUG4wlT7Z2IUfcechFv8HHJMLJ7oMvJjy1BHUAyJais1CBC4qZ9Zw7Pdyml5QVrvgT5bGqQer9OiyJ99myBTOEzzfHeATZwMkDBS2Nd7LWN92_R9p9RqIiDDfAcs5XfjWUDlP5auJpFoqEkFZl683F7xUChzNqMqPTvh4Yy5PUMMPXbmQOTaWKJBpQwMX_W_ZdyYCnBMahZiw4L59KXZTYW7$b7Oq11IewJBNw9JaiXOIFHFKumlmcKD$pFgCXaYaedhhoO8Ecr9Pmcm1Kg28BwaLpAoxLhyIazrtFuP$XAIaIzcEo17HMTfn0knvCCFIM6oDpAKlFhEGvLuBWe0BBHAnJvXrIqItxO4hNl3643CQarbZw138DzcW6evLYYgr5HaMXn9SmidIuXAUh9JPcu6RFBWims6gL2a_Z9t2yBVl6yAkv9LGMDtfT5Wjt_FbtG8RjAOOJI46gHd9bjzGeyNHP$DGIVTDud9yqeZzYUN3eUc4HfokwePvkeURtXfPkQ3Vqo69NM8BJNYCGXaaXHwq0YpFSSiUZjp0ic__5pkR5i6PLdeqnu4CR99VaqrfjJyKuMWo7XtKGQ2Iewx74qrxz6kapoifca7jGskyv1wz59K_k4DVxjlggcfBp12CWA6vnbWwQWPRd9ydN3s8WUF9WF3pg0gREsM1bvC_6z$oOE$rdWuekRDxO0PbvIZvBaS6ivBPMUN3tnYOA3R10lP6pXn02FWs8XPZ3Iitr3ookIr8MduBZtICKr6IXmgTXHzO_LuJpFoq9fL2lKoAXkuxsbP90M$pptoeP2iDi1AOYpZe3BEEN7_uTv8XZm_9PbugglFUfXK4zT4kx3KCPhvE2dvJPevFXwoySh5GESR7_YyYm5UyMtt9n8gz3PWKJ$XFxCQrLnKMmGn5He044pjOseH$fQg8hf7i1djuwkkmN7gL5nasMxx1c2Gg6LZYGFJJQ0$3FMUTMD910UAx7PAoCo4Uw4$AQcvhs6Un5VO8gOoKuADWuCdXfsUCPTJLPG6j3f26RrBeaj3b97NJMSm4uPr06TvHmk5X5a4nhnvRFlM0um9d1YYzNyapr3J6md5wdP7yGtfdcYSEqQqCRijpr_cXdvKapqspcEtIoEnp8eK2eAc3KTYXO7xhYuXLLSSNCuS$QfzDaQYwHlmimULzcDZv8Ul5NmeuUs88JVdT4wSw7VexJd2yEsGacp1B3iaEq1JXsGc3$KkGjBRdbT3qcKmzSpFd64L1Vl6EA_tvdHgEZh4YyTTrZ3TbuCSUSC4e8NnCi8hj7tPr$KgyyjjP1OwVyUyXb0YFfvLlkgSFqYJ9xqCoTZZ6aAQpz8H91oYLD1yM3x$45$tfMyUuDKWetbcoAf3OccbYL2Z9hKSgNMAveFn6LYZfhqSPiidVW8tf0Wpr2_wz59K_$7IA8uiDmVJ3wGzndPCeKl6A95ADLPaEDYaXRUUAo9h_4RtFki1TxLmq8BAsT1kOk0PtHoo0iBTuDDKVlxE00Ulp07vokTtPs_DWuCdXfFWmuy5GWi$nnFOWWSTVKqS$DYxPpKKfKi$Fe_vwoYQ0Je9lHw2GrKvQent6Jbp8ysY9h8Wp1A4vfKwRt6Qg1t2Znw0FRC3nN5co6LcyEdVmJVdh$gSHpRvMc5f9mslJ$cEBUUPHIG8iCRyY4jrB$Rc7LUap0IWrfs8YtDnptRJwTju0HWq4RHW1BHJbcZDoK$eM0n1eM7b9V5YzTvSUoSrPks6Rew8THTl286FP31hHc6NRo1Lbyo0awA8HRXJ1U6Vh7KbxDcUj3aos6K33$jNe_GHayGhbqPhu2LbMOM0cxRim5VrIEV6QfrASJD4_h6SsIf5Tyw6N3rAPUgofSyNlGlJpQWqD1Nb284DFKUanTZuxrykmU8X5QYwzt_AIXFGSqDdv2750raFgAc9BW0iT5c3Uiu38ztjg6rlry14ziLvOm3CQarbesGh$IYccTHyX_W_Zdnt4mBYcbXcfnr0gf_0IJGwV1iKl$L016GMZF31yGsaTQSQV34pZlDpaPJ96YMVdS4yVv6cfdkSCvmiaZ1CI7tte2PlBVsIg97pCdt$IcjpgG_lbNGeeiofT4bxGOlBZ20HjLiw75KeuF54Kmxw0olOI_Q1DXuKiB9VvSis3N2qkU5lIasFj7eenJdxKMUkmYV1pOah6c2bdoEsDn7DUKQEzg6YtKsKvzOwa_ZjVXY7pdHoMpIsMz3W4mCp$ptw4$dNA2snBzrs7fNqyEhj0Oi71UoIXakabIG0WBRyY4jr3sZ7jKuPn19BA5qeOFbE2231siT4XyHWZhlwaXfzPlvx$rhP0T$T26G$e8gDi6MaljjaHsW6p$H8vXBsQuOgz5763mYG5P13_hFo6g395DKdFi4iik$v3jU$nx7Ycwkt5FWGPn3C5tqJpEqTBrcsUF1rdCVf39ByeLBqVFxk0gT3cEuOxZ7oyDre4X$W6eHPoeGkBLpy2wqqllhkGw1xhYWBdFcq1$5ESctdm_X_HfzOIbzmJxVAKsXDxdsyEFTUE3g4lVB_GfL8rJuWp359JzkF1kWE3NnpkUKiyHNmEe99SsV7XsAB$4EKXDCIdfttoiJjO8qdvaKPLA4wtJz0odV0HnCiIUiJxULH98cSRRTn5Iq5HwAJME$usmnH95AyeNDrDmuHl9ggtPnGOhfckoNrUAMUvPrOQEzh6Ko2_3AMUjRGObimkbZFqWuCWiajx5M6z7MVbbUU1V_Ci9h9kozR_Rr9MgXJ6eSCUlEoIv$JsKrMcjnhimS7vCOvV1go3fAe5Nkqwv$jQEZnKyWBLuWRFykSHbC8pPFi4KVeeWJC6aJ7tk4pdllfWH$d5Yt0EOfPyKd$33oiNrR4oSDT5seSEi6FZeWWY4oYDzfSkonlQucw6RoEc53qGqJpPxaicRFm4eoBf3aaM3l8KmztvdUNLFGmfduBHIA3raDi$Nh607Zq0SbfcZ7cOsGPj2SoFBGg$9Xgr1reBfKyGMj9X0_5Xu4Ufs4R7xP0On8X$PwwJnZDpOqEWckhUMA5VHC862oLdrARJD6$ticSPrt_kdIArLdp_yAxdE51vuMD5u_cKvRwT5fKUnPyKwHg4GNTGsiNdC8DJRXOyeGf4WljmbDzmeSNntvgM3v6Qs_FYwEfZsEvY1Pp4CGB8rdLAUCnA6mBriqz4GBnNraO8$L42xvfK_LVn6WsJFvGfDaw1trrhV4IrT1isCqbNw6FNbhq2CTDIjr88_00oVBam4RtFkiI7qcK9TH0gdfdiGUtLlGGyaxDWyAJRGueRJ72S8AxdKA6_zRhs0tXRGA0zPFNB64gFmGfxF4ACKB7$_STPGysXEqSb$Ln9ecVTNOumz92kgBfzIPfyKe3zfGs9FTjbS5naSGBbnu_nNDsUt$OsGnnZGyLXz42pkI1nTisHnmy9FE3uZ5YrD4763rZFk9Vot17K0Pp$JJFwkawS0NLEIPbjyguKfp3C4sWJIclp7eQD_qMg1PfyKe3z4SrCemgdbZFsRl3Gb$Lok2hJem8B5ooZ1Lc6YvLjCAFlKjEqM$7lbKuAKZZreiirNh$YAkPZ5jUG8e1FB$uYVXVa8o4FFzZEgOfryu2zwvzz4gPXRLLNFpSpNLbXaghnpyaIetxjN6cOuJiqyzz08CN1n9QWK0nJ7jEMhx3EUgzlv9YySabR$RyEo8Pi4OpjjLsCGCD$3rYDd1a$VxUWGtGw4SjpdJ4cRLB8aKUXQI3rSe$Hc0Mpl5j1Sw6INIC$qkaXznhcKwhTlLUcWQP1lcYQPtlvliiQ8lCezBRJA81$vwQ35vjc8mO2Vgep$vqllhkGIPQaYOwZFf3MVdeYVXVa8w55A_aFnUmIdn1pTSWWdDvDQSCqX$l0Y011GNZhweSuDNF$qQIlFiCVWSbpzE_qIfrlXO0wcDRsCQgr5HaMEk7LH5_eaIxBe0Sl7RsmmOvFJFG26jFi1LRXsGc3$1hEcigjXdDua6k_Da0OtrYBhuOQYYVPMOMR$htypdJ7oApXByC8wXPpJh0KXLM6sV7oYE1JhhaIk2Rb158I0dDubN5wEwidZd4Oaont0meZZVY4x8CyeV5o8k6NJYs6TJxSe69C_meZZVY4_w5vODvHb4r0wqqt$3EutCOG43nc4oIo1$GcuH97g7RnDVnvupbM5a8eFLpNyKa$Rz7A2e6fzaGudrohRuewIYlv8FRZoWKm5F7tiIAg9lvyJYs6TJYsT1Xr7OSVSB$lcyfTC1ZDcCWlyuqfTKG87bNUKDGBB7AiXXj0AHJDzkHo7XtKGVvV6kAVpx14zsVDteuR931ypV3c0Lehpt2ifn5Qjw$yunT9g1TrKIZ$dGoFhzGSTSFwgM9R0migWP3d9Xq9KJNNU4AUhjT5oG0A2X5bCInLC0iO_StAMPIGABhhmltjZItRuMfXaYYTTPS_q$vswX7VtKQczCWm7zAUw2JbNE$vX9g1NctDVum1N5dCgw9EKJ4wibzeUWcbTE1jFgxHZyq$LtQtEat10_sfEuUBNsWMH9pN_Ml0BAEELxqu8PfoppeM1eBUsAbVi4eFk7Vmxz0zgSA$JwigfaUFuX2Ndopvx4idj$PftyuoYBk9f5eg$VBud9bxFVXWRA_kbxnplR$aGfzA8MND9nYOA3Rvs$24$nT5b2Teu4N9JZyMsIrthQ8Zn7VNas4PDOwFhru2qaHtQvQ0YBJoOyVtKorx_sfNqCqN$ZEOwYJ5zni63xkMCpS_ZDpWiGwjX9fr8USPIAxbHuaCx9fHzTDky01HTE2pd3iQ4r5ZQ6tf9Y2DL9wz59K_08PhVI6kAYAKTTLFKUanTy6ObppVKAYvHTTPbiu0FzTuIPJLP2kN3Smpnt0EOfPKlpzv5_oLpP2mQBR51fOAgAZo07Ftc5rWGyl1hgeJnN$8YuxvcE75$0WKFC_eTBxX5MYdpYC7736eTdWKOE$lCSqFlBkmb1T7Ik6GLPAkZTJGiMPCwrjHd0Qqy$0mWNJBAeFBFzqS5pFcx9PVZA31xySkx70iWMjLvAMH7GHNPYAdfmu2nZI4EUtHTagjrv4kAXtwmkkF1lAWbbv4KWpb4Udh$566pJxeDtTAMjXbRG3eAZyHMWcpVbz1CQMI7oS$RvDVUbnv8sg6RbTD2eWvZ9SgdVes0H1tLiuoaR3zO4i1HgxHZyq6gwHhpxypfO8bz46Pn5WQQvfMuLdr4BE1vje2yxqsj9m8INWSWcVD2yolB_uzhWH3d6aljpxscTPHGkNTisurqhR7kFWs8XPQm17RWdllL3pGe7hBouOAeDrBXmrvsibZTU_dbUC8raKAe$B5tkMHHDGoTTO86rcOGm9NJ7ILTXiMo9VYOMMxZ8m5LUNBGQ3weHuPsBSXUWUZ7OalxlYSAm2bDnScb9uYEm_HIW82eL59kO_htCoa5Qs_HGOZp$I4FRitBC8pP7ukWPnYKBysT$GSu0_x$gC$thc0qwibXhEjBYo5TnC6BjCWy59ygWPNHIo429H1mFfGq46BHOaixfl_EWm9tjDsGh4CZo6MjZq4VhfYVF71Z4iTVj_Kc$ttKWt$_AIbOqMgEVh_Mg5$4ftBHdogOI2rjXSs29F2eM6UrJWffRIshbROqmpcgEzcuHTXrsoT3wskjBy2tdVP6eGOhukhR3ywqrL8G7vxlUqLoGbuGa$v6ev5XaUM6nYLD1yMsxwYHpDtq6737EQYnVJi$x_qYWBn6Mk8LDMak$lvnFGG2qicBjzVXgZk_ATFIc_HbdQSu2CsDVWSfx9UIPr06SadH6tfJwcEzBiY7dNzFMdcp5JeSewLGC3dY9hK1pXMgHDuUCyKh91dq6KfTNsFHQMAE5ZyW9gGoRZ_kDdH7BOh3NoilBPdwsu2pR1VuNuU0fn2i8a5FVt5$kdE3zpmCkrsWHrHzQas4346_rnfe6jjVH9yMzFn12IyKIB934aFNex477xfJvQj5Pqkk5Mu$C2_ihllsSjnmt$zd6l6hLxeqIuf9b0ZBlQaqfOmFXh5G88A2c9S1hH_AXLID1lNsFZryx$$6ibfvAKWXTF2gDi$Nh60Db9oKo9OadZQ7vdSmM4sSIe5Immstxxf4pdNEaH95phJv5OhjqgMA1zrqIIOPTTBc3LVqDUq6VNXp9Jjx1pieClEi3Jc_IjdfBe8aqymhfFqLrEf9b8AcKkFp$AHNMMsZAfvMuMx$BtU8k33E2ySOkUSpIsMz3RxVtVxFFMWI3mSBoU6r3cE1X4dBJeWUPAkYL_iM7N$yWHjTAkJi1BJKB7$_SBHPZgedQ9jFgxHZyq_OdBi4TgpnjYDzfSkD1jKC1jQxOgw3266Dpn4_5tyztlXEqMm5COWlTSoAZu6IOPJ9tWxRtQSmKjQ3b5Vq2CEBwkULhE6sXSJ3nPyOm0B8A8Dnmk4HZn6wqDTVjncb9uhZNIiEGDD9pAZnt8Rp7YSS3az74CMJ5zNtImBh7giGwV7hzyzpXQOD7zwM6zsomMxd$JMaZLOWalPBWYQVFFzOr7HczPnGEb1b4aCNFzuUKu9SazRrMMXCWw6YhbhrwzraFoDj9ik8tDm_V_Qiy$xqhMvX5mwL7xmZJvTq4HSRIE65ZJJ8HOSMEvT_TmxBNgSRlx2Pk08E7veLsFj7ee0j1YkDbt7JMLF_fAmIx3SC_nT3d7Un$21smcZ$jhUbbVNBsT$Mfo0ARB8Qaf_CKQSLAwV0NpBgeBq6UewELHJuSo8Zd0UuPPWE$eM0n1eMCoZvVXfmdZXLC80$TIEI65fTj3OTdpryx$$6iTbiZhXKAiyGOmjmSTZbkMpry6w_qbzYoJvR4CjJ1gK4BCloUGqfZPMopwgW80c5hemmhiltx6mow3$pooU6T$IOctDVumRnKj712prS9Vx9do5TnC6Bm_IOknlS4yg4Jip8YuLHQuBPt28zjjIqCbm4RtFki1T1Xo5PIHvd7ukWPnHHA3Z5c6eg0xycMuhZNIiHM4uUKtBhCc_KZcaPJ96YHBHOXWPFvTzPmv7HYILZzPkyDOMCyfCqO3DgI6xhR1azGYejaWONrhggii7f1b7HQg50aTRLMsgbYK_pfKiwKjBb66U$X5dlyonYWJp9hFgAc9B0W8hFXasWckolUI2vFp_EQjVW7pRAO$hVE_vKOYU3zcA$vli8ifPGwSEpDjXSPBrgXTLKoeddffCk2MlnvAWoB3Fm0JjrgXZR$YrDd0UuPPnIqOwmjiWC3xe2Ik9f5eg4dBnL280urR7xaw6Z5Z8CeDpR1DUORGI9j7jKpNtUa2fHxZacZaOSLxN$e9lHw2YBrXBOWZeqrZ7tcQA1NH4sjbGYl04Pp9cYsJnHlnicbbOo7Wi9h9koAfAWk7XmiUSRIE65ZPOOQQ0h$Sh7OMAAD64_$VAL93lU8XrPQMAfmy4J1Yk2HXZK6wjbPKkGFB5hXDby3FTgyAVJiBJXXaYFtl4KSFfu7Rh2u7RtEchhQ4_lR$EhDhGKX7VtTnsrxjebdbgE656ygZTCewOuFh3YWfIay6v1ugApT9XuPoGgBBUycItOnCWfheXE0kZtUGEIB0oS1SuDKWetb4Gaajt7_lXuLRdbclz7O8DewvnaO9nT4Qa0HFQgs9xuLRdbpXMxnQg$EchuAOjXj$IOMVfRCj9e7HKetBRoei9MUfqgPP5j4cv$LcyEdVf9Oozx9zscMxT2iI$BlP4YuPx9JCG5jb3cDvXGU_qP9g_Qu9FRP3kCYBvZKa_$ZDqHX1MGFHzvyjZLEcI5wa6pXmCXmqnrdI5zni6E3wcAvfwOl065BE9958gbbu6CHE8sW7i1RnEAVvcIoKet2881maKBXzyraQCmFjusy4$lcYQPt3ytdF2kS0GbeuEWvomghBTgslRF5S4ewvwmUNIIEHpZigjndCoQ0ERledFCECHrBSifPHBpCq1KGI6A9DDKwIbtseYU$Z4ebZcZfgmoxZIVRUOScivbf2QVNNQYcnREQOMP5tnCuWj0y_ot17K0PjmkqybVLk6GQfXVcow9tzOovpzoUzl6Zfrp2MczpyGmIj3KXiieQBkMwblCqeXL0b2RmzA797Cmdft7OUYVN1jEb1Pus7ZBqPxPlw7E6$gQ6vBeYgfbN4fEg3EUD8$lR0Z0PbifhC$jKp7SadaPJiHtLes08A1qR7Ij_HLQJAxc5f9msKxZDr2LHJ7B4g6kL1fOcF$bN7gCVXpcggW2ZCwaLbH3qLxZ9Yw3xx_6AL$q97B17vP4Uq9c8cBFS2Qow8LIKOQAh6esLvP06OyfvFafp$iKq$n8b6iEt$FuKtDRQWSaOBM1LlIwU9JhS2jPg117$74kEwS1hH_AJB_oRf2URfpYNrPlM2gPdQJrTtX0CESfx9UIk9PkoeZdG$Nr5Tt4JdtE4IY19ASvsS8cKt7DVm6OnfKg8Xx7$02fMi8MrPvWc4aJhJ6PLNBF8kAoGnNvYgNAc8S0PVRZXXKygvS4eJTPzmCX7u933rtkI5mWlAVs68D3pY7a6a9DcLxElz1HW7pvpgV5b6Qls2AP7DLiiyniGwM2Znr5KeuF5KeIpCg4bb_SDuR3dIS1bKq6JaeyqvXFwRlK_aHToS_W6So1NHO2oV2O$hJ2G2yiRrMek6GLPAkQ9zjawRPYfgcTCrNm$JZwmiBaigpbU6gU0JrADUq6VNe_hLrGcv45_lbNGe672iCtBwbAf0FUcdQI61R8049ED3oV4bw7Pdymt9d6Wt4BILC3mHtP2AbBzsZDmAcu8D8847fUUgw49B6tV3cxLh84JjJwVwNhqw_vgJ1hSiFztwscLxQvCVYgkvZWeyHWejhfWArIqItxIqYHwa4Qnx45_lbNGeBBQXWN9uU1Qh1Jiad7oTzLgw532pfRKiAB6mGxiU9lBXly45urFtSo6KUZWN2oUHZDvqOCY4TmmpswZIgN9ti06uplnlqOk$FCyyeG$pZQmVJQWUPG_X4Tkt5FWGPdBd$DMPONCrZD_EGD9oEoOZnyABwaI2jT9yEI2icCk$BOksvxgCsZL3uCugbXAkBlsurddOB$kYI9V0_572zoU2YuBKYizje0YyIZhnrofKtV3kuR35xnP4d0HQeo3ps4UvKfosvoYLwNvNy0FxmaHvLl6HSRIE65ZQMbovtqgM_VyDZrE6NjMyRtBOVVOJ_kQDV4qmkaL3fBd_BMLPPW6$3Jfx$54whQvTzag3dN8pRwQk3BJG3xlg4fhtxwsgQ4f4TgyAVJIkO_Mm3DIL80ql9uq043$pZDoDcp5JeSbxbBZzGQVYLSmKm7RdlnkXItX7q0bFCB_iLuIhw98CCJveieaaK4jTnIMWdajkqs$dgivtdI1ZLhEKWfeps_2DtvGcfVTT8g$dt6LSQVflyedn7Ur15C8xhLuHl9ggzR5mOxLiu3CE9seMBV6uszsjV8j7Yry8GVDEQoBcw9CD7zkPqKmJLgAsaEoHfz9EF4_qnDysy361zjT7b0PYmwBx_Cc7Zo_14znY5jHy6ZB$qgN_RsFQbaRNFEiTPXknlkcHzazEasF7IeAjEi2JPQPCzYCoVhAqgeR6nJpEZkjnnuUNRhyCGKI4pU3SwKrr8cG3gDgzDSTMKEFlYWgrw_zncFoDcp5JeSRtSxOn_AIC0nO4iRf2uyseM5i6Zov5DSADT$On3GHB3qR7lUiF$_zpY8lAVjyz35EsfvIhw0873vfEf9b8Axe2dv1LdI_lQElBMpLpOSozpWI0r9JRE_W4kwCLRUSTZbkMNTzHTZfifS9gGoRZ2eMmJtz2wvhL7ysif5JSaP1nZZyLckzHXukvQe173BH8iO0PqH20KYffTGuV4Pp9cYrFh3SUmjX8j3V1tDazMmCe5Z2Y2Z5eDoO$dGwaGygO7tePC$peVME71yuqonmnoqtx06CJSblx7KXm0HZr9To8VtGf3UxOsMsMuR$a9mN$fIzfL2mWG1qcRG5yqibWRNKIHGGIKOSXdkt$9KViv8Mdu9Sl4Pm7WvJkAd5Z3Z4c9jItU6kO2kQ7raK5seRF4wnfYSMIECA88ABEIMRYfnw4FRer3JZq6Qj2Ol7WvJlBe6b5b6eCmLxYApT7pVCxgQBylZNC3wpicWSPNLKLMORVafmu1ALWiv7Mct8Qk2Nj4SrFf4X$TyS_W2cAmM_cGwbH_iQ9vhTG4vlcTMFA52$zyyz_048DJRYhr0BObp3Jar8Sm6SpCb$QsJnGlFmJrP$aBpR5lR6pXG0mYL8zoeVNF94$yvtttuwz16BHOXgq$BOcq4KcuCVqAXuHh5XzQvNtOwT0bAnN$eIyeL2nWG1pcQE4wogZTPLIGEEEGILPUbhox5FQdp2GWn3Mf_If0NmAb1TxQvQxT0a9lMzcFvaFzgP9whUH5xneVOHC741$z__037CHNUdlv4GSgv8OfxEYtCZxKj7Z$SwOtOwS$Z8kLzcGxcI0kTD$mYMA0sjcUOJFC98889BEHMSYgoy6HTgu7NduAUo7TqCb$PrIlEjCjFnKvU5iKzdI_gO7sdO9ymbRIA2ysnjgeddefhkpu_5DMWht3GVk_GYr8Sn8VtGg5WyQuOvQyV3eErT6lP4mTBwgRD$pdSJA2xrlgcaYXXYZcfkpw1AJTeq1FTj_FXq9To9XvJj9b2W$V$X3dBmN_bEtYEweM5rcPB_pfVME81yurpoonprtx16DKTdny8Lap2IatAVqAXvIi6Y_SwQwQyV2dCoQ2iM1iP7raL7viWLC2wpidYVSQQQQRUXbhnu09JUgs4JXn2KdwFbxJh4UvLoGkDjFnKvT3gIwaEwcJ1mWH2qeSH8$tmgbXTRPPPQSVZejpx3CNYkx8Nct8Qk2Mj3QpDd2VxQvPwS_Y6hIvYAqUAtaJ2oZM8zndTLD61xtpommmoquy17EMVep_ANcq4LcuBVqAWuHh5WzRwPwRzX4eErS4kO3lSAueOAylZOE5zsmgcYVUTTTVYbglqx4CMYjw7Mbr6Oh$Jf0Nl9Z_QtLpIpLtR$aBoQ3jN2kR9uePC$odTJB2xrmiecaZZZbdhlqw2AJTfq1GUjzEWp6Rn8VuHi7a1W$V0Y5fDpQ1gJzeJ0jSBxjVI7xneVNHB730_zz_$249EJQYhr0BOcq3Jbs8Sn6SqCc0RtKnGlFmIrP$bBpS5lQ6pXG0nZM9_pfXPIB62_xvuvwy$37DJPXhr0CPds5MdwDXsCYwIi6X_RvOuPxU1cBnO0gJzeL2nWG2qcRF5ypibWRNJGFFFHJMRWcjqz6HTer3IYo4Nh0Lh3RqEf4X$TySzV2cBnO$dHxcJ0kSByjVI6xneWPID8520$00259DHNVdmv4GTgv8OgyFZtCZwJi6Y_RvOuOwS0a8lLybFvbH_iRCzlXK8_qhZSMHDA866679CGLRXenw4FSes5Lbs9Sm5RoAZzOpFiAf9gClItT3gIybHyeL4pZL7wkZPG70vplgdbaZabehlrx2AJSdp$DRgwASl2Mh1Nl7XxMpGkEkFnKvT3gIwZEvbI0lVF0pcQF5yqjcXTPNLKKLNQTXdjqy5GQco0EUk$HauDYvHf3TvLoGlFmHqNxW6jL_dIzgN6rbM8xlZPF6_tnidaXVVVWZcgkqx3BLVgt4IXm1IbuCXsDayLmBd4Y1X2a7hFrS3hL$gM3nVF$mYL9_qgYQJD9520$$$147CHNUclv4FRet6MdvCVqAWuGf3VwNrKpJqMvT1dDqS5lQ6pXG$mXJ6wlaRIA4$wsqonnoqtx06CKSbmx6JWl_FWn4Oi1Ol7WwLnFiBhDkGqP_aCqT6nTAtbK4rdPD1siYQJC730zxxyz$37CIPXgq_AMZo0GWo5Oj2Om8XxLnEiAgAhDlJuT4hJxbFxdK2nYJ5ujYOF7$vplhecabbdgkou_5DMVfs2FTixCUm3Ni2QoBb0SvNsMsNvR$Z9lM$fJ_gN6rbM7viWLB1vnhcXTRPOPQSVZdiov1AJUft4IYp4Mg_Jf$Ml8YzOrKoIoLtR$bBoQ2iM1jQ8ueOA_ncSJB2xrmhebZYZacfkov08HQalx7LZp3KexFaxHg3TuKmDhAfAiEnNyY9oR6nTAudN8viVK9$tldWRNJGEEEFHJNSYemu1BMXkyAQgxEXrAWtEd1RtJmEiCjEnKuU4hJycHyfN5qbL7vjYNE5ztniebYXXXYbeimsz4DNXiv6KZp4LdwFawHf2StIlChAgBiFpNzaBqT7oUBudM7ugTH6yphZTOJFDBA99BEHLRXemv3EQcp1GWn3Mg$Kh3RrFg6Z1W$V0Z6gEqR2gK_gM3oXH1pcPE3vnfYSMHEBA899BEIMSYgpy7IUhv7MduATo7TqCb_PqHkChAhDlJtT3gJycHzfN5rbN8xkZPG70vqlhecaZZbdglqw18HRcnzBPeu9Rj0Lg0Om9Z_QsKpIoKsPzX7jLzcGxdL2nXH2rfSI7$skeYUQNMLLMOQUZfls_7ISdq2GVm1JcwFbxJh5VwMqHlFmHpNxW6jLzdIzfM4pZK6viXMD4yrlgcZWVUUVXaejov19ISeq1FUk_FXr9UqBZyLmCe5a3Z4c9iGsS3hK$fL2mUE_lXK8zpgXPJD841$__$036BGMUbjt2DQdr4KcuAUo7UrDc0RtKoHmHoKtR1cDrT6mR8rZH1nZL8yodVNG94$xusrrsux$39EMUdmy7KYn0HYp6Rl5SpCc0RuKpHnIqNwU3fGuXBsXEygP9wiUI6ypgYSMHDA865679CGLRXfox6HUhv8NevCVq9VsEe1SuLoHmGnKsP_aAnQ3jO4nVEzkVI4vjZPHA3_vqnkjiijloty29HPZkv5IWl_FWp7Rm6UsGg5X_SwQxS$Y6hHvW8nS7pXF_kVH3tiXNF70wqligedefhkosx29IRcnzAOds7Oh_JezKh4UuKmDiBhCkGqP_bCqT6nT9tbL5sfSG4wneWQJEA7533458BFKQXfoy7IViv8OfwDXrBXuHg4VxOrJoJpMvT2eFtV8oT9raI2oaMA_pgWPHA40ywutuuwz05AHOXgq_AMao1IZr8Sn7UsEe2UwNqJoJqNwV4gHvYBsXExgP9vhTH6xofYQKFB8644557BEJOVclu3EQes5Kbt8Sm5Qo9YyMnDg7c5c7fDnMyaCrVArXEyhRCznaPE5zrlfZVRPNMMNPTWbhow3DNYkx8Nct9Rl3Pl6VuIj9c4Y2Z4cAkJvV6lO3kR8sbL6ugUI8_rjcVQLIFEDDEHKOSYfmv2CNZlzBRhzFZtCYvHf3UvLoGlElHpNxW7kM_eJ$iP8tdPAymbQH91wqmifdcccegjosy2AJSdo_CQfvASl3Ni2Pn9Z_QsKoHoJrOyX6jLzbFxcJ1mWG2qdRH7_skeZUQMLKJKMOQUZflt$9KVhu7Mcu9Sl3Ok5TsGh6Z1V$V0X4eCoO$eHxcJ0kTD_mZMB1tkcWPKGDA8779BEIMSZgpy6GTft6MduBUp8UrDc$PqHkChBiEnLvV5iL_dIzgO6rcN9zncRIA2ysokgeccdehkou_5DLUfr1EShyDUn5Ql6TrFf3VxPtNtOwT2dCoP2hM1jQ8tdO9ylaPF6zsmgcYVUTTUWZdiou$8GQanzAPevASl4Pk4SqDd2TwNrLrMtQ_Y8kN$eJ_hO6rcN9ymaQH80wqlgdaZYZacfjou$6FOZkx7LZp4MeyHcyJh4UvLnFjCiDkHrP$bDrU8pWCvdN7vhUJ7zqibUPKGECBABCFINSYfnw4FQdq3IYo5Nh0Li3SrFg5Y0U_U0Y5gEqQ2gK_fM3nWG1pbPD3vmdXQKFCA8789BEINTZhpy7IUgu6McuATn7TqCa_PqGkChAhClItS2gIxbGyfM4qaL8wjYOE6_tnjfcaZYZbdglqw07GQamx9Ncs7Pi$Kf0Nl7XyNqImFmHpMwV4gHwZDuaH$kUF0pcQF5yqjcWSOLJIHHJLOSWcjr_7IUgu6Lbr7Pi0Mi3RqEg5Y0U_U_W3cBmN$dGwcI$kSByjVI6xmdVOHC8410$0136AFLRYhq_9MZn0FWo4Oi1Ol7WvJkBe6a5b7gEoNzbDrVAsYG$kUF1qeTJA1wpkfbYWVVVXZcgmsz5DNYkw7Mbr6Ng_Ie_Lj7XyOrJnHnIqNxW6jL_dHzfM4oYJ4sgUJA1vngbXTQONNPQTXchow2BLWhu6KZq5Nh$Kf0OnAb0SwNsLsNwT1dDqS5lQ6oWEzkUG2sgWME60wrnkigghikorw$6EMWgs2FTiyCUn4Pk5RpBc0SuMqJpKsQzY8lMzcHxdK2mWG1qdRH6yqjcWSOLJIIJLORWbhow2CNYlzBQfwBUn5Qm7VuIj9c4Y1W1Z6fDpP1fIyeK1lUDzkWJ7yofWPJE9532111358CHNUclv4FSgv8PhyFYtCYwIh5WyPtMsNuR$Z9lN$eIzeL2nWG1pcRF5xphbVQMJHGFFHJMRWciqz6HSfs3IYp5Oh0Mi3SrFf5Y0U_U_W4dCoO0eIydJ$jSBykWJ8zofXPJE963101136AEJPXeox6IVjxBRi$HcxGczMl9a$TwOuPwS$a8kLzbFwbI$jTD_mZNB1tkcUPJFC98789CFJOTair_8JViv8OfxDWrAWtEd1RsJnFkFmHrOyX8lN0gL1kSBwhSD0qfVLC5_tolhgeefhjmrw07FOXiu4HVk_FXq7Sn7VtFg5X_RwPvQzW4fErT6lQ5nVCxgRC$odSI91wqlgdbZYYZadhmry4CLWgt4HVk$GYr9UqBZyLmBe5Z2Y2a6gDpP0eHxcI_hQ9wgSE2siYQIC61zwusstuw_16BIQYis2ERfu8Ph_HcxHe0OoDe5Y1W0X3cAlLyZBrU9rYF_jTE0pdSI90vpjfbYWVVWYbejot_7FPZkw7LZp4LdyGbxJh5VwNqHmGmIrNxW6jKzdIzgN5qaL7wjYOD4yrlgcZWVUVWYbejpv19JTep0ETj_FYr9VqBYxLmBe5Z2Y3b8iGrR2gJydI_hP7tePC0qgXOG94$xusrrrtvz16DJQZjt2ESgv9Ri$JdzJh3SsGi8c4Z4b7gFpP$dGvZFxdL3paL7wjYNE5zsmiebZYYZbeimsy3CLVgs2GVk_FXq8TpAYwKk9b2X$V0Y4cAmMzaDtYDwdM5qbN9zndTLD71yuronnnpruy17ELUeo_ANbq4LcvCWrBYwJj8Z0TxQxSzW3eDqQ2hK_gM3nWG1pcQF4xphbVQMJIHHHJLPTYdlt09KWjw9OewBTn6Ro9YxLnCf7c6d8gDnLxY9oS6oUBveO9wiWK9$tldYTOLJHGHIJMPUagnv2CNZmzCRhyFYsBWtFd1RtJmFkElGpNxW6jL_dI_hO5qbM8ylaQH80upkgdbaZabehlrx2AIScmyAOdt7Pi0Kg0Nm8YyOrImFlGoMwU4hIwaEvbI$kTE0ocQF5yqjcXSOLJIIJLOSWcipy4EOan$DTj_HatCYvGf2SuJmDiBhCjGqO_bDrU8oUBudM6uhUI8_rjdXSNKIGGHIKNRWbhox4FQcq2HWn3LeyHe_Ml8Z$RvNsMtOxU3eEsU7nS8rZH1nZL8xmbSKC60xurpnnoqsv_39GNWgq$CPes6MfxFavGd$OoDf6Z2X1Z5dBmMyaDsWCubI1nYJ5ujXOF7$vqlifdccefimqv07FOYjv6KYo2KcvDYuFc_NoDf6a3Z4b8hGrR2gJ_eJ$jQAwhTG3ukaSKD73$xusssuwz16CJQZit2FSgv8OgyGawGd$NoCe5Y1V$W1a8jIvW9oS7pWEyiSD$ocRH80vojeaYWVUUWZchms_6FPaly9Ncs7Pi0Kg1OnAa$RuMqKqLtQ_Z9mO1hL1jQ9uePB_maPG7$tnieaYXWWXZcglrx2AKUfr2GVk$HZtBWsDb_NnCf5a3Z3b8hGrS3hL_fL1kSCxjVI6wmcUNGB62_ywvvxz05AGMUdnx7JXl_EVm2Mg$Mj5UuJlBf8d7fBkItS2gIxcHzgN6sdOB_pdTKB3ztpljhgghjlptz3AIRblx7LZp3KcvDYuEc$OoEg7a2Y3b7gFqQ1fIycHzgO7teQD1rhXOG83_vsqoooqsvz28EMVeoz9MZo2JatAUqAXvIh6X_RvNuOwT1bBnO0fJ$gN5pYI4rfTH7_skeYUQNLJJJLNRVbhov2CNYkxAOewBUo6SoAXxKlBe5a3Z4dAkJvV7mP4lS8tbK5tfSH6ypgYRLGC976668BEJOVcku1DPcp2HXp5Nh0Mj5TtHj9c4Z3Z4cAkJwX9nR6oUCwfPAykYMC2vngZTPLIGFGGILPUahpx5FRdq2HXo4Ng_Jf0OnBb1TwOtNuQzW4fFrT6lR6oWF_kWI4uiXNF7$vrnjhgghjlnrw06EMVgr1FTiyEVn4Oj3QoBa0RtLqJpLtPzX6jKybFwcJ1mWG2qdRG5yphbVRNKIIIJLOSXcjrz6GRcp1FVl0HatCXuFd1RsIlDiCjFoMwW6kM$fK0jQ8tdOAzncSJA2ysnigdbbbdfinsy3BJTeq0EShxCTl3Oj3Pn9YzOqHmEkFnKuT2eFtW9qVCweN8viVJ7zpgZSLGCA76678BFJOTahqz8JWjxAQhzHauDZwIh5VxOrKpKrOxV3fFsU7oS9saI3pbOB$qgWOHA4$yvtttuwz15AGNVeoy9LZn1HZs8Sn6SqCb$QtJnGmHpMwU4hIwaEvbI0kUE$naNC1ulcVPKFC98789CFJOVbjr$AMZm_EUl1JdxHd_NmAb2UyRwRyV2bAmM_cGwcI$jSCzlXL9$qhZSLGC95323458CHMTajs$AMZm$FWn3Nh0Mj5TtIj9c3Z2Z4dBlKxYApT8pWEyhRB_maPE5zrlfaWSQPOOPSVZekrz5FPbn_CRhyDVo7SpAYxLmCf6a4a5dAkIuU5kN2jP6qZI3rdQE3vneWPKFB865668BEJPUbjs0BMZn$FVm3Mg_Kh2RqDe5X$U_U0Y6gFrS4jN1hO5pYI2qdRF5yphaUPLIFDCCDFIMRXdlu1BNYlyBRizGZtDZwIh4VwMpHmGnIrP_ZAnP2iO3mUCxhSE1rfVME60wroljiijkloty2AIQalw7KZo2JatAUpAXvIi8Z0UzSyT0Z7iIuV8nS7pWEzjUG2sgVLB4yrlhebZYYacfinsy4BKUfq1EShxBTl2Nj3QoCc1UxPuOvQzW5gHuW9oS8qXG$lWI5ujYPH92ytpljhhgiknrw07ENXht3FTixBTm3Nj3QoBb0SvMqKqLsPyX6iJxZDtYFygQ9wiWJ8_rjcVQLHECBBCEHJNSZfnw4FRer4JZq6Pj2Ok5TsGh6Y$TySzV1bAlMzcFvbH_iRBykXK9_rhZRLGC8644457AEJPVckt1CObp1HYp5Oj2Nk6VuIj9c4Z3a5eCmLyZBqT8pVCxgRC_nbQF6_smgbXUSQQPQSUYciov2BLWjw8NduATn5Rn8VuIj9b3Y1X3b8iHsT5jM0gM3nVF0nZMB0sjaSMHC85333458CGLRYgpz8JWkyCSj0IcxHe$NmAc1UyRxRzV3dCpP0fJzeL2mWG0obPD2uleXRMIECAAACEHLQVbir_8KWjx9PgxEXsBWtFd0RsJmEjDkGpNxX7kM$fK$hP7tdOAzodSJA3ytokhfdddfhkpu_5DMWhs2FTizEWp6Rn7UtGg5X_RwPvQyV3eErS5kP4mTBwgRC_nbRG8$uojfbZXWWXZcgkpv09ISdo$DShyDWp7Sn7VuHh7Z0UzTzV2b9jKwYBrWBubJ3paM9ymbSJB4_vromlklmosw$5BIQakv6JXm$GYr8So8VtGf4VyPtMtOwT1bBnO1gK$hN5pZJ4tgUJ90umgbWSPMMLMOQUYekrz6GQbo$DTj_GYsBWtFc$PqGjAf9fBjHrP$cDrV9qXEyhRC_mZOD3wngaUQNKJIIJLORVbhpx4EPbp0FVl0JcwFaxJh5VxNqIoHoKtR_Z9nO1hM2kSAwgRE1rgVMD5_vpligfefgjmrw06ENXhs2FTixBTl2Lg0Mk7XxMpGlEkFoLuT3fGuYCtZG_jTE$obPD3wogaVQNKIGGHILPTZfmv2CNZmzCRiyEWr9VrCayMmCe5Z3Z4dAkJvW7lO2jP5pXH2pcQE3wmeWQKFB866568BFKPWemw4FRes5LcuATn6SpBazOqGkChBiEnLwU4hKzdI_hP7tdOAznbRH91wrmifeccdfhlpv$6DMVgr2FUjzEWp7Sn8VuHh5X_RwPwRzX5gGtU7nR6pVDxhSD0qeUKB3xrmhebZZYZaehlrx3BLVgs3HVl$GYr8UpAYwKkAc3X0W1Y5eCnN_cEuZFxeM4qaM8xlbRH93zuqmjhgghilotz3AJSdo_AOcr5MexGawHf2SsIkBe7c7eAkJuU5jM1hO4nVE_lXJ7xneVNGB620zxxxy_159FMUcmx6JWkzCTk0KezJg2RrGi9c5a4b6fCnMzaDsWBtaI1nXI5uiYOF70wrnjhfeefhkotz3BJSco_AOcs6OgzIdzKi5UvKnEjBhBjGpO_aBpS6nT9tbJ3rdPD2ulcVOJEA7543347AEJPWenw5GTgu7NdvCVq9WtFe2SuLpHnHoKtQ$bBpR4lQ6pXF_kVH4tjYPG93zvromkkklnquz3AIRalx8LZo2IasAUp9XvIi7Z0UyRxS_W4eEqS5kO4mTBxgQC_nbPF6ztmhcZXVVVWYadint_6EOaly9PevASl3Nj3QoCc1TwOtNuQyV3eEqS4kO4nUCyiTF2rgVLC4zsnjgdcbcegkotz5DMWgs2GUj_EVo6Qm5TrEd3UxPtNtPxU2dDqS5kO2lSAvfQB_ncRH80vojeaYWVVWYbfkqw1AJTeq1FTiyEWp7To9XwJk9c2W$V$X4dCnN_bEuZExeM5rcOB$qgWOG93_wtrpopqsv_28FNWgq$CPds6MdwEYuEc_NmBd4X$V$W3b8jJvW8oS7pWEziTF1qeUJ91wpjfbYXWVWYbejou08GQamzAPeuASl3Nj4RpCc1TwOtMtOxU2eDqS5kP4mTBwgRC$pdTJA1vpjeaYWVVWYbfjou$7FPZlx9Odt9Rk2Ni2QoBb$RvMrLsNwU1cCpQ2iM1jR9uePB_odTKB4zupligfefgilpu_5DLVgs2FUjzDVo5Pl6TrEe3VyQuOuPxU1cCpQ3iN2kR9udN8xkYMD3xqjdZVTQPPQRUYdiow2BLWhu6KZp4NfzIe_Ml8Z_QtLqJqMuR$aAnP2iN2lSAvfRC_odSIA2xrmifdbbbdfjmqw18HQbmy9Ncs7Oh$Je$Lj5VwLoFkDjElIsR0dEtWAqWDwfO9xjWK9$skcWQLHEBAABCFINSYfnw4FQdq2IXo3Ng$Kh3RqEf5Y0V_V0Y5fEqQ2hL$gN4oWG0oaOC2uldWQLHDB9899BDHMRYfnx5GSft5Lbs8Rl4Qn9YxLnDh9e8fAjGpO$cEtXBtaH$lVG2qeSI80unidZWUTSTUWZdiov19JUfr3HWm0IauCYuFd0QrGjBf8e9hFoMyYAoR6nTAudM7vhVJ8zqiaUOJGDBAABDGJNSZgox4FRes4Jaq7Pj1Nj5TsHh8a2X0X3b8iHtT5kN1jP5pXH1oaNB1tjbUOJFB8644568CHMSZis0BNao1GXp5Pj2Ol7VvJlBe6b5c8hEpP$cFuYDuaI0lWH3sgVLB3yrlhdaYXWWYadint_6FPZlx9Ncs7Ph_Je$Mk7XyOrJnHnIqOyW6iKycGxdK3nXI4sgVJ9$umgbWSQOOOPRUXciow1AKVgt5KZp5Nh$Kg1OnAb$RuMqKrNvT1dDqS5kP4nUCxhSE0qfULC5_upligffefhlpuz4CKUeq0EShxBTl2Mh1Ol8XxMoEiBgCjFpOzZAoQ4kP6pXG0nZMA_qhZSMGC85323358BFKQYfoy7JVjyBRi_HauEaxJj7Y_RvOuOwS$Z8kLzcFvaGzhQAxjWJ8_qhZSMHD9643457AEJPVdlv3EQdr4JZq6Qk3Pm8XwLnDg8d7eAiFpP$cEtXCtZG$kVG2rfUJ90voidZWUSSTUXafjpw2BKUgs3HWm1JcwEawHf2StIkCg9gBjGqP$bDsV9qWExfO9wjWK8_qhZSMHDA86679BFJOUaiqz7JWjxAQhzGauDZwIh4VxOrJpKrOwU2eErU7nR8rZH2oaM9zoeUME83_xurqqrsvy05CJSakv4HUixBTl2Mg0Mj6VvKlDhAf9hDmKvU5kM0gM3mVF$nZMA$riZSLGB6310$0258DIOVdmw5HThu7NewDWrAXvHg5VxOsKpJqNwU3fFtW9pVBubK4qcOB$rhYQJD830zxxwxz037DJRZis1DQdr5MdwCWqAXuHg5WyPtMsNuR_Y8jKybEvbH$jTD_lZNB1tleWQKHDB99ABEHLQWdlt1BNZlzCSj_HavFbyKj6XyPsLqKrNwU3eFsV8oUAsZI2oZM9zodUMF83_xusrrrsvz17DKTbmx6JWl_EVm3Ni1Ol8XxMoFjChCjGpNxX8mP2jO5oWF$mYL8zofWNGA50zxvvuwy$27DKRZis1COcq3JZr8Sn6TrDd1TvMrKqLsOxV4gGuW9qWCveN7ugTH6yogZSMHEB86678ADGMRYfox6HSgu6MdvBVp9VsEd1SuLoHmHnJsQ_aAoR4kQ6pXG$mYK7xmcTLD72zwtrrrsux_39ELTcmx6IVjyCSk0Kf_Ki4UuJlCg9f9hEnLxX8lO1iN3mUCyiTG3siYPHA4$xtrppoprtx$4AHQZju4HVkzDUm2Mh0Ml7WwMoGkDiCkGpNyY8nP3kQ6qYH1oZM9zpfXPIC730_yyyz$15AFMUcmx6IWjyBSj$IcxHf1PpEg6a2X1Y3c9kJwX9oT8qXFziSD$ocQH7$tnidaXUTTTUWaeipw2BLWiu5JYo2KdwFbxIh4VvLnFjCjEmJtS2fHwaEwcJ1mVG1pcRG6zskeYUQNLKKMNQUZflt0AKWiv7Mct9Sl4Pk5UtGh7Z0U_U$Y5eDpQ1fIydJ0jRAwhSF3tiZRJC72_xussstvy05BIPZju4GUiyCTl3Nh1Om8XxLoFjBhCjFpNyY9nQ4kQ6pWG$mYL9zpfWOHB62$yxwwxz038DJPXgq_9Mao1HZr9Sm6SpBa_PrImFkFnKtQ$bCpS5mR7rZI3qbOB$qgXPIB72$yyxxy_149ELSaju3FSgv9PgyFZuEayKl9a1VzSyS_W4eDpQ2hL0iP7rbL6uhUJ8_skeYTPNKKKKLNRVZfmu1ALXkxAPevATm5Qm7WuIjAc4Y1X2a7hFrR3hL$hN4oWG0oaNB1tjbVOJFB8544569CHNTajs0BNZm$EUl2Lf_Jg1PoCd3W_TzT0Y6gFqR3hL$gN5pYI3reSH7_skeYUQNLKJKLNQVagnv2CNYlyBQgxDVp7TpAYyMnDg8d6c8gEoNzaBpS7oUCvdN7ugSG5wofYRMHEC98789BFJOUbjs0BNZn$EUl1JdxGd$NmBc2VzRwRyU1a9lM_cGxcJ0kTCzkWK8zqgYRMGC97543469CHMTais0BObp1GWo4Mg$Mi4StHj9c4Z2Z4dAkJwX9oS7pWDxgQBzlZNE4xqkeZWSQOOOPRUYcjqx4EPan_CRgxCVo6So9XxLmCe6a3Z4b8iHsT4jN1jP5pXG1oaOC1tkcVPJEA7544468CHMSair$9LXkzCSj_IcwGd$NmAb1UxQvPxU1bBnO$eHydJ0kSD_lYMB0sjbUOIEA755679CGLRXenw4FQdr4Kas9Sn7TqDc0RsJnGlGnJsP_aAnP3jO3nVE_kWJ6wmcTLE82zvtrqpqrtw_39GOXgr1ERgvARj1Kf$Mk6VvKnEiBhCjGpNzZAoR4kQ6qYI2pbOC0sjaSMGB62$zyyy_159FLTblv5HUixBS} AcpStyles: Node_drop_shadow: Yes~ Show_description: 20~ Navigation_style: Top_tabs~ Show_outline: No~ Show_tabs: No~ Use_top_diagram_size: No~ Bevel_node_border: No~ Show_title: Yes~ Show_uncertainty_view: Yes~ Show_graph_table_icon: Yes~ Show_index_menus: Fly-in~ Show_model_title: Yes~ auto_zoom_diagrams: Yes~ hide_save_button: No~ show_as_tab: No {!40300|ProactivelyEvaluate: 1} {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Module ACP_style_lib_detai1 Title: ACP style lib details Description: Details and libraries used in the ACP Styles library. Author: Max Henrion Date: Wed, May 19, 2021 12:33 PM DefaultSize: 64,32 NodeLocation: 320,477,-21 NodeSize: 72,24 DiagState: 2,112,56,935,551,23,10, AcpStyles: show_as_tab: No {!40300|ProactivelyEvaluate: 4} Library ACP_Object_attribs_l Title: Object attribs library Description: Functions to get and set attributes of objects, including node location, size, and corners, Diagram location and size, and tracing. Author: Max Henrion Date: Mon, Jul 13, 2020 2:48 PM NodeLocation: 96,240,1 NodeSize: 88,24 DiagState: 2,189,-16,1324,806,23,10, WindState: 2,98,82,720,350 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Constant ACP_Number_format_US Title: Number format USD Description: Number format for a variable with US dollars and commas separating thousands, e.g. '$2,000,000' Definition: '2,I,4,0,1,1,4,0,$,0,"ABBREV",0,,,0,0,15' NodeLocation: 88,664,1 NodeSize: 56,24 WindState: 2,1113,75,720,350 NumberFormat: 2,I,4,0,1,1,4,0,$,0,"ABBREV",0,,,0,0,15 Constant ACP_Number_format_PC Title: Number format % Description: Number format for showing percent and no decimal points e.g. '50%' Definition: '2,%,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15' NodeLocation: 88,720,1 NodeSize: 56,24 WindState: 2,113,631,720,350 NumberFormat: 2,%,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15 Function ACP_SetNumberFormat(v: Handle Atom; t: = '') Title: SetNumberFormat(v, t) Description: Set the number format of variable v according to the first character in t:~ '$' integer number of dollars -- e.g. '$2,000,000' ~ '%' percentage -- e.g. '50%'~ otherwise a number with two decimal places e.g. '1.23' (default) Definition: t := SelectText(t, 1, 1);~ Local format :=~ IF t = '$' THEN ACP_Number_format_US~ ELSE IF t = '%' THEN ACP_Number_format_PC~ ELSE ACP_Number_format_1_;~ NumberFormat OF v := format; NodeLocation: 296,664,1 NodeSize: 120,16 WindState: 2,98,82,824,406 Constant ACP_Number_format_1_ Title: Number format 1.23 Description: Number format for showing percent and no decimal points e.g. '50%' Definition: '2,F,4,2,0,0,4,0,$,0,"ABBREV",0,,,0,0,15' NodeLocation: 88,776,1 NodeSize: 56,24 WindState: 2,113,631,720,350 NumberFormat: 2,F,4,2,0,0,4,0,$,0,"ABBREV",0,,,0,0,15 Decision ACP_input_number Title: Eg input number Definition: 1200.22 NodeLocation: 224,776,1 NodeSize: 56,24 Aliases: FormNode ACP_New1620278147 NumberFormat: 2,F,4,2,0,0,4,0,$,0,"ABBREV",0,,,0,0,15 Decision ACP_Select_format Title: Select format Definition: Choice(Self,3,0) NodeLocation: 224,720,1 NodeSize: 56,24 Aliases: FormNode ACP_New278100867 {!40300|DomainExpr: Discrete('$','%','.')} OnChange: ACP_SetNumberFormat(Handle(ACP_input_number), self) Function ACP_DiagState(m: Module Atom; x, y, w, h: Number) Title: Set_DiagState(m, x, y, w, h) Description: Locate a Diagram (module) with specified top left location x, y, width and height (pixels) in the application window. Definition: Index fields := ['X', 'Y', 'W', 'H'];~ ACP_Set_att_field(DiagState, m, Array(fields, [x, y, w, h]), fields) NodeLocation: 776,448,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,324,75,720,474 Function ACP_GetDiagState(diag: Handle) Title: GetDiagState(o) Description: Returns the DiagState of a Diagram, indexed by Window_state_fields Definition: ACP_Get_att_field(DiagState, diag) NodeLocation: 296,448,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,1108,96,720,350 Function ACP_GetResultWindSta(o: Handle) Title: GetResultWindState(o) Description: Returns the ValueState of Object o, indexed by Window_state_fields, inclusing the location and size of the result window. Definition: ACP_Get_att_field(ValueState, o) NodeLocation: 296,528,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,98,82,720,350 Function ACP_GetNodeLocXYZ(v: Handle) Title: GetNodeLocXYZ(v) Description: Given an object v it returns its node location as xy values Definition: ACP_Get_att_field(Nodelocation, v) NodeLocation: 296,76,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,113,422,720,350 Function ACP_SetNodeLocXYZ(o: Handle; loc: Number [ACP_XYZ]) Title: SetNodeLocXYZ(o, loc) Description: Set the location of node for object o to location (and z value) loc indexed by xyz. Definition: ACP_Set_att_field(NodeLocation, o, loc, ACP_XYZ) NodeLocation: 776,76,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,1265,492,733,434 Button ACP_Test_SetNodeLocX Title: Test SetNodeLocXYZ NodeLocation: 1008,76,1 NodeSize: 88,16 OnClick: ACP_SetNodeLocXYZ(Handle(ACP_SetNodloc_and_se), ACP_GetNodeLocXYZ(Handle(ACP_SetNodloc_and_se))+30) Function ACP_NodeCorners(v: Handle) Title: NodeCorners(v) Description: Returns an array of the top left and bottom right corners of node for object v, ~ indexed by XY for the X and Y coords and LH for top left (LH='Low') and bottom right corners (LH='High'). Definition: Local s := Ceil(ACP_GetNodeSize(v)/2);~ ACP_GetNodeLocXY(v) + IF ACP_low_high='Low' THEN -s ELSE s NodeLocation: 296,248,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,669,359,857,270 Index ACP_low_high Title: Low_high Definition: ['Low','High'] NodeLocation: 80,248,1 NodeSize: 64,16 Function ACP_Find_Node_from_X(loc: [ACP_XY]; corners: [ACP_XY, ACP_low_high, nodes]; nodes: Index) Title: Find_Node_from_XY(xy, corners, n) Description: Given a screen location loc (indexed by xy) and corners of nodes (indexed by XY, LH, and nodes, return the first node from nodes that contains loc, ~ or Null if there is no match. Definition: Slice(Subset(~ Sum(corners[ACP_low_high='Low'] <= loc AND loc <= corners[ACP_low_high='High'], ACP_XY)=2), ~ 1, defval: Null) NodeLocation: 296,336,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,1049,101,720,362 Function ACP_GetNodeLocXY(v: Handle) Title: GetNodeLocXY(v) Description: Return the center location of node v indexed by XY, where x and y are pixels from top left corner of the Diagram Definition: ACP_Get_att_field(NodeLocation, v, ACP_XY) NodeLocation: 296,120,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,783,870,720,350 Function ACP_GetNodeSize(v: Handle) Title: GetNodeSize(v) Description: Return the size of node v indexed by XY, where X and Y are its full width and height in pixels.~ It doubles the values in the Nodesize attribute, which are half the width and height. Definition: ACP_Get_att_field(NodeSize, v)*2 NodeLocation: 296,168,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,1015,655,825,375 Variable ACP_GetLocXYZ Title: eg GetLocXYZ Definition: ACP_GetNodeLocXYZ(Handle(ACP_SetNodloc_and_se)) NodeLocation: 536,76,1 NodeSize: 80,16 ValueState: 2,1487,61,416,303,,MIDM Variable ACP_GetLocXY Title: eg GetLocXY Definition: ACP_GetNodeLocXY(Handle(ACP_SetNodloc_and_se)) NodeLocation: 536,120,1 NodeSize: 80,16 ValueState: 2,1683,421,416,303,,MIDM Variable ACP_GetLocSize Title: eg GetLocSize Definition: ACP_GetNodeSize(Handle(ACP_SetNodloc_and_se)) NodeLocation: 536,168,1 NodeSize: 80,16 ValueState: 2,1623,675,416,303,,MIDM Function ACP_SetNodeSize(obj: Handle; sz: Number [ACP_XY]) Title: SetNodeSize(obj, sz) Description: Set the size of the node of object obj to loc, indexed by xy, with full width and height in pixels. Definition: ACP_Set_att_field(Nodesize, obj, Ceil(sz/2), ACP_XY) NodeLocation: 776,168,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,889,253,733,434 Button ACP_Test_SetNodesize Title: Test SetNodesize NodeLocation: 1008,168,1 NodeSize: 88,16 OnClick: ACP_SetNodeSize(Handle(ACP_SetNodloc_and_se), ACP_GetNodeSize(Handle(ACP_SetNodloc_and_se))+16) Function ACP_SetNodeLoc(o: Handle; loc: Number [ACP_XY]; z: =1) Title: SetNodeLoc(o, loc) Description: Set the location of node for object o to location loc indexed by xy.~ It sets z (depth value) (detaults to 1). Definition: ACP_Set_att_field(NodeLocation, o, loc, ACP_XY) NodeLocation: 776,120,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,869,318,733,434 Button ACP_Test_SetNodeLoc Title: Test SetNodeLoc NodeLocation: 1008,120,1 NodeSize: 88,16 OnClick: ACP_SetNodeLoc(Handle(ACP_SetNodloc_and_se), ACP_GetNodeLocXYZ(Handle(ACP_SetNodloc_and_se))-30) Variable ACP_GetDiagState1 Title: eg GetDiagState Units: hello Description: hello Definition: ACP_GetDiagState(ACP_Top_model) NodeLocation: 536,448,1 NodeSize: 80,16 ValueState: 2,1786,847,416,303,,MIDM Variable ACP_Result_windstate Title: eg Result windstate Definition: ACP_GetResultWindSta(Handle(ACP_result)) NodeLocation: 536,528,1 NodeSize: 80,16 WindState: 2,899,597,720,350 ValueState: 2,1381,283,459,248,,MIDM Button ACP_Test_Set_diagSta Title: Test Set_diagState NodeLocation: 1008,448,1 NodeSize: 88,16 OnClick: ACP_DiagState(ACP_This_module, 10, 10, 400, 300) Button ACP_Test_Set_DiagSiz Title: Test Set_DiagSize NodeLocation: 1008,489,1 NodeSize: 88,16 OnClick: Local xy := ACP_GetDiagSize((ACP_This_module))+10;~ ACP_Set_Diag_Size((ACP_This_module), xy, ACP_xy) Variable ACP_This_module Title: This module Definition: Handle(ACP_Object_attribs_l) NodeLocation: 1208,528,1 NodeSize: 80,16 Variable ACP_SetNodloc_and_se Title: eg SetNodloc and setNodeSize Definition: Array(ACP_Nodeinfo_fields, null) NodeLocation: 536,32,1 NodeSize: 80,16 ValueState: 2,1514,0,315,453,,MIDM Function ACP_Set_Diag_Size(m : object ; w, h: scalar) Title: Set_Diag_Size(m, w, h) Description: Changes the diagram size of module m to the indicated width w and height h. Definition: ACP_Set_att_field(DiagState, m, ~ Array(ACP_XY, [w, h]), ~ Array(ACP_XY, ['W', 'H'])) NodeLocation: 776,488,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,146,623,659,312 NumberFormat: 2,I,4,2,0,0,4,0,$,0,"ABBREV",0,,,0,0 Function ACP_GetDiagSize(m: Module) Title: GetDiagSize(m) Description: Return the diagram size in pixels indexed by XY. ~ Returns 300 if Diagstate is not defined for this module. Definition: Local s := ACP_Get_att_field(DiagState, m, Array(ACP_XY, ['W', 'H']));~ IF s=Null THEN 300 ELSE s NodeLocation: 296,488,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,511,79,720,350 Variable ACP_Get_diag_size1 Title: eg Get_diag_size() Definition: ACP_GetDiagSize(ACP_Top_model) NodeLocation: 536,488,1 NodeSize: 80,16 ValueState: 2,1018,863,416,145,,MIDM Function ACP_SetDiagWidth(m: Module; w: Scalar) Title: SetDiagWidth(m, w) Description: Expand the diagram width of module m by w (or reduce it if w<0. Definition: ACP_Set_att_field(DiagState, (ACP_This_module), w, 'W') NodeLocation: 776,528,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,1618,515,720,350 Module ACP_attrib_access Title: Old attrib access Author: Max Henrion Date: Thu, Mar 11, 2021 12:30 PM NodeLocation: 80,552,1 NodeSize: 64,32 NodeInfo: 1,0 DiagState: 2,1229,484,543,194,17 Function ACP_Varlist_as_text(vl: Handle List) Title: VarList_as_text(vl) Description: Given vl as a list of variable identifiers (possibly zero length), it returns a text value listing the identifiers, separated by commas (or empty text). Definition: IF SIze(vl) = 0 THEN ' ' ELSE BEGIN ~ MetaIndex v := vl;~ JoinText(Metavar o[] := v DO Identifier OF o, v , ', ')~ END NodeLocation: 128,40,1 NodeSize: 88,16 WindState: 2,155,95,482,387 Variable ACP_Eg3 Title: Eg3 Definition: ACP_Varlist_as_text(Outputs OF ACP_Selection_method) NodeLocation: 296,40,1 NodeSize: 48,16 ValueState: 2,234,282,1040,303,0,MIDM Function ACP_Attribastext(a: Text; o: Handle) Title: AttribAsText(a, o) Description: Returns attribute a of object o as text. ~ If o has not attribute a it returns empty text ''.~ It converts Contains, Inputs, Outputs, Aliases from list of variables to a comma-separated list as text. It converts Identifier, Original and IsIn to identifier as text. Definition: Metavar v := (a OF o);~ IFONLY IsNull(v) THEN ''~ ELSE IFONLY a='Original' OR a='Isin' OR a='Identifier' THEN v~ ELSE IFONLY a = 'Domain' THEN ACP_List_from_val(v)~ ELSE IFONLY a = 'Contains' OR a = 'Aliases' OR a = 'Inputs' OR a = 'Outputs' THEN ACP_Varlist_as_text( v )~ ELSE IFONLY Istext(v) THEN v ELSE '?' NodeLocation: 128,96,1 NodeSize: 92,16 WindState: 2,345,72,542,457 Function ACP_List_from_val(x) Title: List_from_val(x) Description: Given x is a list value, it returns it as text, e.g.~ '[1, 2, 4]' Definition: If IsNull(x) Then null Else~ (~ INDEX i := CopyIndex(x);~ '['&JoinText(i, i, ', ') & ']'~ ) NodeLocation: 128,152,1 NodeSize: 92,16 WindState: 2,618,15,564,486 Variable ACP_Eg5 Title: Eg5 Definition: ACP_List_from_val(Domain OF ACP_Selection_method ) NodeLocation: 296,152,1 NodeSize: 48,16 ValueState: 2,120,130,416,303,0,MIDM Variable ACP_Selection_method Definition: 1 NodeLocation: 416,40,1 NodeSize: 48,24 WindState: 2,94,83,437,438 {!40300|DomainExpr: Discrete(1,2,3)} Prev_attribute: 112,64,1 Close ACP_attrib_access Button ACP_Test_SetDiagWidt Title: Test SetDiagWidth NodeLocation: 1008,528,1 NodeSize: 88,16 OnClick: ACP_SetDiagWidth((ACP_This_module), 300) Index ACP_LocSize Title: LocSize Definition: ['Location','Size'] NodeLocation: 1200,592,1 NodeSize: 80,24 Variable ACP_NodeCorners1 Title: eg NodeCorners Definition: INDEX nodes := ListOfHandles(ACP_GetLocSize,ACP_GetLocXY,ACP_Test_SetNodesize,ACP_SetNodeLocXYZ,ACP_Example_text_nod);~ ACP_NodeCorners(nodes) NodeLocation: 536,248,1 NodeSize: 80,16 ValueState: 2,723,139,722,270,,MIDM ReformVal: [ACP_low_high,ACP_XY] Att_ResultSliceState: [lh,1,XY,1,Sys_LocalIndex('nodes'),1] Function ACP_DiagramMax(m: Handle Atom; margin: = 0) Title: DiagramMax(m) Description: Returns the maximum x and y value (indexed by XY) of the bottom right corner of nodes in diagram m plus margin if specified.~ Used to resize diagram to show all nodes. Definition: MetaIndex nodes := Contains OF (m);~ Max(ACP_GetNodeLocXY(nodes) + ACP_GetNodeSize(nodes)/2, nodes) + margin NodeLocation: 296,288,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,570,569,977,547 Variable ACP_eg_DiagramMax Title: eg DiagramMax Definition: ACP_DiagramMax(ACP_Top_model) NodeLocation: 536,288,1 NodeSize: 80,16 ValueState: 2,1938,25,462,868,,MIDM ReformVal: [ACP_XY,Sys_LocalIndex('nodes')] Variable ACP_ACPStyles1 Title: ACPStyles Description: Handle to CloudPlayerStyles attribute to be replaced by ACPStyles when that becomes available. Definition: Handle(AcpStyles) NodeLocation: 1184,352,1 NodeSize: 80,24 Variable ACP_using_handle_to_ Title: using handle to attrib Definition: ACP_ACPStyles1 OF Handle(ACP_Object_attribs_l) NodeLocation: 1184,408,1 NodeSize: 80,24 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Function ACP_Getnodeinfo(o: Handle Atomic) Title: GetNodeInfo(o) Description: Returns the nodeinfo of object o, as a vector indexed by NodeInfoFields.~ If o has no Nodeinfo (i.e. default), it returns the vector of default values. Definition: ACP_Get_att_field(NodeInfo, o) NodeLocation: 296,384,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,1388,92,568,528 Variable ACP_GetNodeInfo1 Title: Eg GetNodeInfo() Definition: ACP_Getnodeinfo( handle(FrameNode)) NodeLocation: 536,384,1 NodeSize: 80,16 ValueState: 2,1567,91,658,556,0,MIDM Function ACP_SetNodeInfoField(o: Handle Atomic; field: Text Atomic; v) Title: SetNodeInfoField(o, field, v) Description: Set NodeInfo field of object o to value v, leaving other fields as they are.~ field may be any value from Nodinfo_fields, including:~ 'Input arrows','Output arrows','Label','Border','Fill color','Use custom font','Node field width','Bevel' Definition: ACP_Set_att_field(NodeInfo, o, v, field) NodeLocation: 776,384,1 NodeSize: 120,16 WindState: 2,351,644,892,504 Variable ACP_Default_nodeinfo Title: Default nodeinfo Fields Definition: Table(ACP_Nodeinfo_fields)(1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0) NodeLocation: 88,80,1 NodeSize: 72,16 DefnState: 2,469,156,416,303,0,MIDM ValueState: 2,777,81,872,303,0,MIDM Button ACP_SetNodeInfoFie1 Title: eg SetNodeInfoField NodeLocation: 1008,384,1 NodeSize: 88,16 OnClick: ACP_SetNodeInfoField(Handle(ACP_Example_text_nod), 'Corner radius', 32) Function ACP_SetCornerRadius(o: Handle Atomic; r: = 0) Title: SetCornerRadius(o, r) Description: Set the corner radius for object o to r pixels. If r=0 (default), the node will be a rectangle. This only works for nodes whose default shape is rectangular, including Text, Frame, and Formnodes. Definition: ACP_Set_att_field(NodeInfo, o, r, 'Corner radius') NodeLocation: 776,248,1 NodeSize: 120,16 WindState: 2,1506,738,565,310 Button ACP_SetCornerRadiu1 Title: eg SetCornerRadius NodeLocation: 1008,248,1 NodeSize: 88,16 OnClick: ACP_SetCornerRadius(Handle(ACP_Example_text_nod), 0) {!50500|FrameNode ACP_Example_frame} {!50500|Title: Example_frame} {!50500|Description: Text in this example frame} {!50500|NodeLocation: 1192,108,-1} {!50500|NodeSize: 64,36} {!50500|NodeInfo: 1,,,1,,,1} {!50500|WindState: 2,98,82,720,350} {!50500|NodeFont: Arial Black,15} {!50500|AcpStyles: ~ Show_uncertainty_view: Yes~ show_graph_table_icon:yes~ Show_Description: 20~ Show_index_menus: Fly-in~ Show_graph_table_icon: Yes} {!50500|ProactivelyEvaluate: 4} Text ACP_Te744976515 Title: A text node NodeLocation: 1192,184,-1 NodeSize: 64,32 NodeInfo: 1,,,,1,1,,,,,,,,,,,, Chance ACP_result Title: eg result Definition: INDEX i := 1..10;~ 10 + i^2 - 0.1*i^3~ * Normal(1,2, Over: i) NodeLocation: 536,576,1 NodeSize: 80,16 ValueState: 2,804,810,416,343,1,XCDZ Function ACP_SetNodeXYWH(o: Handle; locXYWH: Number [ACP_XYWH]) Title: SetNodeXYWH(o, loc) Description: Set the location and size of node for object o to locXYWH, where X, Y are top left corners and W, H are complete (not half) the width and height of node. Definition: ACP_Set_att_field(NodeLocation, o, locXYWH[ACP_XYWH=ACP_XY], ACP_XY);~ ACP_Set_att_field(NodeSize, o, ~ Ceil(locXYWH[ACP_XYWH=Array(ACP_XY, ['W','H'])]/2), ACP_XY); NodeLocation: 776,208,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,1626,37,733,434 Button ACP_Test_SetNodeLoc1 Title: Test SetNodeLoc NodeLocation: 1008,208,1 NodeSize: 88,16 OnClick: ACP_SetNodeXYWH(Handle(ACP_SetNodloc_and_se), ACP_GetNodeLocXYZ(Handle(ACP_SetNodloc_and_se))-30) Function ACP_GetNodeXYWH(o: Handle) Title: GetNodeXYWH(o) Description: Return the node location and size of object o indexed by XYWH, with X, Y at top left corner, width W and height H. Definition: Local loc := ACP_Get_att_field(NodeLocation, o, ACP_XY);~ Local sz := ACP_Get_att_field(NodeSize, o, ACP_XY);~ Concat(loc - sz, 2*sz, ACP_XY, ACP_XY, ACP_XYWH) NodeLocation: 296,208,1 NodeSize: 120,16 NodeInfo: 1,1,1 WindState: 2,1553,378,741,433 Variable ACP_GetXYWH Title: eg GetXYWH Definition: ACP_GetNodeXYWH(Handle(ACP_SetNodloc_and_se)) NodeLocation: 536,208,1 NodeSize: 80,16 ValueState: 2,1661,143,416,303,,MIDM Button ACP_test_ask Title: test ask NodeLocation: 640,744,1 NodeSize: 64,32 OnClick: ACP_res := AskMsgChoice('Select the file type for downloading the data: ', 'Download', optionlist: ACP_File_types, default: 'CSV') Index ACP_File_types Title: File types Definition: ['XLS','CSV'] NodeLocation: 640,664,1 NodeSize: 64,16 FormNode ACP_New1620278147 Title: Eg input number Definition: 0 NodeLocation: 408,760,1 NodeSize: 112,16 Original: ACP_input_number {!40700|NextInTabOrder: Self} FormNode ACP_New278100867 Title: Select format Definition: 0 NodeLocation: 408,712,1 NodeSize: 112,16 Original: ACP_Select_format {!40700|NextInTabOrder: Self} Close ACP_Object_attribs_l Library ACP_Get_and_set_atts Title: Get and set attributes library Description: Functions to get and set attributes of any object, including Get_attrib_field() and Set_attrib_field() that work with attributes with multiple fields, and let you get or set one, some, or all fields for the attribute. Author: Max Henrion Date: Sun, May 16, 2021 12:39 PM NodeLocation: 96,168,1 NodeSize: 88,24 DiagState: 2,2,0,1213,607,23,, DiagramColor: 55705,55705,55705 {!40300|ProactivelyEvaluate: 5} Function ACP_Hide_node(n: Handle Atom; what: = 'Original') Title: Hide_node(n) Description: Hide node . By default the original node n, unless you specify what: 'UserInputs' or 'UserOutputs', in which case it hides any user inputs or user outputs for node n.~ It works fine if n is a list or array of handles to nodes. Definition: ChangeNodeVisibility(n, 'Hidden', what: what) NodeLocation: 728,544,1 NodeSize: 120,24 NodeInfo: 1,1,1 WindState: 2,398,133,732,374 Recursive: 1 Button ACP_hide_node1 Title: eg hide node NodeLocation: 904,544,1 NodeSize: 48,24 OnClick: ACP_Hide_node(Handle(ACP_show_hide_node)) Function ACP_Show_node(n: Handle Atom; show: = True; what: Text Atom = 'Original') Title: Show_node(n) Description: Show node n in its Diagram, or hide it if you set show: False. ~ It works fine if n is a list or array of handles to nodes.~ It applies to the original node n, unless you specify what: 'UserInputs' or 'UserOutputs', in which case it shows any user inputs or user outputs for node n. Definition: ChangeNodeVisibility(n, ~ IF show THEN 'Visible' ELSE 'Hidden', ~ what: what ) NodeLocation: 320,544,1 NodeSize: 120,24 NodeInfo: 1,1,1 WindState: 2,369,452,854,617 Recursive: 1 Button ACP_Show_node1 Title: eg Show node NodeLocation: 496,544,1 NodeSize: 48,24 OnClick: ACP_Show_node(Handle(ACP_show_hide_node)) Function ACP_attrib(att: Attribute; obj: Handle Atom; val) Title: Set_attrib(att, obj, val) Description: Set the attribute att of object obj to value val. If you specify index i, it assumes val is indexed by i and joins the values of val over i into a single text to assign att. Works if attribute and/or obj is an array. ~ ~ It changes Reset_attribs so that any variables depending on Get_attrib() or Get_attrib_field() will automatically update after any call to to Set_attrib_field(), unlike direct changes to attributes (other than Definition or Check) that do not propagate changes to variables that depend on them. Definition: ACP_Reset_attribs := NOT ACP_Reset_attribs;~ { This variable triggers Get_attrib(att, obj) and hence all the functions that use it to recompute }~ att OF obj := val NodeLocation: 872,40,1 NodeSize: 128,24 NodeInfo: 1,1,1 WindState: 2,847,301,733,622 Button ACP_Test_set_attrib Title: Test set_attrib() NodeLocation: 1104,44,1 NodeSize: 88,20 WindState: 2,1110,334,720,350 OnClick: ACP_Set_att(Description, Handle(ACP_Example_text_nod), 'New text here') Function ACP_attrib1(att: Atom Attribute; obj: Handle Atom; defVal: = Null; formNode: = False) Title: Get_attrib(att, obj, i) Description: Return the attribute «att» of object «obj», normally as a text value,~ except if «att» of «obj» is not defined it returns defVal (default Null)~ or if «att» is a list of objects (such as Inputs, Outputs, or Contains), it returns a set (reference to a list ) of objects (excluding «obj»).~ If formNode=True, it returns the attribute of the first formnode (user input or user output) for obj.~ ~ It array abstracts if «att» is an array of a ttributes and/or «obj» is an array of objects.~ ~ Any call to Set_attrib() or Set_attrib_field() will cause all variables that uses Get_attrib() to recompute, triggered by Reset_attribs -- unlike any change to an attribute via the user interface or att OF Obj, which does not propagate changes (except for changes to Definition or CheckAttrib). Definition: ACP_Reset_attribs;~ IF formNode THEN IF Aliases OF obj <> Null THEN obj := Slice(Aliases OF obj, 1);~ IF SetContains(\ACP_Attribs_w_object, att) THEN SetDifference(\(att OF obj), \([obj]))~ ELSE BEGIN Local r := (att OF obj);~ IF r=Null THEN defVal~ ELSE r~ END NodeLocation: 448,40,1 NodeSize: 120,24 NodeInfo: 1,1,1 WindState: 2,978,419,1124,662 Variable ACP_Reset_attribs Title: Reset_attribs Description: Set_attrib() changes this variable, which is an input to Get_attrib(), so that any call to Set_attrib() will cause any variables that use Get_attrib() to be invalidated and recomputed when necessary. This also applies to Set_attrib_field() and Get_attrib_field().~ This helps restore dependency maintenance (flow architecture), which otherwise does not work for attributes other than Definition and Check which are part of the standard flow architecture. Definition: 1 NodeLocation: 656,40,1 NodeSize: 64,24 WindState: 2,655,372,720,350 Index ACP_Attribs_w_object Title: Attribs w object list Description: A list of attributes whose value is a list of objects. Get_att(att, obj) returns these attributes as a set (reference to a list of handles to the objects) Definition: ListOfHandles(Inputs, Outputs, Contains, DisplayInputs, DisplayOutputs, Aliases) NodeLocation: 88,40,1 NodeSize: 64,24 WindState: 2,98,82,720,350 Text ACP_Example_text_nod Title: Example text Description: New text here NodeLocation: 280,472,-1 NodeSize: 64,24 NodeInfo: 1,,,,1,1,,,1,24,8,32,23,23,23,32,0,0 WindState: 2,98,82,720,350 NodeFont: Century Gothic,15 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Function ACP_attrib_field(att: Attribute; obj: Handle Atom; val; field: Text Optional) Title: Set_attrib_field(att, obj, val, field) Description: Set «field» of attribute «att» of object «obj» to value «val» (leaving other fields as they were). Or if you omit «field», it assumes that val is an array with all fields and field index corresponding to «att» (and flags an error if it is not). It returns the new attribute as text with fields separated by commas (as stored internally).~ ~ You can see the multi-field Attributes and their corresponding field indexes in Variable Field_indexes_by_att.~ ~ You can specify «field» as a single field or subset of fields from the corresponding field index. For example~ Set_attrib_field(DiagState, Handle(aModule), Array(XY, [100, 100], XY)~ Sets the top left corner of the Diagram window to x=100, y=100.~ ~ It array-abstracts for multiple objects, but not multiple attributes with different indexes.~ ~ It flags an error if «att» is not an attribute with multiple fields or if «field» is not an element from the attribute's field index.~ It flags an error if «field» does not match any element of «fields» (case sensitive.)~ ~ It changes Reset_attribs so that any variables depending on Get_attrib() or Get_attrib_field() will automatically update after any call to to Set_attrib_field(), unlike direct changes to attributes (other than Definition or Check) that do not propagate changes to variables that depend on them. Definition: LocalAlias fieldIndex := ACP_Field_indexes[ACP_Attribs_with_fie=att];~ IF IsNotSpecified(field) THEN BEGIN ~ { Without «field», assume it sets all fields and «val» should be indexed by the fields index for att }~ Local indexes := IndexesOF(val);~ MsgBox('Index expected = '& (Handle(fieldIndex) = Slice(indexes, 1))&' and num indexes = '&Size(indexes), 0);~ IF Size(indexes)=1 AND Handle(fieldIndex) = Slice(indexes, 1) { Val contains fieldIndex }~ THEN ACP_attrib(att, obj, JoinText(val, fieldIndex, ',', default:''))~ ELSE Error('If you omit parameter «field», parameter «val» should be a 1D vector indexed by '&Identifier OF fieldIndex&',', 'Error')~ END~ ELSE BEGIN { Specified «field» }~ Local a := ACP_attrib_field1(att, obj);~ field := TextSentenceCase(field);~ FOR f[] := field DO IF NOT SetContains(\fieldIndex, f)~ THEN Error('Field "'& f & '" is not valid for attribute ' & Identifier OF att& ' of object '&Identifier OF obj, 'Error');~ a := IF Size(field)=1 ~ THEN (IF field=fieldIndex THEN val ELSE a)~ ELSE BEGIN~ INDEX fi := CopyIndex(field);~ val := Slice(val, @fi);~ val[fi = fieldIndex, defVal: a]~ END;~ ACP_attrib(att, obj, JoinText(a, fieldIndex, ',', default:''))~ END NodeLocation: 872,112,1 NodeSize: 128,24 NodeInfo: 1,1,1 WindState: 2,131,51,892,739 Button ACP_Test_set_attrib_ Title: Test set_attrib_field() NodeLocation: 1104,108,1 NodeSize: 88,20 OnClick: ACP_test_set_attri1 := ACP_Set_att_field(NodeInfo, Handle(ACP_Example_text_nod), NodeInfo_od_Test_att) Variable ACP_test_set_attri1 Title: test set attrib field result Definition: '1,,,,1,1,,,1,24,8,32,23,23,23,32,0' NodeLocation: 1104,160,1 NodeSize: 88,20 NodeInfo: 1,0,0,,,,,,1 ValueState: 2,1642,817,309,430,,MIDM Index ACP_Attribs_with_fie Att_PrevIndexValue: [NodeSize,NodeLocation,NodeInfo,DiagState,ValueState,NodeFont,NodeFontColor,NodeColor,NumberFormat,WindState,DefnState] Title: Attribs with fields Description: A list of object Attributes that contain multiple fields. Definition: ListOfHandles(NodeSize,NodeLocation,NodeInfo,DiagState,ValueState,Nodefont,NodefontColor,NodeColor,NumberFormat,WindState, DefnState) NodeLocation: 88,112,1 NodeSize: 64,24 MetaOnly: 1 Variable ACP_Field_indexes Title: Field indexes for attribs with fields Description: A handle to the corresponding Field index for each Attribute that contains multiple fields.~ ~ Get_attrib_field(attrib, obj, fields) and Set_attrib_field(attrib, obj, val, fields) use the corresponding Field index when you omit fields as a parameter. ~ ~ If you want these functions to work for another attribute with multiple fields, you can add the attribute to Attributes with fields index, create an index of the fields, and add a handle to it in this table. Definition: Table(ACP_Attribs_with_fie)(Handle(ACP_XY),Handle(ACP_XYZ),Handle(ACP_Nodeinfo_fields),Handle(ACP_DiagState_fields),Handle(ACP_Value_state_fiel),Handle(ACP_NodeFont_fields),Handle(ACP_RGB),Handle(ACP_RGB),Handle(ACP_Number_format_fi),Handle(ACP_WindState_fields),Handle(ACP_DefnState_fields)) NodeLocation: 240,112,1 NodeSize: 72,24 WindState: 2,465,184,812,530 DefnState: 2,560,328,416,303,0,DFNM ValueState: 2,404,60,416,303,,MIDM Button ACP_Test_set_attri2 Title: Test set_attrib_field('corner radius') NodeLocation: 1104,208,1 NodeSize: 88,24 OnClick: ACP_test_set_attri1 := ACP_Set_att_field(NodeInfo, Handle(ACP_Example_text_nod), 24, 'corner radius') Variable ACP_nodefont Title: eg nodefont Definition: Identifier OF self NodeLocation: 280,408,1 NodeSize: 64,24 NodeInfo: 1,,,,,,1 ValueState: 2,1611,578,416,303,,MIDM NodeFont: Arial Black,19 Index ACP_handles_to_objec Att_PrevIndexValue: [ACP_variable,ACP_nodefont,ACP_Example_text_nod,ACP_Attrib_field_ind,ACP_Select_attrib_w_] Title: Eg handles to objects Definition: ListOfHandles(ACP_variable,ACP_nodefont,ACP_Example_text_nod,ACP_Attrib_field_ind,ACP_Select_attrib_w_) NodeLocation: 448,408,1 NodeSize: 64,24 Aliases: Alias ACP_Al96266563 DisplayOutputs: Object Module, Module ACP_Attrib_field_ind MetaOnly: 1 Function ACP_Set_att(att: Attribute Atom; obj: Handle Atom; val) Title: Set_att(att, obj, val) Description: Set the attribute «att» of object «obj», to value «val». ~ ~ It array abstracts nicely if «att» is an array of attributes and/or «obj» is an array of objects.~ ~ It changes Reset_attribs so that any variables depending on Get_attrib() or Get_attrib_field() automatically update after any call to to Set_attrib(), unlike direct changes to attributes (other than Definition or Check attributes) that do not propagate changes to variables that depend on them. Definition: ACP_Reset_attribs := NOT ACP_Reset_attribs;~ att OF obj := val NodeLocation: 872,40,1 NodeSize: 128,24 NodeInfo: 1,1,1 WindState: 2,477,85,733,447 Function ACP_Get_att(att: Atom Attribute; obj: Handle Atom; defVal: = Null; formNode: = False) Title: Get_att(att, obj) Description: Return the attribute «att» of object «obj», normally as a text value --~ except if «att» of «obj» is not defined, it returns «defVal» (default Null), ~ or if «att» contains a list of objects (such as Inputs, Outputs, or Contains), ~ it returns a set (reference to a list ) of the objects (excluding «obj»).~ If formNode=True, it returns attribute «att» of the first formnode (user input or user output) for «obj».~ ~ It array abstracts nicely if «att» is an array of attributes and/or «obj» is an array of objects.~ ~ Any call to Set_attrib() or Set_attrib_field() will cause any variable that uses Get_attrib() to recompute, ~ triggered by Reset_attribs -- unlike any change to an attribute via the user interface or att OF Obj, ~ which does not propagate changes (except for Definition or CheckAttrib). Definition: ACP_Reset_attribs;~ IF formNode THEN IF Aliases OF obj <> Null THEN obj := Slice(Aliases OF obj, 1);~ IF SetContains(\ACP_Attribs_w_object, att) THEN SetDifference(\(att OF obj), \([obj]))~ ELSE BEGIN Local r := (att OF obj);~ IF r=Null THEN defVal~ ELSE r~ END NodeLocation: 448,40,1 NodeSize: 120,24 NodeInfo: 1,1,1 WindState: 2,421,151,876,662 Function ACP_Set_att_field(att: Attribute Atom; obj: Handle Atom; val; field: Text Optional) Title: Set_att_field(att, obj, val, field) Description: Set «field» of attribute «att» of object «obj» to value «val» (leaving other fields as they were). Or if you omit «field», it assumes that val is an array with all fields and the attrib field index corresponding to «att». ~ It returns the new attribute as text with fields separated by commas (as stored internally).~ ~ You can specify «field» as a single field or subset of fields from the corresponding field index, in which case it will leave the other fields unchanged. For example~ Set_attrib_field(DiagState, Handle(aModule), Array(XY, [100, 100], XY)~ sets the top left corner of the Diagram window to x=100, y=100.~ ~ It flags an error if «att» is not an attribute with multiple fields or if «field» is not an element from the attribute's field index (case sensitive.)~ ~ You can see the multi-field Attributes and their corresponding field indexes in Variable ACP_Field_indexes.~ ~ It array abstracts for multiple objects «obj», but not for multiple attributes with different indexes.~ ~ It changes Reset_attribs so that any variables depending on Get_attrib() or Get_attrib_field() will automatically update after any call to to Set_attrib_field(), unlike direct changes to attributes (other than Definition or Check) that do not propagate changes to variables that depend on them. Definition: LocalAlias fieldIndex := ACP_Field_indexes[ACP_Attribs_with_fie=att];~ IF IsNotSpecified(field) THEN BEGIN ~ { Without «field», assume it sets all fields and «val» should be indexed by the fields index for att }~ Local indexes := IndexesOF(val);~ MsgBox('Index expected = '& (Handle(fieldIndex) = Slice(indexes, 1))&' and num indexes = '&Size(indexes), 0);~ IF Size(indexes)=1 AND Handle(fieldIndex) = Slice(indexes, 1) { Val contains fieldIndex }~ THEN ACP_Set_att(att, obj, JoinText(val, fieldIndex, ',', default:''))~ ELSE Error('If you omit parameter «field», parameter «val» should be a 1D vector indexed by '&Identifier OF fieldIndex&',', 'Error')~ END~ ELSE BEGIN { Specified «field» }~ Local a := ACP_Get_att_field(att, obj);~ field := TextSentenceCase(field);~ FOR f[] := field DO IF NOT SetContains(\fieldIndex, f)~ THEN Error('Field "'& f & '" is not valid for attribute ' & Identifier OF att& ' of object '&Identifier OF obj, 'Error');~ a := IF Size(field)=1 ~ THEN (IF field=fieldIndex THEN val ELSE a)~ ELSE BEGIN~ INDEX fi := CopyIndex(field);~ val := Slice(val, @fi);~ val[fi = fieldIndex, defVal: a]~ END;~ ACP_Set_att(att, obj, JoinText(a, fieldIndex, ',', default:'', textForNull:''))~ END NodeLocation: 872,112,1 NodeSize: 128,24 NodeInfo: 1,1,1 WindState: 2,804,12,912,1062 Function ACP_Get_att_field(att: Atom Attribute; obj: Handle Atom; field: Text Optional) Title: Get_att_field(att, obj, field) Description: Assuming «att» is a multi-field attribute, if you omit «field», it returns the values in that attribute of object «obj» as an array indexed by the corresponding field index for «att». Otherwise you can specify «field» as one, some, or all elements of the field index for «att», to get that field( or fieldss) of the attribute. For example:~ INDEX XY := ['X', 'Y'];~ Get_attrib_field(DiagState, Handle(aModule), XY)~ returns the X and Y elements of Diagstate -- i.e. top left corner of the Diagram window indexed by XY.~ ~ It flags an error if «att» is not an attribute with multiple fields or if «field» is not an element from that attribute's field index. You can see the multi-field Attributes and their corresponding field indexes in Variable ACP_Field_indexes.~ ~ It array abstracts for multiple objects «obj», but not for multiple attributes with different indexes. Definition: IF NOT SetContains(\ACP_Attribs_with_fie, att)~ THEN Error('Expecting Attribute '&Identifier OF att&' to be an attribute with multiple fields, which it is not,', 'Error');~ LocalAlias fields := ACP_Field_indexes[ACP_Attribs_with_fie=att];~ Local a := SplitText(ACP_Get_att(att, obj), ',',resultIndex: fields);~ a := ParseNumber(a, badVal: a);~ IF IsNotSpecified(field) THEN a~ ELSE BEGIN~ field := TextSentenceCase(field);~ FOR f[] := field DO IF NOT SetContains(\fields, f)~ THEN Error('Expecting "'& f & '" to be a Field of attribute ' & Identifier OF att&', which it is not.,', 'Error');~ a[fields=field]~ END NodeLocation: 448,112,1 NodeSize: 120,24 NodeInfo: 1,1,1 WindState: 2,93,-10,825,773 Decision ACP_Select_attrib_w_ Title: Select attrib w fields Definition: Choice(ACP_Attribs_with_fie,3,0) NodeLocation: 264,272,1 NodeSize: 64,24 Aliases: FormNode ACP_Fo731000707 FormNode ACP_Fo731000707 Title: Select attrib w fields Definition: 0 NodeLocation: 792,320,1 NodeSize: 168,16 NodeInfo: 1,,,,,,,154,,,,,,0 Original: ACP_Select_attrib_w_ Module ACP_Attrib_field_ind Title: Attrib field indexes Description: Indexes that identify fields used in built-in attributes. Author: Max Henrion~ Lumina Date: Wed, Sep 22, 2021 7:42 PM NodeLocation: 88,176,1 NodeSize: 64,24 DiagState: 2,0,0,386,423,17 DisplayInputs: Object Index, Index ACP_handles_to_objec Index ACP_DiagState_fields Title: DiagState fields Definition: ['Version','X','Y','W','H','Arrows','Tabs','Button style'] NodeLocation: 120,80,1 NodeSize: 64,24 ValueState: 2,909,655,416,303,,MIDM Index ACP_XYZ Title: XYZ Description: Index with fields 'X', 'Y', and 'Z', for example used by NodeLocation attribute. Definition: Concat(ACP_XY, 'Z') NodeLocation: 280,192,1 NodeSize: 64,24 WindState: 2,98,82,720,350 Index ACP_XY Att_PrevIndexValue: ['X','Y'] Title: XY Definition: ['X','Y'] NodeLocation: 120,192,1 NodeSize: 64,24 WindState: 2,105,534,720,350 Index ACP_Value_state_fiel Title: Value state fields Definition: ['Version','X','Y','W','H','Graph','Uncertainty view'] IndexVals: ['item 1'] NodeLocation: 280,80,1 NodeSize: 64,24 ValueState: 2,516,522,416,303,,MIDM Index ACP_Nodeinfo_fields Att_PrevIndexValue: ['Version','Showinputs','Showoutputs','Showlabel','Showborder','Fill','Use node font','Formwidth','Show bevel','Show form icon','Embed','Visibility','Justification','Control on left','Tab advance on enter','Vertical justifiy label','Vertical align button','Corner radius'] Title: NodeInfo Fields Description: Fields of the NodeInfo attribute.~ Definition: ['Version','Showinputs','Showoutputs','Showlabel','Showborder','Fill','Use node font','Formwidth','Show bevel','Show form icon','Embed','Visibility','Justification','Control on left','Tab advance on enter','Vertical justifiy label','Vertical align button','Corner radius'] NodeLocation: 280,136,1 NodeSize: 64,24 WindState: 2,96,0,628,744 ValueState: 2,1480,265,436,488,,MIDM Index ACP_RGB Title: RGB Description: Index for colors stored as Red, Green, and Blue, for example NodeColor or NodeFontcolor attributes. Definition: ['R','G','B'] NodeLocation: 120,360,1 NodeSize: 64,24 Index ACP_NodeFont_fields Title: NodeFont fields Definition: ['Font','Font size'] IndexVals: ['item 1'] NodeLocation: 120,136,1 NodeSize: 64,24 Text ACP_Te51053187 Title: Attribute field indexes NodeLocation: 204,212,-1 NodeSize: 156,188 NodeInfo: 1,,,,1,1 Index ACP_Number_format_fi Title: Number format fields Definition: ['i2','Formatcode','proxy','zeroes','separators','currency','Digits','trailingZeros','currencysymbol','currencyPlacement','datetemplate','fullPrecision','fullDateTemplate',' relReqForFullDateTemplate','datesAsNumbers','numbersAsDates','digitsForGeneralFmt'] NodeLocation: 120,248,1 NodeSize: 64,24 WindState: 2,491,167,673,397 ValueState: 2,716,230,324,437,,MIDM Index ACP_XYWH Title: XYWH Description: Index with fields for top left corner (X and Y), width W, and height H, which may be used when getting or setting these values in DiagState, ValueState, or WindState. Definition: ['X','Y','W','H'] NodeLocation: 280,248,1 NodeSize: 64,24 WindState: 2,727,531,720,350 Index ACP_WindState_fields Title: WindState fields Description: Fields of the WindState attribute Definition: ['Version','X','Y','W','H'] NodeLocation: 120,304,1 NodeSize: 64,24 WindState: 2,378,549,720,261 ValueState: 2,516,522,416,303,,MIDM Index ACP_DefnState_fields Title: DefnState fields Description: Fields of the WindState attribute Definition: ['Version','X','Y','W','H','Unknown','View'] NodeLocation: 280,304,1 NodeSize: 64,24 WindState: 2,378,549,720,261 ValueState: 2,516,522,416,303,,MIDM Alias ACP_Al96266563 Title: Eg handles to objects Definition: 0 NodeLocation: 328,488,1 NodeSize: 80,24 Original: ACP_handles_to_objec Close ACP_Attrib_field_ind Text ACP_Te259320131 Title: Examples NodeLocation: 580,328,-3 NodeSize: 404,176 NodeInfo: 1,,,,1,1 Decision ACP_Select_objects Title: Select objects Definition: Choice(ACP_handles_to_objec,0,eval:0) NodeLocation: 448,336,1 NodeSize: 64,24 Aliases: FormNode ACP_Fo924641603 FormNode ACP_Fo924641603 Title: Select objects Definition: 0 NodeLocation: 792,208,1 NodeSize: 168,16 NodeInfo: 1,,,,,,,184,,,,,,0 Original: ACP_Select_objects Variable ACP_Get_Attrib_field Title: eg Get_ Attrib_field() Definition: ACP_Get_att_field( ACP_Select_attrib_w_, ACP_Select_objects) NodeLocation: 448,272,1 NodeSize: 64,24 ValueState: 2,641,155,1076,522,,MIDM Aliases: FormNode ACP_Fo1973217603 ReformVal: [ACP_XY,ACP_handles_to_objec] FormNode ACP_Fo1973217603 Title: eg Attrib fields from object(s) Definition: 1 NodeLocation: 848,352,1 NodeSize: 112,16 NodeInfo: 1,,,,,,,16,,,,,,0 Original: ACP_Get_Attrib_field Index ACP_Text_attributes Title: Text attributes Definition: ListOfHandles(Class, Identifier, Units, Description, Definition) NodeLocation: 80,240,1 NodeSize: 64,24 Decision ACP_Selected_attribs Title: Selected attribs Definition: MultiChoice(Self,1,3,10,14,15,19) NodeLocation: 264,208,1 NodeSize: 64,24 Aliases: FormNode ACP_Fo1342368067 {!40300|DomainExpr: Concat(Concat(ACP_Text_attributes, ACP_Attribs_w_object), ACP_Attribs_with_fie)} FormNode ACP_Fo1342368067 Title: Selected attribs Definition: 0 NodeLocation: 792,240,1 NodeSize: 168,16 NodeInfo: 1,,,,,,,184,,,,,,0 Original: ACP_Selected_attribs Variable ACP_variable Title: eg variable Definition: 100^2 NodeLocation: 280,344,1 NodeSize: 64,24 Variable ACP_Get_att1 Title: eg Get_att() Definition: ACP_Get_att(ACP_Selected_attribs, ACP_Select_objects) NodeLocation: 536,208,1 NodeSize: 64,24 ValueState: 2,895,73,838,198,,MIDM Aliases: FormNode ACP_Fo1111681347 FormNode ACP_Fo1111681347 Title: eg Get_att() Definition: 1 NodeLocation: 848,272,1 NodeSize: 112,16 NodeInfo: 1,,,,,,,16,,,,,,,,,, Original: ACP_Get_att1 {!50500|ArrowClass ACP_Arrow375883075} {!50500|Att_HeadNode: ACP_Get_att1} {!50500|Att_TailNode: ACP_Get_att} {!50500|Att_ArrowWayPoints: [Null,Null,41,0.23809523809523808,49,0.47619047619047616]} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass ACP_Arrow1902609731} {!50500|Att_HeadNode: ACP_Get_Attrib_field} {!50500|Att_TailNode: ACP_Get_att_field} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass ACP_Arrow1666680131} {!50500|Att_HeadNode: ACP_Get_att1} {!50500|Att_TailNode: ACP_Select_objects} {!50500|Att_ArrowWayPoints: [-0.8951737173277154,Null,1,0.1875]} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass ACP_Arrow851428675} {!50500|Att_HeadNode: ACP_handles_to_objec} {!50500|Att_TailNode: ACP_Select_attrib_w_} {!50500|Att_ArrowWayPoints: [Null,Null,0.4782608695652174,0.2777777777777778,0.6086956521739131,0.6111111111111112]} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass ACP_Arrow381666627} {!50500|Att_HeadNode: ACP_handles_to_objec} {!50500|Att_TailNode: ACP_Attrib_field_ind} {!50500|Att_ArrowWayPoints: [Null,-153.90457060562727,0.2222222222222222,0.2,0.3111111111111111,0.5333333333333333,0.6666666666666666,0.5666666666666667,0.7777777777777778,0.7666666666666667]} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass ACP_Arrow276809027} {!50500|Att_HeadNode: ACP_Select_attrib_w_} {!50500|Att_TailNode: ACP_Attribs_with_fie} {!50500|Att_ArrowWayPoints: [Null,Null,0.4090909090909091,0.3,0.5454545454545454,0.75]} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass ACP_Arrow1384105283} {!50500|Att_HeadNode: ACP_Selected_attribs} {!50500|Att_TailNode: ACP_Attribs_w_object} {!50500|Att_ArrowWayPoints: [Null,-157.1663411041452,0.4090909090909091,0.23809523809523808,0.4090909090909091,0.5714285714285714]} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass ACP_Arrow1719649603} {!50500|Att_HeadNode: ACP_Selected_attribs} {!50500|Att_TailNode: ACP_Attribs_with_fie} {!50500|Att_ArrowWayPoints: [Null,-172.87498389323082,0.4090909090909091,0.4166666666666667]} {!50500|Att_ArrowProperties: 1} Close ACP_Get_and_set_atts Library ACP_Find_objects_in_ Title: Find objects in modules Description: A library of functions to return lists of objects from modules.~ ~ Copyright 2021 Lumina Decision Systems, Inc. Author: Alex Graham Date: Thu, Jun 22, 2006 11:43 AM DefaultSize: 48,24 NodeLocation: 96,96,1 NodeSize: 88,24 DiagState: 2,34,169,1121,630,23,, WindState: 2,241,291,673,408 FontStyle: Arial,15 OutlinerState: 2,274,34,450,532 {!40400|Att_clearTypeFonts: 1} Decision ACP_Excluded_module Title: Excluded module Description: The identifier of module to be excluded from submodules(), when computing all the modules in this model. This is usually used to exclude this library. Definition: Handle(ACP_Styles) NodeLocation: 568,464,1 NodeSize: 100,20 WindState: 2,561,195,473,547 ValueState: 2,526,328,416,303,0,MIDM {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Decision ACP_Node_order_by_mo Title: Node order by module Description: Specify how to order the listing of objects within each module:~ Original order -- the order the objects were created~ Alphabetic -- by identifier~ Top to bottom -- by node center as arranged in the diagram, and left to right for nodes aligned horizontally.~ Left to right -- by node center as arranged in the diagram, and top to bottom for nodes aligned vertically. Definition: Choice(Self,1,0) NodeLocation: 816,520,1 NodeSize: 100,20 WindState: 2,-15,240,524,536 ValueState: 2,536,546,416,303,0,MIDM Aliases: FormNode ACP_New412318595 {!40300|DomainExpr: Discrete('Original order','Alphabetic','Top to bottom','Left to right',type:['text'])} Decision ACP_Which_modules_to Title: Which modules to list? Description: Select which modules for which to generate the listing:~ * Only the parent module containing 'Write model listing'~ * The parent module and all its submodules~ * All modules in this model~ In all cases, it excludes this module, 'Write model listing' from the listing. Definition: Choice(Self,3,0) NodeLocation: 812,216,1 NodeSize: 100,20 WindState: 2,991,617,501,380 Aliases: FormNode ACP_New1754495875 {!40300|DomainExpr: Discrete('Only parent module','Parent and its submodules','All modules in this model',type:['text'])} Variable ACP_Selected_modules Att_PrevIndexValue: [ACP_Styles,ACP_style_lib_detai1,ACP_Object_attribs_l,ACP_attrib_access,Undefined,ACP_Get_and_set_atts,ACP_Attrib_field_ind,Undefined,ACP_Find_objects_in_,ACP_Check_Object_Cla,ACP_Prefixer_library,ACP_IT_prefixer_deta,ACP_Module_reviewer,ACP_IT_and_alias_fun,ACP_Prefixer_functio,ACP_Style_lib_detail,ACP_Dashboard_sizes,Undefined,ACP_autocalc_by_Diag,Undefined,ACP_old_autocalc,ACP_autocalc_UI,Undefined,Undefined,Undefined,Undefined,Undefined,Undefined,Undefined,ACP_Top_styles,ACP_esoteric_styles,Undefined,ACP_Set_non_default_,ACP_styles_for_nodes,Undefined] Title: Selected modules Definition: Metavar parmod:= ACP_Parent_module( Handle(self) ) ;~ IF IsNull(parmod) THEN Error('Expecting a parent Module: You must add this library into the Model you want to modify.')~ ELSE BEGIN~ Metavar topMod := IF ACP_Which_modules_to = 'All modules in this model' ~ THEN ACP_Top_model ~ ELSE ACP_Parent_module(parmod);~ IF ACP_Which_modules_to = 'Only parent module' ~ THEN ACP_Listofone(topMod) ~ ELSE ACP_Submodules( topMod )~ END NodeLocation: 568,216,1 NodeSize: 100,20 WindState: 2,805,278,506,606 ValueState: 2,423,340,299,372,0,MIDM Aliases: Alias ACP_Al723978115 Function ACP_Submodules(m: Handle) Title: Submodules(m) Description: Returns a list of all the submodules (including m) of the module m, ~ excluding the module in Excluded_module, usually the name of this module library. Definition: Metavar res := [m];~ Metavar c := contains of m ;~ IF IsNull(c) THEN res~ ELSE BEGIN~ Metavar v[] := c DO BEGIN~ IF ACP_Isamodule( v) AND v<>ACP_Excluded_module~ THEN res := Concat(res, ACP_Submodules(v)) ELSE 0;~ END; ~ copyindex( res )~ END~ NodeLocation: 336,104,1 NodeSize: 100,20 NodeInfo: 1,1,1 WindState: 2,255,85,800,547 Recursive: 1 Function ACP_Objectsinmod(m: Handle) Title: ObjectsInMod(m) Description: Returns a list of all the objects in Module m, excluding m, and not recursively to objects in submodules. If none, it returns an Empty list. Definition: Metavar c := Contains OF m;~ IF IsNull(c) ~ THEN NULL ~ ELSE( ~ Metaindex ind := c;~ Metaindex i:= Subset(ind <>ACP_Excluded_module);~ i~ )~ NodeLocation: 336,466,1 NodeSize: 100,20 NodeInfo: 1,1,1 WindState: 2,601,195,875,526 DisplayOutputs: Object Function, Function ACP_Summary_of_modul Function ACP_Listofone(x) Title: ListofOne(x) Description: Returns a list containing the value of x as its only element. Definition: [x] NodeLocation: 568,48,1 NodeSize: 100,20 NodeInfo: 1,1,1 WindState: 2,243,335,476,224 Function ACP_Objectsbymodule(m: Handle) Title: ObjectsByModule(m) Description: Returns a list of all objects in module m, and its submodules, grouped by module. Definition: Metavar res := [m];~ Metavar c := ACP_Objectsinmod(m);~ IFONLY c = ACP_Empty_list THEN res~ ELSE BEGIN~ Metavar v[] := c DO ( ~ IF ACP_Isamodule(v) AND v <> ACP_Excluded_module~ THEN res := Concat(res, ACP_Objectsbymodule(v)) ~ ELSE res := Concat(res, [v]); 0);~ res~ END NodeLocation: 336,156,1 NodeSize: 100,20 NodeInfo: 1,1,1 WindState: 2,614,172,738,536 Recursive: 1 Function ACP_Orderobjs(olist: Handle; method: Text) Title: OrderObjs(olist, method) Description: Given list of object identifiers v, it orders them according to method ~ Original order -- order nodes were created~ Alphabetic -- by module~ Top to bottom -- left to right for nodes at the same Y location.~ Left to right -- top to bottom for nodes at same X location. Definition: IF method = 'Original order' THEN CopyIndex(olist)~ ELSE IF method = 'Alphabetic' THEN SortIndex(olist)~ ELSE BEGIN~ Metavar locs := ACP_Get_att_field(NodeLocation, (olist), ACP_XY);~ VAR xy_ratio := (IF method = 'Top to bottom' THEN 0.05 ELSE 20);~ IF method <> 'Left to right' AND method <> 'Top to bottom' ~ THEN "Error: Unknown value "&method&" for 'Node order by module'"~ ELSE SortIndex(locs[ACP_XY = 'X'] *xy_ratio + locs[ACP_XY = 'Y'])~ END NodeLocation: 336,592,1 NodeSize: 100,20 NodeInfo: 1,1,1 WindState: 2,1496,306,960,864 {!40500|ParameterEnumeration: method~ 'Original order'| in which objects were defined~ 'Alphabetic'| by Identifier~ 'Top to bottom'| Node location from top to bottom (then left to right)~ 'Left to right'| Node location from left to right (then top to bottom)} Index ACP_Objects_in_this_ Title: Objects in this module Definition: ACP_Objectsinmod( ACP_handle_to_this_m) NodeLocation: 1032,464,1 NodeSize: 64,24 ValueState: 2,232,242,305,488,0,MIDM Variable ACP_Eg2 Title: Eg2 Definition: ACP_Orderobjs( ACP_Objects_in_this_, method: ACP_Node_order_by_mo ) NodeLocation: 568,592,1 NodeSize: 100,20 ValueState: 2,195,791,708,367,0,MIDM ReformVal: [0,ACP_Objects_in_this_] Function ACP_Objs_ordered_by_(m: Handle; method: Text) Title: Objs_Ordered_By_Mod(m, method) Description: Returns a list of identifiers of all objects in module m, and its submodules, grouped by module, ordered within each module by specified method.~ ~ It does not search Excluded_module, usually set to this library or a module containing all libraries. Definition: Metavar res := [m];~ Metavar c := ACP_Objectsinmod(m);~ IFONLY c = ACP_Empty_list THEN res~ ELSE BEGIN~ Metavar objs := ACP_Orderobjs(c, method);~ Metavar o[] := objs Do BEGIN~ IF ACP_Isamodule(o)~ THEN(~ IF o <> ACP_Excluded_module~ THEN res := Concat(res, ACP_Objs_ordered_by_(o, method))~ ELSE 0;~ )~ ELSE res := Concat(res, [o]);~ END; ~ res~ END NodeLocation: 336,404,1 NodeSize: 100,20 NodeInfo: 1,1,1 WindState: 2,135,97,679,542 Recursive: 1 {!40500|ParameterEnumeration: method~ 'Original order'| in which objects were defined~ 'Alphabetic'| by Identifier~ 'Top to bottom'| Node location from top to bottom (then left to right)~ 'Left to right'| Node location from left to right (then top to bottom)} Variable ACP_Eg1 Title: Eg1 Definition: ACP_Objs_ordered_by_( ACP_handle_to_this_m , ACP_Node_order_by_mo) NodeLocation: 824,408,1 NodeSize: 100,20 ValueState: 2,699,6,368,801,0,MIDM Variable ACP_Empty_list Title: Empty list Definition: 'empty list' NodeLocation: 112,160,1 NodeSize: 72,24 WindState: 2,102,83,476,224 ValueState: 2,40,50,416,303,0,MIDM Function ACP_Parent_module(o: Handle) Title: Parent_module(o) Description: Returns the identifier of the module containing object o. Definition: Isin OF o NodeLocation: 336,218,1 NodeSize: 100,20 NodeInfo: 1,1,1 WindState: 2,382,224,524,536 Variable ACP_handle_to_this_m Title: eg handle to this module Definition: Isin OF Self NodeLocation: 816,464,1 NodeSize: 104,24 WindState: 2,94,85,476,224 ValueState: 2,360,370,416,303,0,MIDM Variable ACP_Top_model Title: Top model Description: The main model (top level module) for this model. Definition: VAR m := Handle(Self); ~ WHILE Not IsUndef(Isin OF m) DO m := ISIN OF m;~ m; NodeLocation: 816,280,1 NodeSize: 104,24 ValueState: 2,766,360,416,303,0,MIDM Function ACP_Indented_modules(m: Handle; nIndents: = 0; indentChar: = '>'; nLevels: = INF) Title: Indented_modules(m) Description: Returns a list of the titles of the submodules of module m (including m) and recursively downwards nLevels (defaults to unlimited levels), indented by nIndents spaces plus indentChar to show the hierarchy.~ It excludes the module in ACP_Excluded_module (and any modules it contains). Definition: VAR indent := (Index i := Sequence(1, nIndents, strict:False); Jointext(ACP_Indent_for_Modul, i));~ Metavar res := [indent & ACP_Indent_char &(Title OF m)];~ Metavar c := Contains of m ;~ IF IsNull(c) THEN res~ ELSE BEGIN~ Metavar v[] := c DO BEGIN ~ IF ACP_Isamodule(v) AND v<>ACP_Excluded_module~ THEN res := Concat(res, ACP_Indented_modules(v, nIndents+1)) ELSE 0;~ END; ~ res~ END~ NodeLocation: 336,342,1 NodeSize: 100,20 NodeInfo: 1,1,1 WindState: 2,693,354,735,605 Recursive: 1 Variable ACP_Test_indented_mo Title: Test indented_modules Definition: Var top := ACP_Top_model;~ INDEX i := ACP_Indented_modules(top);~ Array(i, ACP_Submodules(top)) NodeLocation: 568,344,1 NodeSize: 100,20 ValueState: 2,136,145,1001,742,0,MIDM Module ACP_Check_Object_Cla Title: Check Object Class Author: Lumina Date: Fri, Dec 18, 2015 5:19 PM NodeLocation: 112,280,1 NodeSize: 72,24 DiagState: 2,1173,37,489,461,23 Function ACP_Submodules_unfil(m: Handle) Title: Submodules_unfiled(m) Description: A list of all the submodules (including m) of the module m, and recursively downwards, excluding any separately filed modules (Model, LinkLibrary, LinkModule), the module in Excluded_module (and any modules it contains). You may use the Excluded_module to exclude this module library or a module containing all libraries. Definition: Metavar res := [m];~ Metavar c := contains of m ;~ IF IsNull(c) THEN res~ ELSE BEGIN~ Metavar v[] := c DO BEGIN ~ IF ACP_IsanUnfiledModul(v) AND v<>ACP_Excluded_module~ THEN res := Concat(res, ACP_Submodules_unfil(v)) ELSE 0;~ END; ~ res~ END~ NodeLocation: 296,328,1 NodeSize: 100,24 NodeInfo: 1,1,1 WindState: 2,494,476,754,617 Recursive: 1 Index ACP_Variable_classes Title: Variable classes Definition: ['Variable','Index','Decision','Chance','Objective','Constant','Constraint'] NodeLocation: 120,56,1 NodeSize: 64,24 WindState: 2,102,89,476,321 Function ACP_IsaVariable(o: Handle) Title: IsaVariable(o) Description: True if the class of object o is a Variable (including Chance, Decision, Index, Constant, Constraint), otherwise False Definition: SetContains(\ACP_Variable_classes, Class OF o) NodeLocation: 296,56,1 NodeSize: 100,24 WindState: 2,982,377,605,365 DisplayOutputs: Object Function, Function ACP_Summary_of_modul Index ACP_Filed_Module_cla Title: Filed Module classes Description: Classes of Object that are a kind of Module. Definition: ['Model','LinkLibrary','LinkModule'] IndexVals: ['item 1'] NodeLocation: 120,192,1 NodeSize: 64,24 Function ACP_IsaFiledModule(o: Handle) Title: IsaFiledModule(o) Description: True if the class of object o is a separately Filed Module (Model, LinkModule, or LinkLibrary), otherwise False Definition: Sum((Class OF o) = ACP_Filed_Module_cla, ACP_Filed_Module_cla)>0 NodeLocation: 296,192,1 NodeSize: 100,24 WindState: 2,982,377,605,365 Index ACP_Unfiled_Module_c Title: Unfiled Module classes Description: Classes of Object that are a kind of Module that is not separately filed, i.e. Module or Library (but not Model, LinkModule or LinkLibrary). Definition: ['Module','Library'] IndexVals: ['item 1'] NodeLocation: 120,264,1 NodeSize: 64,24 WindState: 2,941,70,476,224 Function ACP_IsanUnfiledModul(o: Handle) Title: IsanUnfiledModule(o) Description: True if the class of object o is a Module (Module, or Library) that is not Filed Modules (Model, LinkModule, or LinkLibrary), otherwise False Definition: Sum((Class OF o) = ACP_Unfiled_Module_c, ACP_Unfiled_Module_c)>0 NodeLocation: 296,264,1 NodeSize: 100,24 WindState: 2,138,574,605,365 Index ACP_Module_classes Title: Module classes Description: Classes of Object that are a kind of Module. Definition: ['Form','Library','Model','Module','Linklibrary','Linkmodule'] NodeLocation: 120,128,1 NodeSize: 64,24 Function ACP_Isamodule(o: Handle) Title: IsaModule(o) Description: True if the class of object o is a Module (Model, Module, Form, Library, LinkModule, or LinkLibrary), otherwise False Definition: SetContains(\ACP_Module_classes, Class OF o) NodeLocation: 296,128,1 NodeSize: 100,24 WindState: 2,494,503,846,281 DisplayOutputs: Object Function, Function ACP_Summary_of_modul Close ACP_Check_Object_Cla Constant ACP_Indent_for_Modul Title: Indent for Module Hierarchy Description: Indent, usually 4 spaces, used when displaying a module hierarchy with indentation to reflect the structure. Definition: ' ' NodeLocation: 112,344,1 NodeSize: 72,24 Variable ACP_Asl_Eg0 Title: Eg0 Definition: ACP_Objectsbymodule(ACP_Top_model) NodeLocation: 812,152,1 NodeSize: 100,20 WindState: 2,190,125,503,342 ValueState: 2,526,59,623,868,0,MIDM Variable ACP_Asl_Eg2 Title: Eg2 Definition: ACP_Orderobjs( ACP_Objects_in_this_, ACP_Node_order_by_mo) NodeLocation: 816,592,1 NodeSize: 100,20 WindState: 2,102,83,476,224 ValueState: 2,319,68,708,367,0,MIDM ReformVal: [0,ACP_Objects_in_this_] Variable ACP_Asl_Eg1 Title: Eg1 Definition: ACP_Objs_ordered_by_(ACP_handle_to_this_m , ACP_Node_order_by_mo) NodeLocation: 560,408,1 NodeSize: 100,20 ValueState: 2,152,109,368,801,0,MIDM Variable ACP_Asl_X Title: x Definition: ~ FOR v := ACP_Objectsinmod( ACP_handle_to_this_m ) DO Class OF v = 'Index' NodeLocation: 568,522,1 NodeSize: 100,20 WindState: 2,102,83,476,224 ValueState: 2,101,491,416,303,0,MIDM Function ACP_ObjectsinModule_(m: Handle; cl: Text) Title: ObjectsinModule_Class(m, c) Description: Returns a list of all the objects with Class cl in Module m, excluding m, and not recursively to objects in submodules. If none, it returns an Empty list. Definition: {Try(...) call handles error that occurs when module doesn't have any node i.e. EW 16165}~ Try(Subset(FOR v := ACP_Objectsinmod( m ) DO Class OF v = cl), catch:[]) NodeLocation: 336,536,1 NodeSize: 104,24 NodeInfo: 1,1,1 WindState: 2,319,145,594,327 Function ACP_Submodules1(m: Module; includeM, subModules, includeLibraries, includeLinkfiles: = False) Title: Submodules(m) Description: Returns a set of the modules in module m, ~ includeM: Set true to include module or model m in the set returned.~ subModules: Set true to include modules in submodules etc -- by default it includes only modules directly in m.~ includeLibraries: Set true to include library modules.~ includeLinkFiles: Set true to include linked modules and libraries -- i.e. in separate files.~ It does not return Excluded_modules (usually the parent library). Definition: INDEX s := ~ IF includeLibraries ~ THEN IF includeLinkFiles ~ THEN #FindObjects(withinAny: m, class: Model, Module, LinkModule,~ Library, LinkLibrary, inclusive: includeM)~ ELSE #FindObjects(withinAny: m, class: Model, Module, Library, ~ inclusive: includeM)~ ELSE IF includeLinkFiles ~ THEN #FindObjects(withinAny: m, class: Model, Module, LinkModule, inclusive: includeM)~ ELSE #FindObjects(withinAny: m, class: Model, Module, ~ inclusive: includeM); ~ ~ IF NOT submodules THEN \Subset(Isin OF (s)=m OR (s)=m) ELSE s NodeLocation: 328,48,1 NodeSize: 100,20 NodeInfo: 1,1,1 WindState: 2,1044,36,873,732 Variable ACP_submodules2 Title: eg submodules Definition: ACP_Submodules1(Handle(ACP_Check_Object_Cla), includeM: False, subModules: False) NodeLocation: 812,48,1 NodeSize: 100,20 ValueState: 2,1355,382,416,303,,MIDM Constant ACP_Indent_char Title: Indent char Definition: '> ' NodeLocation: 112,400,1 NodeSize: 72,24 Variable ACP_Module_by_indent Title: Module by indented module Definition: Array(ACP_Indented_modul1, ACP_Submodules(ACP_Top_model)) NodeLocation: 1032,280,1 NodeSize: 64,24 ValueState: 2,136,145,1001,742,0,MIDM Index ACP_Indented_modul1 Att_PrevIndexValue: ['> ACP Styles',' > ACP style lib details',' > Object attribs library',' > Old attrib access',' > Get and set attributes library',' > Attrib field indexes',' > Find objects in modules',' > Check Object Class',' > Prefixer library',' > Prefixer details',' > Module reviewer',' > IO and alias functions',' > Prefixer functions',' > ACP Style lib details',' > Dashboard sizes',' > Top styles',' > Set autocalc',' > ACP old autocalc',' > old autocalc UI',' > ACP styles for nodes details',' > ACP not in use',' > ACP Frame views',' > ACP styles in progress',' > Add and arrange nodes library',' > Make and copy objects',' > Add frames to diagrams',' > Show View in Frame',' > Frame and tall node styles',' > Esoteric ACP styles',' > Set non-default styles'] Title: Indented modules Definition: ACP_Indented_modules(ACP_Top_model) NodeLocation: 1032,192,1 NodeSize: 64,24 ValueState: 2,136,145,1001,742,0,MIDM FormNode ACP_New1754495875 Title: Which modules to list? Definition: 0 NodeLocation: 828,332,1 NodeSize: 132,12 Original: ACP_Which_modules_to FormNode ACP_New412318595 Title: Node order by module Definition: 0 NodeLocation: 860,360,1 NodeSize: 164,16 NodeInfo: 1,,,,,,,144 Original: ACP_Node_order_by_mo Close ACP_Find_objects_in_ Library ACP_Prefixer_library Title: Prefixer library Description: Library to add a prefix to the identifiers of all objects in a selected module. This helps avoid duplicate identifiers when a team is working on a large model, with each modeler working on a separate module. You apply a different prefix for the identifiers in each major module to prevent duplicate. It also lets you create multiple copies of a module that you can use in the same model, with unique identifiers for variables in each copy. Author: Max Henrion Date: Mon, Mar 19, 2007 11:49 PM NodeLocation: 312,32,1 NodeSize: 72,24 DiagState: 2,87,68,653,303,17 WindState: 2,179,257,789,366 {!40300|ProactivelyEvaluate: 5} Module ACP_IT_prefixer_deta Title: Prefixer details Description: Details of the Prefixer, including key function libraries, Prefixer and Module reviewer libraries. Author: Max Henrion Date: Wed 24-Oct-07 1:55 AM DefaultSize: 48,24 NodeLocation: 312,216,1 NodeSize: 56,24 DiagState: 2,462,115,598,346,23 Variable ACP_reset Title: reset Description: Change to regenerate the list of formal modules. Definition: 1 NodeLocation: 376,40,1 NodeSize: 64,24 WindState: 2,381,533,652,399 ValueState: 2,0,-23,1024,640,0,MIDM DisplayOutputs: Object Object, Object Function Library ACP_Module_reviewer Title: Module reviewer Description: Functions for reviewing modules, including identifying number and percentage of objects that contain descriptions. Author: Lumina Date: Tue, Dec 15, 2015 3:20 PM NodeLocation: 80,224,1 NodeSize: 64,24 DiagState: 2,0,6,944,344,23 WindState: 2,102,89,476,224 {!40300|ProactivelyEvaluate: 5} Index ACP_Module_review_fi Att_PrevIndexValue: ['Identifier','Objects','Modules','No Description','IO nodes','IO no Description','No Title','No Units','No Definition','Incomplete vars'] Title: Module review fields Definition: ['Identifier','Objects','Modules','No Description','IO nodes','IO no Description','No Title','No Units','No Definition','Incomplete vars'] IndexVals: ['item 1'] NodeLocation: 80,160,1 NodeSize: 56,24 DisplayOutputs: Object Function, Function ACP_Summary_of_modul Decision ACP_Select_module2 Title: Select module Definition: Choice(ACP_Selected_modules,1,0,result:ACP_Selected_modules) NodeLocation: 560,32,1 NodeSize: 64,24 WindState: 2,405,156,555,434 Aliases: Alias ACP_New76774275 DisplayOutputs: Object Library, Library ACP_IT_and_alias_fun Library ACP_IT_and_alias_fun Title: IO and alias functions Author: Lumina Date: Tue, Dec 15, 2015 6:25 PM NodeLocation: 328,32,0 NodeSize: 64,24 DiagState: 2,400,17,818,283,21 DisplayInputs: Object Decision, Decision ACP_Select_module2 {!40300|ProactivelyEvaluate: 5} Function ACP_IT_Alias_type(v: Handle) Title: Alias_type(v) Description: If v is a FormNode it returns 'User input' or 'User output' according to which type it is. If it is a regular Alias or other type of object, it returns its corresponding type. Definition: IF TypeOf(v) = 'FormNode' THEN IF (Definition OF v) = '0' THEN 'User input' ELSE 'User output'~ ELSE TypeOf(v) NodeLocation: 112,96,1 NodeSize: 96,16 WindState: 2,420,183,806,329 Variable ACP_Test_xx Title: Test xx Definition: 1 NodeLocation: 456,32,1 NodeSize: 48,24 ValueState: 2,424,433,416,303,1,MIDM Aliases: FormNode ACP_New1486060419, FormNode ACP_New949189507, Alias ACP_New2022931331 Function ACP_IT_Aliases_of(v: Variable) Title: Aliases_of(v) Description: True of variable v has an input node. Definition: (Aliases OF v) NodeLocation: 112,32,1 NodeSize: 96,16 WindState: 2,627,419,496,296 Variable ACP_Test_Aliases_of Title: Test Aliases_of() Definition: ACP_IT_Aliases_of(ACP_Test_xx) NodeLocation: 312,32,1 NodeSize: 64,24 ValueState: 2,1121,385,416,303,0,MIDM Variable ACP_IT_Alias_type_te Title: Alias type test Definition: ACP_IT_Alias_type(ACP_Test_Aliases_of) NodeLocation: 312,96,1 NodeSize: 64,24 ValueState: 2,741,123,416,303,0,MIDM Function ACP_Has_User_IO_node(v: Object) Title: Has_User_IO_node(v) Description: True if variable v has a user input or user output node. Definition: MetaVAR a := (Aliases OF v);~ IF IsNull(a) THEN 0~ ELSE Sum(Metavar i[] := a DO ACP_IT_Alias_type(i)='User input' OR ACP_IT_Alias_type(i) = 'User output')>0 NodeLocation: 112,160,1 NodeSize: 96,16 WindState: 2,595,80,557,425 DisplayOutputs: Object Function, Function ACP_Summary_of_modul Variable ACP_Test_Has_User_IO Title: Test Has_User_IO Definition: Metavar v[] := ACP_Objectsinmod(ACP_Select_module2) DO ACP_Has_User_IO_node(v) NodeLocation: 312,160,1 NodeSize: 64,24 ValueState: 2,400,484,450,415,0,MIDM Function ACP_Var_has_data1(v: Variable) Title: Var_has_data(v) Description: Returns true (1) if variable v contains data -- i.e. it is a scalar variable containing a literal number or text,~ or a Table whose only inputs are indexes (it does not contain expressions). ~ It returns False for a Index or Function.~ ~ (It does not treat Determtable, ProbTable, Subtable or Multitable as Inputs) Definition: VAR c := Class OF v;~ IF c = 'Index' OR c = 'Function' THEN 0~ ELSE IF Size(Inputs OF v) = 0 THEN 1~ ELSE IF TextUppercase(SelectText(TextTrim(Definition OF v), 1, 5)) <> 'TABLE' THEN 0~ ELSE Sum(For i := Inputs OF v DO (Class OF i) <> 'Index')=0 NodeLocation: 112,224,1 NodeSize: 96,16 WindState: 2,436,57,659,573 FormNode ACP_New1486060419 Title: xx Definition: 0 NodeLocation: 604,24,1 NodeSize: 84,16 Original: ACP_Test_xx FormNode ACP_New949189507 Title: xx Definition: 1 NodeLocation: 604,64,1 NodeSize: 84,16 Original: ACP_Test_xx Alias ACP_New2022931331 Title: xx Definition: 1 NodeLocation: 752,32,1 NodeSize: 48,24 Original: ACP_Test_xx Alias ACP_New76774275 Title: Select module Definition: 1 NodeLocation: 528,160,1 NodeSize: 48,24 Original: ACP_Select_module2 Close ACP_IT_and_alias_fun Decision ACP_Min_description_ Title: Min description length Description: Any object with a description with fewer chars is treated as missing its description. Definition: 40 NodeLocation: 80,96,1 NodeSize: 56,24 DisplayOutputs: Object Function, Function ACP_Summary_of_modul Function ACP_Summary_of_modul(m: Handle) Title: Summary_of_module(m) Description: Returns summary information for module m over Mod review fields. Definition: VAR inv := ACP_Objectsinmod(m); ~ IF IT_Module_review_fie='Identifier' THEN Identifier OF m~ ELSE IF Size(inv) = 1 THEN IF Slice(inv, 1) = IT_Empty_list THEN 0 ELSE 1~ ELSE IF IT_Module_review_fie='Objects' THEN Size(inv) ~ ELSE IF IT_Module_review_fie='IO nodes' THEN Sum(Metavar v[] := inv DO IT_Has_User_IO_node(v))~ ELSE IF IT_Module_review_fie='IO no Description' THEN Sum(Metavar v[] := inv DO (IT_Has_User_IO_node(v) AND TextLength(Description OF v) Null AND n<100 DO id := SelectText(id, 1, len)&(n := n+1); { Create unique identifier }~ IF ACP_Trace_Renaming THEN MsgBox('Renaming '&Identifier o &' to '&id);~ Evaluatescript('Rename '&Identifier o &' '&id&' ') NodeLocation: 264,288,1 NodeSize: 104,16 NodeInfo: 1,1,1 WindState: 2,302,98,781,470 Function ACP_Remove_prefix(o: Object) Title: Remove_Prefix(o) Description: Remove prefix from the identifier of object o. It assumes that the first one or two characters are a prefix if they are followed by underscore '_'. Definition: VAR id := Identifier OF o;~ VAR n := FindInText('_', id);~ MsgBox('In remove prefix on object '&id&' we found underscore at char '&n);~ IF (n=2 OR n=3) THEN BEGIN~ id := SelectText(Id, n+1);~ IF NOT ACP_Isletter(SelectText(id, 1, 1)) THEN id := 'X' & id;~ ACP_Renameobj(o, id)~ END NodeLocation: 264,240,1 NodeSize: 104,16 NodeInfo: 1,1,1 WindState: 2,105,254,742,388 Function ACP_Prefix_module(m: Object; prefix: Text Atom; trace: = False) Title: Prefix_module(m, prefix) Description: Adds prefix with underscore (if they don't already have that prefix) to all objects in module m, recursively downwards to all contained modules and libraries, excluding separately filed modules (LinkModule, LinkLibrary, Model), and the Excluded_module and anything it contains. Returns the number of objects to which it added a prefix (ignores those which already had that prefix).~ ~ If trace it gives a message saying how many objects it added a prefix to. Definition: IF NOT ACP_IsaPrefix(prefix) THEN MsgBox("'"& prefix & "' is not a valid prefix. A prefix must be a letter, followed by an optional letter or digit.~ Please type a prefix into 'Prefix for this module'.", )~ ELSE BEGIN~ VAR n := ACP_Addprefix(m, prefix);~ MetaVar mods := ACP_Submodules_unfil(m);~ FOR o := mods DO BEGIN~ Metavar c := Contains OF o;~ IF NOT IsNull(c) THEN METAVAR j[] := c DO IF NOT ACP_IsaFiledModule(j) THEN n := n + ACP_Addprefix(j, prefix)~ END;~ IF trace THEN MsgBox("Added prefix '"&prefix & "_' to " & n & ' objects in module ' & (Identifier OF m));~ END NodeLocation: 264,144,1 NodeSize: 104,16 NodeInfo: 1,1,1 WindState: 2,188,499,797,668 Function ACP_Remove_prefix_mo(m: Object) Title: Remove_prefix_mod(m) Description: Remove prefix from all objects in module m, and recursively downwards, excluding Excluded_module. Definition: MetaVAR o[] := ACP_Submodules(m) DO ACP_Remove_prefix(o) NodeLocation: 264,192,1 NodeSize: 104,16 NodeInfo: 1,1,1 WindState: 2,286,395,550,397 Function ACP_Isletter(c: Text) Title: IsLetter(c) Description: Returns true if c is a single letter character, otherwise false. Definition: VAR n := Asc(TextUppercase(c));~ TextLength(c) = 1 AND n >= Asc('A') AND n <= Asc('Z') NodeLocation: 544,239,1 NodeSize: 80,16 NodeInfo: 1,1,1 WindState: 2,615,169,476,224 Variable ACP_Isletter_tester Title: Isletter tester Definition: INDEX v :=['a', 'abc', 'A', '', '124', '_', 'A_', '$'];~ ACP_Isletter( v ) NodeLocation: 752,240,1 NodeSize: 96,16 ValueState: 2,40,50,416,303,0,MIDM Function ACP_Isdigit(c: Text) Title: IsDigit(c) Description: Returns true if c is a single numerical digit, otherwise false. Definition: VAR n := Asc(TextUppercase(c));~ TextLength(c) = 1 AND n >= Asc('0') AND n <= Asc('9') NodeLocation: 544,191,1 NodeSize: 80,16 NodeInfo: 1,1,1 WindState: 2,615,169,609,340 Variable ACP_Isdigit_tester Title: Isdigit tester Definition: INDEX v :=['a', '0', 'A', '', '1', '_', '9', '99'];~ ACP_Isdigit( v ) NodeLocation: 752,192,1 NodeSize: 96,16 ValueState: 2,40,50,416,303,0,MIDM Function ACP_Prefix_from_obj(o: Object) Title: Prefix_from_obj(o) Description: If the identifier of object o has a prefix, i.e. the first one or two characters followed by underscore '_', it returns those first one or two characters. If it does not have '_' as the 2nd to 4th character it returns an empty text. Definition: VAR name := Identifier o;~ IF SelectText(name, 2, 2) = '_' THEN SelectText(name, 1, 1) ~ ELSE IF SelectText(name, 3, 3) = '_' THEN SelectText(Name, 1, 2) ~ ELSE IF SelectText(name, 4, 4) = '_' THEN SelectText(Name, 1, 3) ~ ELSE '' NodeLocation: 264,32,1 NodeSize: 104,16 NodeInfo: 1,1,1 WindState: 2,731,381,679,493 DisplayOutputs: Object Variable, Variable ACP_Prefix_by_module Function ACP_Addprefix(o: Object; prefix: Text) Title: Addprefix(o, prefix) Description: Add a prefix (a letter followed by 0 to 2 letters or numbers) followed by underscore "_" to the start of the identifier of object o. If it already has a prefix, it replaces it with the new prefix. It removes any trailing characters that would otherwise make the identifier longer than 20 chars. ~ Returns 1 if it added a prefix, 0 if it didn't because it already had that prefix.~ ~ If that would create an identifier that duplicates an existing identifier, it will fail -- i.e. do nothing except leave an error in typescript. Definition: VAR id := Identifier OF o;~ VAR old_prefix := ACP_Prefix_from_obj(o); ~ IF old_prefix = prefix THEN 0~ ELSE BEGIN~ id := prefix & '_' & SelectText(id, IF old_prefix='' THEN 1 ELSE 2 + TextLength(old_prefix));~ IF TextLength(id) > 20 THEN id := SelectText(id, 1, 20);~ ACP_Renameobj(o, id);~ 1~ END NodeLocation: 264,88,1 NodeSize: 104,16 NodeInfo: 1,1,1 WindState: 2,768,237,853,471 Variable ACP_A234567890123456 Title: Test variable Definition: 99 NodeLocation: 600,32,1 NodeSize: 64,20 WindState: 2,1144,131,476,224 Variable ACP_Prefix_from_test Title: Prefix from test Description: dfgsdfgsdfgsdfgsdfgsdfgsdfgdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfg Definition: ACP_Prefix_from_obj(ACP_A234567890123456) NodeLocation: 456,32,1 NodeSize: 64,20 WindState: 2,894,83,822,250 ValueState: 2,935,316,416,303,0,MIDM Variable ACP_Trace_Renaming Title: Trace Renaming Description: Check to show a message box each time an object is renamed. Useful for tracing the operation of applying prefixes. Definition: Checkbox(0) NodeLocation: 80,288,1 NodeSize: 64,20 Aliases: FormNode ACP_New1863547779 Button ACP_test_Prefix__mod Title: test Prefix_ module() Description: Click to test Prefix_module() NodeLocation: 464,92,1 NodeSize: 64,20 OnClick: ACP_Prefix_module(Handle(ACP_Prefixer_functio), 'Pre') Function ACP_IsaPrefix(t: Text) Title: IsaPrefix(t) Description: Returns true if t is a valid prefix, i.e. is text starting with a letter, followed optionally by one or two letters or digits. Definition: VAR n := TextLength(t);~ IF n>3 OR n=0 THEN FALSE~ ELSE IF NOT ACP_Isletter(SelectText(t, 1,1)) THEN FALSE~ ELSE IF n=1 THEN TRUE~ ELSE BEGIN~ VAR c2 := SelectText(t, 2, 2);~ ACP_Isletter(c2) OR ACP_Isdigit(c2)~ END NodeLocation: 544,144,1 NodeSize: 80,16 NodeInfo: 1,1,1 WindState: 2,664,231,615,437 Variable ACP_Test_Is_a_prefix Title: Test Is_a_prefix Definition: INDEX t := ['', '1', 'A', 'a1', 'A_', 'xxx', 'Xy', '1A', 'x'];~ ACP_IsaPrefix(t) NodeLocation: 752,144,1 NodeSize: 96,16 ValueState: 2,421,193,416,303,0,MIDM Variable ACP_Trace_prefix Title: Trace prefix Description: Check if you want to know how many objects have a prefix added in each module. Definition: Checkbox(1) NodeLocation: 80,144,1 NodeSize: 64,20 Button ACP_Rename_x Title: Rename x NodeLocation: 440,288,1 NodeSize: 48,24 OnClick: ACP_Renameobj(Pre_a, 'a') Close ACP_Prefixer_functio Index ACP_Modules1 Title: Modules Description: Generates a list of all separately filed modules, which are considered as candidates for applying the Prefixer -- i.e. modules with class Model, LinkModule,or LinkLibrary. Click button "Update formal Modules" to recalculate this. Definition: ACP_reset; ~ ACP_Submodules1(ACP_Top_model) NodeLocation: 232,96,1 NodeSize: 64,24 WindState: 2,235,734,688,436 ValueState: 2,1453,70,800,609,0,MIDM Decision ACP_Select_a_module1 Title: Select a module Description: Select a module (main model or separately filed module).~ You can apply the Prefixer to any separately filed module (Class LinkModule) including a separately filed library (Class LinkLibrary), or Model. Definition: Choice(ACP_Indented_modul1,75,0,result:ACP_Module_by_indent) NodeLocation: 376,136,1 NodeSize: 64,24 WindState: 2,431,369,634,324 Aliases: FormNode ACP_New521370499 Variable ACP_Summary_module_r Title: Summary module review Description: Sums for module and its submodules, the total number of objects, modules, and those missing descriptions, titles, units, definitions. Definition: Metavar m[] := ACP_Select_a_module1 DO ACP_Summary_sum_modu(m) NodeLocation: 376,296,1 NodeSize: 64,24 ValueState: 2,171,379,227,287,0,MIDM ReformVal: [Null,ACP_Module_review_fi] Variable ACP_Review_by_submod Title: Review by submodule Description: Review of module and submodules including number of objects, submodules, UI nodes, and variables missing descirptions, titles, units, definitions. Definition: Metavar m[] := ACP_Select_a_module1 DO ACP_Summary_of_submo( m) NodeLocation: 376,224,1 NodeSize: 64,24 ValueState: 2,22,555,1416,301,0,MIDM ReformVal: [ACP_Module_review_fi,ACP_Modules1] Variable ACP_Prefix_by_module Title: Prefix by module Description: Shows current prefix by module extracted from the identifier of the module itself. Definition: IT_Prefix_from_obj(m) NodeLocation: 216,40,1 NodeSize: 64,24 WindState: 2,520,603,476,224 ValueState: 2,85,459,433,354,0,MIDM DisplayInputs: Object Object, Object Function, Function ACP_Prefix_from_obj Variable ACP_Prefix_for_this_ Title: Prefix for this module Description: Prefix for to apply to the selected module, extracted from the identifier for this module. If it's empty or you want to change the prefix, you may type a new prefix into this field. It should be a letter, optionally followed by a second letter or digit. Definition: 'ACP' NodeLocation: 512,56,1 NodeSize: 64,24 WindState: 2,28,54,642,283 ValueState: 2,565,590,474,393,0,MIDM Aliases: FormNode ACP_New1058241411 Close ACP_IT_prefixer_deta Button ACP_IT_Apply_prefix Title: Apply prefix Description: Click to apply this prefix to the identifiers of all objects in the selected formal module. If they already have a prefix, it will leave them as is. If they have a different prefix, it will replace the prefix with this new one. It assumes that any separately filed modules (or libraries) that it contains are Formal modules, and it will not apply the prefix to them. NodeLocation: 392,100,1 NodeSize: 64,20 WindState: 2,661,404,732,447 OnClick: METAVAR m[] := ACP_Select_a_module1~ DO ACP_Prefix_module(m, ACP_Prefix_for_this_) Text ACP_IT_caveats Description: Please use this to apply appropriate prefix to each formal module in Storage VET before uploading it for sharing to avoid name collisions. NodeLocation: 328,96,-1 NodeSize: 320,88 WindState: 2,0,-23,1025,641 Button ACP_Update_module_li Title: Update module list Description: Click to refresh the list of separately filed modules, available to apply the Prefixer. You may want to refresh this list after you add a new formal module, after you change its identifier manually, or change the class of a module to be separately filed (a LinkModule or LinkLibrary). This updates the list of formal modules available to the Prefixers. NodeLocation: 560,64,1 NodeSize: 64,24 WindState: 2,806,543,727,413 OnClick: ACP_reset := NOT ACP_reset FormNode ACP_New1863547779 Title: Tracing_Rename Definition: 0 NodeLocation: 552,104,1 NodeSize: 88,16 Original: ACP_Trace_Renaming FormNode ACP_New521370499 Title: Select a module Definition: 0 NodeLocation: 252,64,1 NodeSize: 228,16 NodeInfo: 1,,,,,,,280 Original: ACP_Select_a_module1 FormNode ACP_New1595112323 Title: Missing descriptions Definition: 1 NodeLocation: 252,152,1 NodeSize: 228,16 Original: ACP_IT__descriptions FormNode ACP_New1058241411 Title: Prefix for selected module Definition: 0 NodeLocation: 172,96,1 NodeSize: 148,16 Original: ACP_Prefix_for_this_ Button ACP_ACP_prefix Title: Add "ACP" prefix Description: Click to add 'ACP_' as a prefix to the identifiers of all objects in the ACP Styles library, to prevent them from clashing with identifies in models that use this library. NodeLocation: 116,212,1 NodeSize: 76,20 OnClick: ACP_Prefix_module(Handle(ACP_styles), 'ACP', trace: 1) Button ACP_Pre_prefix_to_Pr Title: Add "Pre" prefix to Prefixer library Description: Click to add 'ACP_' as a prefix to the identifiers of all objects in the ACP Styles library, to prevent them from clashing with identifies in models that use this library. NodeLocation: 116,264,1 NodeSize: 76,24 OnClick: ACP_Prefix_module(Handle(ACP_styles), 'ACP', trace: 1) Close ACP_Prefixer_library Picture ACP_CSV_Mar Title: csv Description: Click to download data as a csv file (comma-separated values). NodeLocation: 316,316,-2 NodeSize: 20,28 NodeInfo: 1,,,,1,1,1,,1 WindState: 2,390,132,720,350 Pict: (000000000000002C00180004EA04000089504E470D0A1A0A0000000D49484452000000180000002C08060000007F9C7843000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000046F494441545847ED555B4C1C65149E17DB4A5192A6AD46D31A5F34F192A82F9AD107131F7CA91A63D33EF86660DA2A15BC63B92D2C041BA82E97B6C15668A91A5A2DD8569616D38642582C59ACB4B4828328420B96CB02BBCB65D9E5F39C7F66767796A517B3B52F7CC9C9CECC39FFF79DF39FF3FF2BE136E3CE0BCCCEF9D1F25B0F367E51817BB66661595206E2944CBC682D83FD974ECCF8E6F4C8E8B82981A6CB2A5EDBF515E2B7660B81BB4940CE29C509E7C5D8089CBDFC3B5EDDB5DF2C6029C5F1580ABCB224B0189604EE8C40607E1E73FE007C7E3F3C33B33873B11B1B8AF691009DE4441248CAC473D925A86DEB807B7A46C4717C2030AF3384B040609EC83D53D3E8ECEB476B570F1A2F7561CFA946BC905B8AB82D9AC00A127832AD1085C77E426367171C14F76B6F1F5C6E8F482E5CC624C00E16E8B9721569DFFC808DC595626B98FCC1943C2C27E2BB488045D624E7E2D9EC6251D91BB60AA4547E0767F71F54454070185820C019A80357F1D69E4358976245FC964CB1E706B961CBE89D2B59A964E1FEEDB9789D84DAA812FFF50418EC7479BCA87138F172C15EAC7E276701B961FC3D615B3635BC18FB1B9AF08F6BE2FA5B64C04F0D1B1E9F40F9C9B378DE5282049E9E2802F1D493A77614A1E0683DFAAF8D50A3FD3A43085105B80A1F8DA77A65089FD59CC4D3E99FE3DE08919544FEE8C73BF1C9D7B5E8A006CFF87C22FB4848ACCA19F3DE71830CB0082FE2C51F56D5E0918F766205F58245786BD6BF978FC4F26FD14267C44BA31ABEEFFCCC7CCC2BB5A97FE29CFA17CEF7FE8DC1B171D32CF3B39B46B6F952371422E349E2CCD726E760B3AD1275CE0B623445638D35443E3CE1C685BE01B411AFF466C9016C2AA942D297D5A86BEFA4936B3E995CD584D78B7A678798948728F397F276A3BAE91C46C62705793878479AE91F30F5600D369556415A9F6CC1DAED563C965684F2D30E4CCFFA4C5360943B3AE9466D6B3B522B8EE0E019070647C70459F8D63038C1A33F9FA7BFD432DCF76E1EA455493BC4343CFC4101763734638A052216315864D23B85A151175C931E8D5CF719E0757C371D76B4E3990C9BB8BB4C0265A79AE1A5BB47CC7284F137D138DDB83FD1627830AA5B2204E2E834AE4BCD477E6D037A06AFA17F640C0323AE5B365ED73B348CBDB4138F7F5A24EE2E21C0B7E3AAB72DD850B80F99877F44CEF7F5FFD9B28ED46173F1013C4013C7632DAD51D2E94ED16E483E4CABE91263E3CBEC56CD589BB0CD42F757169D970C484FBC6FA50A4227940F522C8CB99627A6433AD4D88ABCE3A7917B2CC6469C56FA8D7A17C5124B0237C4FF21A0C2A6C89024493359814DD5BD04D5AE40367CBADFAEFB559BB64E0E5FC07CB216ABD849C078311B9188589B997C31BF6C235A1DC1355A8C147C11112AEC8A4622B2A2EC0561384104B4783958B5693D819EE903D712157628E115CA32149B1D6AB89A9E844648F12236247803010DAADD26FA2407C542044152AAD2AEF7249C2FB845C112A30485606EA001A3D98685FB1669B29EA1D183C5FC064CC3A00F808E9B1B53531FCC7E0391CD35709B0F1AF02FFB076EE26C9056FE0000000049454E44AE426082) NodeFont: Century Gothic,12 OnClick: Local result := WriteTextFile(Market_Potential_Tit[Market_Potential_Qua = Market_Potential_Qu1] & '.CSV', ~ MakeCSV(Market_potential_Exp, Market_Indices, ~ Market_potential_Exp.j, Market_Indices), ~ warn: False);~ DownloadFileToClient(result) Picture ACP_XLS_Mar Title: xls Description: Click to download data as an .xls file (Excel format). NodeLocation: 364,316,-2 NodeSize: 20,28 NodeInfo: 1,,,,1,1,1,,1 WindState: 2,765,125,832,585 Pict: (000000000000002C00180004EA04000089504E470D0A1A0A0000000D49484452000000180000002C08060000007F9C7843000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000046F494441545847ED955D4C1C5514C7E7C5B65294A469ABD1B4C6174DFC48D417CDE883890FBE548DB1691F7C33306D950A7E63F95A580836501D3EDA065BA1A56A68B5605B595A4C1B0A61B104ACB4B4828328420B968F0576978F65E1EF397776767766B7A4356B6A4CFFC9C9EECEDCFBFFDD73EEB97725FCCBBAF580B9793F5A7EE9C5C6CF2A70D7D62C2C4BCA409C9289E7ED6570FCD48559DF7C606474DD10A0E9B28657767D81F8ADD902702701E49C529C68BF181BC0D9CBBFE2E55DFBCD005B298EC712F0D26DC0F5741B706B000B8B8B98F72FC0E7F7C3333B8733177BB0A1681F01E8242712202913CF6497A0B6AD13EE9959318EC72F2C2C061C428A002C92B9677A065DFD0368EDEE45E3A56EEC39D588E7724B11B74507AC20C0E36985283CF6031ABBBAE1A4713FF7F5C3E5F688C585634C007EC180DE2B5791F6D577D8585C294AC3E6F7A7E4613919DF410086AC49CEC5D3D9C522B3D7D40AA4547E83F69EDF288B05E1612802C02BD006AFE28D3D87B02EC58EF82D99A2E686B911CBE83767B252C9C2BDDB73F12A81DA2813FF520016BF7479BCA871B6E3C582BD58FD564E84B911FC3C615B366D7831F63734E12FD7E4D22532E4A70D1B999844F9C9B378D6568204EE9E288078DA93277614A1E0683D06AE8DD246FB030E21450570163E6A4FEDCA303EA9398927D33FC5DD16C84A327FF8C39DF8E8CB5A74D206CFFA7C62F556494CE51573ED78830C318427F1E4F7AB6AF0D0073BB182F682215C9AF5EFE423B1FC6BB4D019F152AB86D79DBFB31FFB4A6DDAEF38A7FD81F37D7F62687CC2D4CBFCDD4D2DDB7CA9070A997127F1CAD726E760B35A89BAF60BA235C5C61A73C87C64D28D0BFD8368235FE9F59203D8545285A4CFAB51D7D14527D77C3239AB49AF17F5ED9DA2531EA095BF90B71BD54DE7303A3125CCC3C51569A67FC0D48335D8545A05697DB20D6BB7DBF1485A11CA4F3B3133E733758191EED8941BB5AD1D48AD388283679C181A1B1766E1A561F1028FFE789EFE52CB70CFDB79905625ED10DDF0E07B05D8DDD08C69065826B11832E59DC6F0980BAE298F6E1E786788E7F1DD74D8D981A732547177990065A79AE1A5BB47F4B225F899D8B840F0FE441BC38D51DD6201C4D1695C979A8FFCDA06F40E5DC3C0E83806475D371D3CAF6F78047BA9128F7E5C24EE2E01E0DB71D59B366C28DC87CCC3DF23E7DBFA7F1C5947EAB0B9F800EEA38EE3B696D628E974A7E837241FA6D5748971F06576B361CC4DD866A3FB2B8BCE4B06A4C7DEB55306A113CA072916C15ECB13D3211D6A6C45DEF1D3C83D16E3204F3B7D46BD8B62A9FF12C001459220490A7DBB71FD9F000E85269381AC42130F34A8321B4A5084632440A339B278160899DEE993833265E050F481B2AA4153657D92EECE6FCD004D359B07C39CA1A5448649B4C1164044C6D115B107C1955304172F642D11FD0E945007C9505407B4A54AC432CA24C244B00274690E15AA22430EC26450858332038CB4699051DF10233A20246B53E80A0358060461612509FF1D7C6F8DEB6410D935EC1198A4132332106D6ADA07C564CE8AD883D80AF81B63C380F91BA0B3260000000049454E44AE426082) NodeFont: Century Gothic,12 OnClick: Local numOfColumns := Size(Market_Indices);~ Index excelcol := Excel_Columns;~ excelcol := excelcol[@excelcol=1..numOfColumns];~ Local firstCol := Slice(excelcol, 1);~ Local lastCol := Slice(excelcol, numOfColumns);~ ~ Local rowLength := Size(Market_potential_Exp.j);~ Local rowOffset := rowLength + 1;~ LocalIndex rowIndex := 1..rowLength;~ SS_SetRange(This_spreadsheet, 'Sheet1!' & firstCol & '1:' & lastCol & '1', Market_columnArray, Market_columnIndex, Index_1);~ SS_SetRange(This_spreadsheet, 'Sheet1!' & firstCol & '2:' & lastCol & rowOffset, Market_potential_Exp, Market_Indices, Market_potential_Exp.j);~ ~ Local filename := Market_Potential_Tit[Market_Potential_Qua = Market_Potential_Qu1] & '.XLS';~ ~ {Save & Close XLSX file}~ SS_Close(This_spreadsheet, filename);~ SS_reset_files := NOT SS_reset_files;~ ~ DownloadFileToClient(filename) Module ACP_Style_lib_detail Title: ACP Style lib details Description: ACP Style library variables and functions. Author: Max Henrion Date: Mon, Jul 5, 2021 2:57 PM NodeLocation: 96,32,1 NodeSize: 88,24 DiagState: 2,55,59,1151,699,23,10, Decision ACP_node_radius Title: Set node corner radius to Units: pixels Description: Select the radius for rounded corners as the default for the node types selected below. ~ It usually looks best with 8 to 16 pixels.~ Select 0 for square corners~ Select null to use the system default. Definition: Choice(Self,5,0) NodeLocation: 680,264,1 NodeSize: 80,20 WindState: 2,108,44,858,593 Aliases: Alias Al298739523, FormNode ACP_New1855159171 {!40300|DomainExpr: Discrete(0,4,8,12,16,20,24,Null,type:'number')} DisplayOutputs: Object Module, Module ACP_Top_styles OnChange: ACP_Set_att_field(Nodeinfo, ACP_obj_types_w_ra, self, 'Corner radius') {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Decision ACP_object_types Title: for object types Description: Select which types of object you want to set the default radius for rounded corners. Definition: MultiChoice(Self,1,2,3,allowNone:0,returnList:1) NodeLocation: 680,216,1 NodeSize: 80,20 WindState: 2,98,82,720,350 ValueState: 2,912,415,416,303,,MIDM Aliases: Alias Al1372481347, FormNode ACP_New512981891 {!40300|DomainExpr: Discrete('Text','Framenode','User inputs and outputs','Button',type:'text')} MetaOnly: 1 OnChange: ACP_Set_att_field(Nodeinfo, ACP_obj_types_w_ra, ACP_node_radius, 'Corner radius') Variable ACP_is_running Title: ACP is running? Description: True if the model is running under ACP -- False if running in desktop Analytica (DTA) or ADE. Used to control features that work differently in ACP vs DTA. Definition: SelectText(AnalyticaEdition, 1, 3) = "ACP" NodeLocation: 104,608,1 NodeSize: 80,20 NodeInfo: 1,,,,,,,0,,,,,,0 WindState: 2,98,82,641,366 Constant ACP_Newline Title: Newline Definition: Chr(13) NodeLocation: 104,424,1 NodeSize: 80,20 Module ACP_Dashboard_sizes Title: Dashboard sizes Author: Karen Date: Fri, Dec 18, 2015 10:59 AM NodeLocation: 472,56,1 NodeSize: 88,16 DiagState: 2,789,191,926,207,23,, FontStyle: Arial,15 DisplayInputs: Object Object, Object Index Index ACP_Screen_Resolutio Att_PrevIndexValue: ['1920 x 1080','1600 x 900','1366 x 768','1280 x 1024','1280 x 800','1024 x 768'] Title: Screen Resolution Units: pixels Description: List of preset screen resolutions for minimum ACP diagram size Definition: ['1920 x 1080','1600 x 900','1366 x 768','1280 x 1024','1280 x 800','1024 x 768'] NodeLocation: 96,32,1 NodeSize: 88,24 WindState: 2,98,82,684,500 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnClick} Constant ACP_Diagram_size_tab Title: Diagram size table Units: pixels Description: Maximum ACP diagram size width and height by Resolution and ACP Navigation Style Definition: Table(ACP_Screen_Resolutio,ACP_XY,ACP_Nav_style)(~ 1905,1905,1905,1635,0,0,~ 810,840,810,840,0,0,~ 1585,1585,1585,1315,0,0,~ 635,660,635,660,0,0,~ 1350,1350,1350,1075,0,0,~ 505,540,505,540,0,0,~ 1265,1265,1265,990,0,0,~ 755,785,755,785,0,0,~ 1265,1265,1265,990,0,0,~ 525,555,525,555,0,0,~ 1010,1010,1010,735,0,0,~ 490,520,490,520,0,0) NodeLocation: 304,96,1 NodeSize: 88,24 WindState: 2,120,189,533,367 DefnState: 2,352,672,925,417,0,DFNM ValueState: 2,536,538,416,303,0,MIDM ReformDef: [ACP_XY,ACP_Screen_Resolutio] ReformVal: [0,ACP_Screen_Resolutio] Att_EditSliceState: [ACP_Nav_style,1,ACP_Screen_Resolutio,1,XY,1] Index ACP_Dash_size_option Title: Dash size options Units: pixels Description: List of preset screen resolutions Definition: Concat(['Auto zoom','Browser window','Fit main model','Fit all dashboards', 'Custom'], ACP_Screen_Resolutio) NodeLocation: 96,168,1 NodeSize: 88,24 WindState: 2,450,165,632,512 ValueState: 2,1184,634,416,303,,MIDM Function ACP_ResizeMinResolut() Title: ResizeMinResolution() Description: Resize the Diagram Window(s) to the selected minimum resolution (or for 'Custom' resolution to match size of Main Module diagram) for all modules that will become tabs for tab styles. Definition: Local wh := ~ IF ACP_Screen_size='Custom' ~ THEN ACP_Get_att_field(DiagState, ACP_Top_model, ACP_XY)~ ELSE ACP_Diagram_size_tab[ACP_Nav_style=ACP_Navi_style, ~ ACP_Screen_Resolutio=ACP_Screen_size];~ ACP_Set_att_field(DiagState, (ACP_top_modules), wh, ACP_XY) NodeLocation: 536,32,1 NodeSize: 104,24 NodeInfo: 1,1,1 WindState: 2,269,70,795,571 Variable ACP_ResizeMin_res Title: eg ResizeMin res Definition: ACP_ResizeMinResolut() NodeLocation: 768,32,1 NodeSize: 88,24 ValueState: 2,824,658,416,303,,MIDM Function ACP_SetDashSize(wh: Text Atom; margin: = 0) Title: ACP_SetDashSize(wh) Description: Resize all Dashboards to the value wh from Dash_size_options.~ Fit main model: Fit to enclose all nodes on the main model diagram. (First dashboard)~ Fit all dashboards: Fit to enclose nodes on the largest dashboard.~ Custom: Use the window size of the main model diagram. Definition: ACP_style_set('Use_top_diagram_size', ~ wh<>'Browser window' AND wh<>'Auto zoom');~ ACP_auto_zoom := wh='Auto zoom';~ IF wh='Browser window' or wh='Auto zoom' ~ THEN ACP_dashboard_size := 'unlimited'~ ELSE BEGIN~ Local dashSize:= ~ IF wh='Custom' THEN ACP_Get_att_field(DiagState, (ACP_Top_model), ~ Array(ACP_XY, ['W', 'H']))~ ELSE IF wh='Fit main model' ~ THEN ACP_DiagramMax((ACP_Top_model), margin)~ ELSE IF wh='Fit all dashboards' ~ THEN Max(ACP_DiagramMax((ACP_top_modules), margin), ACP_top_modules)~ ELSE ACP_Diagram_size_tab[ACP_Nav_style=ACP_Navi_style, ~ ACP_Screen_Resolutio=ACP_Screen_size];~ ACP_dashboard_size := JoinText(dashSize, ACP_XY, ' x ')&' ';~ ACP_Set_att_field(DiagState, (ACP_top_modules), dashSize, ~ Array(ACP_XY, ['W', 'H']));~ END; NodeLocation: 536,168,1 NodeSize: 104,24 NodeInfo: 1,1,1 WindState: 2,526,73,760,622 Variable ACP_dashboard_size Title: Dashboard size Description: ACP dashboard (Diagram) size in pixels designed to fit the selected screen size.~ This is a bit smaller than the screen size to allow for the edges of the browser window, the browser tabs and menus at the top, and the area with logos across the bottom. Definition: 'unlimited' NodeLocation: 776,168,1 NodeSize: 88,24 ValueState: 2,109,900,416,303,,MIDM Aliases: FormNode ACP_New1586723715 {!50500|ArrowClass ACP_Arrow147420035} {!50500|Att_HeadNode: ACP_SetDashSize} {!50500|Att_TailNode: ACP_Screen_Resolutio} {!50500|Att_ArrowWayPoints: [Null,Null,0.1694915254237288,0.6470588235294118,0.6440677966101694,0.7647058823529411]} {!50500|Att_ArrowProperties: 1} Alias ACP_New1418951555 Title: Screen size Definition: 1 NodeLocation: 304,168,1 NodeSize: 88,24 Original: ACP_Screen_size Alias ACP_New882080643 Title: Top modules Definition: 1 NodeLocation: 536,96,1 NodeSize: 88,24 Original: ACP_top_modules {!50500|ArrowClass ACP_Arrow1340470851} {!50500|Att_HeadNode: ACP_ResizeMinResolut} {!50500|Att_TailNode: ACP_New1418951555} {!50500|Att_ArrowWayPoints: [Null,163.68615281789423,0.4482758620689655,0.35294117647058826,0.5862068965517241,0.6470588235294118]} {!50500|Att_ArrowProperties: 1} {!50500|ArrowClass ACP_Arrow1008072259} {!50500|Att_HeadNode: ACP_ResizeMinResolut} {!50500|Att_TailNode: ACP_Diagram_size_tab} {!50500|Att_ArrowWayPoints: [Null,167.52954124499544]} Close ACP_Dashboard_sizes Decision ACP_Outline_view Title: Outline view on left Description: Check the box to show an expandable Outline tree of modules on the left side of the ACP window. The Outline makes it easy to navigate a model with a multilevel module hierarchy. By default, it appears for the Navigation style "Outline" (surprise!) and not for the other navigation styles. But you can use this option to show the Outline with any other style to help users navigate a large model. You don't need it for a small models, or when you want to hide the details from ACP users. Definition: Checkbox(0) NodeLocation: 280,184,-5 NodeSize: 88,16 WindState: 2,698,99,655,653 Aliases: FormNode ACP_New781417347 AcpStyles: Show_outline: No OnChange: ACP_style_set('Show_outline', self);~ LocalAlias top := (ACP_Top_model);~ IF NOT ACP_is_running THEN ~ IF self THEN ShowWindow(top, 'Outline')~ ELSE CloseWindow(top, 'Outline'); {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Decision ACP_ToolbarTabs Title: Toolbar tabs Description: Check the box to display Toolbar tabs across the top of the window, including tabs for Diagram, Object, Edit Table, Table, and Graph. This toolbar is similar to the desktop Analytica toolbar. It is only available when the Main style is "Outline". Definition: Checkbox(0) NodeLocation: 472,232,-5 NodeSize: 88,16 NodeInfo: 1,,,,,,,,,,,0 WindState: 2,304,71,638,508 Aliases: FormNode ACP_New1720941443 AcpStyles: show_tabs: No OnChange: ACP_style_set('Show_tabs', self) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Decision ACP_Show_the_model_t Title: Show the model title Description: Show the model title in the teal bar across the top. Normally, you will want to leave this checked so end users know what model they are using. Definition: Checkbox(1) NodeLocation: 1056,104,5 NodeSize: 80,20 WindState: 2,-53,61,524,551 Aliases: FormNode ACP_New982743939 OnChange: ACP_style_set('Show_model_title', self) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnClick, Attribute OnChange} Decision ACP_Shadows Title: Shadows Description: Check box to show a shadow behind each node in ACP (not supported in desktop Analytica). Definition: Checkbox(0) NodeLocation: 680,112,1 NodeSize: 80,20 WindState: 2,102,83,1077,439 ValueState: 2,838,688,416,303,0,MIDM Aliases: FormNode ACP_New244546435 AcpStyles: node_drop_shadow: Yes OnChange: ACP_style_set('Node_drop_shadow', ACP_Shadows);~ ACP_Show_node(ListOfHandles(ACP_Decision_exampl1, ACP_Variable_exampl1), self AND NOT ACP_is_running);~ IF self AND NOT ACP_Is_running THEN MsgBox('Node shadows will appear in ACP, but are not supported by desktop Analytica (except for the two nodes here!).', 0, 'Notice'); {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Decision ACP_Bevels Title: Bevels Description: Check box to show a 3-D bevel around each node in ACP (not supported in desktop Analytica). Definition: Checkbox(0) NodeLocation: 680,64,1 NodeSize: 80,20 WindState: 2,567,93,799,552 Aliases: FormNode ACP_New1318288259 AcpStyles: Bevel_node_border: No OnChange: ACP_style_set('Bevel_node_border', self);~ IF NOT ACP_is_running THEN BEGIN~ Local vars := ListOfHandles(ACP_Decision_example, ACP_Variable_example);~ ACP_Set_att_field(NodeInfo, vars, self, 'Show bevel');~ IF self THEN MsgBox('Node bevels will appear in ACP, but not in desktop Analytica (except for the two nodes here!).', 0, 'Notice');~ END;~ {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles, Attribute OnChange} Decision ACP_Lumina_logo_ Title: Lumina logo? Description: Hides the Lumina logo at the top of ACP. Also hides the tabs. Definition: Checkbox(0) NodeLocation: 872,432,1 NodeSize: 80,16 WindState: 2,1239,100,476,448 OnChange: ACP_style_set('show_logo', self) Function ACP_Clean_newlines(t: Text orNull) Title: Clean_newlines(t) Description: Removes any leading or trailing white space (new line, space, or tab characters from text t, and replaces any multiple new lines chars with a single new line. Definition: Textreplace(Texttrim(t), "\r[\r\n]+", ACP_Newline, all: True, re: True) NodeLocation: 472,424,1 NodeSize: 104,16 NodeInfo: 1,1,1 WindState: 2,372,73,823,357 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute ParameterEnumeration} Text ACP_Te33 Title: ACP Navigation styles NodeLocation: 296,184,-12 NodeSize: 288,176 NodeInfo: 1,,,,1,1 WindState: 2,105,89,476,224 NodeFont: Arial Black, 15 AcpStyles: Show_description:30 Text ACP_Te9 Title: Diagram node style NodeLocation: 684,184,-11 NodeSize: 92,176 NodeInfo: 1,,,,1,1 WindState: 2,1274,740,476,224 NodeFont: Arial Black, 15 AcpStyles: Show_description:30 Decision ACP_Show_dash_title Title: Dashboard title Description: Check the box to display the module title at the top of each dashboard. ~ Only usable with "Outline" Navigation style. Definition: Checkbox(0) NodeLocation: 280,272,-3 NodeSize: 88,16 WindState: 2,467,452,650,637 Aliases: FormNode ACP_New445873027 OnChange: ACP_style_set('Show_diagram_title', self); Decision ACP_Banner_logo_and_ Title: Banner logo and tabs Description: Check to display the logo and toolbar tabs, along with "Close model" and "Save" buttons . Definition: Checkbox(0) NodeLocation: 872,472,1 NodeSize: 80,16 WindState: 2,519,-17,578,548 Aliases: FormNode ACP_New1519614851 Script: ~ OnChange: ACP_style_set('show_banner', self) Decision ACP_Auto_calc Title: Auto calc Description: Check this box to calculate the result (table or graph) of any variable immediately when you can see it in user output, tall node, or frame node, and recalculate it immediately after changing an input that influences it. It works in ACP and desktop Analytica.~ ~ This "Auto calc" behavior is different from the default "lazy evaluation" where Analytica calculates results only when you clicks a "calc" button, or otherwise asks to view a result table or graph. By default, it applues to all mid and prob values in browse mode. If you want it to apply for mid but not prob values, or to apply it only to some variables but not others, use 'Set variables for Autocalc'. Definition: Checkbox(0) NodeLocation: 872,280,2 NodeSize: 80,20 WindState: 2,170,204,656,539 Aliases: Alias ACP_New2090040195 OnChange: ACP_Set_Autocalc((ACP_Diags_with_User_), acMid:self, ~ acIndex:self, acProb: self, acEditMode: 0) Index ACP_Nav_style Att_PrevIndexValue: ['Outline','Top_diagram_only','Top_tabs','Side_tabs','Two_top_tabs','Two_side_tabs'] Title: ACP Navigation styles Description: ACP navigation styles~ Removed 'Two top tabs', 'Two side tabs' until they are working in ACP3. Definition: ['Outline','Top_diagram_only','Top_tabs','Side_tabs','Two_top_tabs','Two_side_tabs'] NodeLocation: 96,56,1 NodeSize: 72,16 WindState: 2,657,188,647,477 ValueState: 2,240,251,416,303,0,MIDM Decision ACP_Navi_style Title: Navigation style Description: Select a style for navigating through dashboards (modules) in ACP:~ Outline: Display an expandable outline of the modules on the left.~ Top diagram only: Create a simple Web application with the top diagram as a single dashboard, with no tabs or outline. ~ Top tabs: Display top modules as tabs across the top.~ Side tabs: Display top modules as tabs down the left side.~ ~ The ordering of the tabs reflects the arrangement of the module nodes in the top model, from left to right, and then top to bottom. Definition: Choice(ACP_Nav_style,3,0) NodeLocation: 280,56,1 NodeSize: 88,16 WindState: 2,137,0,874,778 ValueState: 2,869,523,416,303,0,MIDM Aliases: FormNode ACP_New1452505987 Script: ~ {!40300|DomainExpr: Discrete(['Outline','Top_diagram_only','Top_tabs','Side_tabs','Two_top_tabs','Two_side_tabs'],type:'all')} AcpStyles: Navigation_style: Top_tabs OnChange: ACP_style_set('Navigation_style', self);~ ~ { For Navigation style 'Outline', set Outline view and ToolbarTabs on, and show options to select Toolbar tabs }~ ACP_Outline_view := (self = 'Outline');~ ACP_ToolbarTabs := (self = 'Outline');~ ACP_Show_node(ListOfHandles(ACP_ToolbarTabs), ~ self='Outline' OR self='Top_diagram_only', what: 'UserInputs');~ ~ ACP_Show_node(Handle(ACP_Outline_view), ~ self<>'Side_tabs' AND self<>'Outline' AND self<>'Two_side_tabs', what: 'UserInputs');~ { For top and side tab views, show selected controls }~ ACP_Show_node(ListOfHandles(ACP_Show_modules_as_, ACP_Tab_color), self='Top_tabs' OR self='Side_tabs' OR self='Two_top_tabs' OR self='Two_side_tabs', what: 'UserInputs');~ {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Text ACP_Te30 Title: ACP style functions NodeLocation: 296,528,-12 NodeSize: 288,160 NodeInfo: 1,,,,1,1 WindState: 2,1274,740,476,224 NodeFont: Arial Black, 15 Decision ACP_IncludTop_As_Tab Title: Include top level diagram as tab Description: Check box to include the top model diagram as the first tab for "Side tabs" or "Top tabs".~ This is set automatically if you select (or deselect) the first item in "Show modules as Tabs".~ ~ For Two top tabs or Two side tabs,this is currently required. Definition: Checkbox(1) NodeLocation: 280,144,1 NodeSize: 88,16 NodeInfo: 1,,,,,,,,,,,0 WindState: 2,336,320,873,397 ValueState: 2,40,50,400,300,0,MIDM Aliases: FormNode ACP_Fo753125251 AcpStyles: Use_top_diagram_size: No OnChange: ACP_style_set('Show_As_Tab', self) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Decision ACP_ShowIONodeButton Title: Input/Output node button text Description: Uncheck this to show Result/Calc/Edit table buttons without the text label in ACP. Definition: Checkbox(1) NodeLocation: 680,160,1 NodeSize: 80,20 WindState: 2,814,164,998,537 OnChange: ACP_style_set('ShowIONodeButtonText', NOT ACP_ShowIONodeButton) Decision ACP_Screen_size Title: Screen size Units: pixels Description: Select the minimum resolution screen size (in pixels) that you expect that end users will use to run this model in ACP in a web browser.~ Browser window: Use the browser window size. Show scroll-bars if the diagram is bigger.~ Auto zoom Diagrams: ACP automatically zooms the UI to fit the browser window -- the most constraining of width or height ~ so it retains the aspect ratio.~ Fit main model: Select smallest size that shows all nodes in the ~ diagram for the main (top) model.~ Fit all dashboards: Select the smallest size that will fit all nodes in diagrams for all ~ modules selected as tabs (dashboards).~ Custom: Use the current window size for the diagram of the top model, ~ whether it is smaller or larger than 'Fit main model'.~ You need to click 'Reset' any time you move nodes or change the window size of the top diagram, since these changes don't propagate automatically.~ ~ In desktop Analytica, selecting the Dashboard size here will automatically resize all Diagrams to the selected size (the top diagram, and its submodules) Definition: Choice(Self,1,0) NodeLocation: 472,104,1 NodeSize: 88,16 WindState: 2,286,52,765,737 Aliases: Alias ACP_New1418951555, FormNode ACP_New915635075 {!40300|DomainExpr: ACP_Dash_size_option} OnChange: ACP_SetDashSize(self, ACP_Margin) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute Value, Attribute Att_AxisOrKeyTitle, Attribute OnChange, Attribute OnGraphDraw} {!60005|Att_AttsToHide: Object Object, Object Attribute, Attribute Outputs} Decision ACP_Hierarchy_bar_ac Title: Hierarchy bar across the top Description: Check to show hierarchy bread crumbs with ancestor modules , and parent module and across the top of each Diagram. ~ ~ In desktop Analytica you can also set this option in the "Show module hierarchy" checkbox in Edit menu > Preferences... dialog box. Definition: Checkbox(1) NodeLocation: 280,232,1 NodeSize: 88,16 WindState: 2,228,80,747,676 Aliases: FormNode ACP_New1989376899 OnChange: showhier := self;~ ACP_Show_dash_title := False; { Don't show the Diagram title, which would duplicate and conflict with the hierarchy bar. }~ {IF ACP_is_running THEN MsgBox("With Tabs (across the top or side) the hierarchy bar appears only in submodules of main tabs.", 0, 'Warning');} {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles, Attribute OnChange} Function ACP_style_set(tag: Text Atom; val: atom = True; obj: Optional Handle Atom) Title: ACP_style_set(tag, val) Description: Set AcpStyles attribute of object obj (defaults to top model) to tag with value val.~ If val i= 1 (True) (default if val is omitted) or 0 (False), it translates it to "Yes" or "No".~ If val is '' (empty text) or 'Default' it removes the tag entirely from ACPStyles, if it's there (if obj is a variable, it will now use the model default.)~ Otherwise, it sets the tag to val. For example~ ACP_setStyle('Navigation_style', 'Outline')~ results in ACPstyles of the top model containing:~ Navigation_style: Outline~ ~ { Replaces Toggle_AWP_Flag(), Set_AWP_tag(), Remove_AWP_Flag() and other functions in the old ACP Style library. } Definition: ACP_style_reset := NOT ACP_style_reset;~ IF IsNotSpecified(obj) THEN obj := ACP_Top_model;~ Local styles := AcpStyles OF obj;~ IF styles=Null THEN styles := ACP_Default_style_va;~ val := IF tag <> 'Show_description' and val=0 THEN 'No' ELSE IF val=1 THEN 'Yes' ELSE val;~ styles := IF val=ACP_Default_style_va OR val='Default' THEN TextReplace(styles, tag&':'&'\s*[\w-]+',~ '', caseInsensitive:True, re: True) { Remove the tag }~ ELSE IF FindInText(tag&':', styles, caseInsensitive:True) ~ THEN TextReplace(styles, tag&':\s*[\w-]*', tag&': '&val, caseInsensitive:True, re: True) {Replace value }~ ELSE TextTrim( styles & ACP_Newline & tag&': '&val); { Append tag }~ AcpStyles OF obj := ACP_Clean_newlines(styles) NodeLocation: 472,488,1 NodeSize: 104,16 NodeInfo: 1,1,1 WindState: 2,382,-19,715,771 Decision ACP_Balloon_on_mouse Title: Balloon on mouse over node Description: Check this box to show a balloon next to a node with its title and description (and sometimes more) when you move the mouse cursor over the node. Definition: Checkbox(0) NodeLocation: 680,440,1 NodeSize: 80,20 WindState: 2,91,339,558,313 OnChange: ACP_style_set('show_hover_balloon', self) Decision ACP_Balloon_delay Title: Balloon delay Units: seconds Description: Set the delay time from when you move mouse over a node and when the information balloon appears. This delay prevents balloons from wildly appearing and disappearing when you move the cursor quickly across a diagram. Definition: Choice(ACP_Balloon_delay_ch,6,0) NodeLocation: 680,536,1 NodeSize: 80,20 WindState: 2,326,488,596,368 Aliases: FormNode ACP_New177437571 OnChange: ACP_style_set('Hover_balloon_delay', self*1000) Index ACP_Balloon_delay_ch Att_PrevIndexValue: [0,0.1,0.2,0.3,0.4,0.5,0.6,0.8,1,1.2,1.5,2] Title: balloon delay choices Definition: [0,0.1,0.2,0.3,0.4,0.5,0.6,0.8,1,1.2,1.5,2] NodeLocation: 680,488,1 NodeSize: 80,20 WindState: 2,94,83,476,454 Decision ACP_Identifier_in_ba Title: Identifier in balloon Description: Check this box to show the identifier in the balloon when you hover the cursor over each node. This is useful when reviewing definitions of variables, which use identifiers -- not so much for standard end users. ~ ~ It doesn't show the identifier when it's the same as the title (with underscores replacing spaces). Definition: Checkbox(0) NodeLocation: 680,584,1 NodeSize: 80,20 WindState: 2,305,442,727,381 Aliases: FormNode ACP_New1251179395 OnChange: ACP_style_set('Show_id_in_balloon', self) Decision ACP_Definition_in_ba Title: Definition in balloon Description: Check to show the Definition in the balloon when you move the mouse cursor over the node of a variable, input or output. Useful when reviewing model details -- not so much for normal end users. Definition: Checkbox(0) NodeLocation: 680,632,1 NodeSize: 80,20 WindState: 2,241,106,779,778 Aliases: FormNode ACP_New714308483 OnChange: ACP_style_set('Show_definition_in_balloon', self) Text ACP_Te10 Title: Balloon Help NodeLocation: 684,528,-13 NodeSize: 92,160 NodeInfo: 1,,,,1,1 NodeFont: Arial Black, 15 Decision ACP_Node_highlight_e Title: Node highlight effect Description: Select the effect for highlighting a nodes when you move the cursor over it: ~ Outline: A simple gray rectangle around the node (Recommended)~ Glow: A glowing colored halo.~ None Definition: Choice(Self,1,0) NodeLocation: 1056,432,1 NodeSize: 80,16 WindState: 2,170,30,476,441 {!40300|DomainExpr: Discrete('Outline','Glow','None',type:'text')} OnChange: ACP_style_set('Show_hover_highlight', self='Outline');~ {ACP_style_set('Glow_hover_highlight', self='Glow');}~ {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Text ACP_Te2003366275 Title: Rarely used NodeLocation: 1056,184,-11 NodeSize: 88,176 NodeInfo: 1,,,,1,1 WindState: 2,1274,740,476,224 NodeFont: Arial Black, 15 AcpStyles: Show_description:30 Index ACP_top_modules Att_PrevIndexValue: [Portfolio_optimizati,Details,ACP_Styles] Title: Top modules Description: Potential ACP dashboards, i.e. top model and modules in the top model ~ (but not submodules in those modules), ordered from left to right.~ You can select which ones to include as ACP tabs in "Show modules as tabs".~ If you open ACP_styles library by itself (not inside another model), it includes only itself. Definition: ACP_model_Reset;~ IF ACP_Top_model=Handle(ACP_Styles) THEN CopyIndex([ACP_top_model])~ ELSE BEGIN~ METAIndex mods := #FindObjects(Class: Model, Module, Library,LinkModule, LinkLibrary);~ mods := Subset((ISIN OF (mods)) = ACP_Top_model);~ mods := ACP_Orderobjs(mods, 'Left to right');~ Concat(ACP_Top_model, mods)~ END NodeLocation: 96,104,1 NodeSize: 72,16 WindState: 2,409,36,720,350 ValueState: 2,209,543,473,300,0,MIDM Aliases: Alias ACP_New882080643 MetaOnly: 1 Decision ACP_Show_modules_as_ Title: Show modules as tabs Description: Select the modules that you want to appear as tabs in ACP. ~ They may include the main model and its immediate submodules.~ ~ Ctrl+a to select all modules as tabs. Definition: MultiChoice(ACP_top_modules,1,2,allowNone:0,returnList:1) NodeLocation: 280,104,1 NodeSize: 88,16 WindState: 2,23,37,1063,405 Aliases: FormNode ACP_New831748995 MetaOnly: 1 OnChange: ACP_style_set('show_as_tab', '', ACP_top_modules); ~ { Remove this setting from all modules since Show_as_Tab is default behavior. }~ Local notTabs := #SetDifference(\ACP_top_modules, \self);~ ACP_style_set('show_as_tab', False, notTabs); { Don't show deselected modules as tabs }~ ~ ACP_IncludTop_As_Tab := SetContains(\self, ACP_Top_model); { Show Top_model as tab if selected }~ IF ACP_Hide_nontab_modu THEN ACP_Show_node(ACP_top_modules, NOT SetContains(\notTabs, ACP_top_modules)) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Function ACP_style_get(tag: Text Atom; obj: Optional Handle Atom) Title: ACP_style_get(tag, obj) Description: Get AcpStyles attribute tag of object obj (defaults to top model)~ If tag value is 'yes' it returns 1 (True). If 'No' it returns 0 (False), otherwise it returns the tag value as a text.~ If ACPStyles is empty or tag is missing, it returns Null. Definition: ACP_style_reset;~ IF IsNotSpecified(obj) THEN obj := ACP_Top_model;~ Local styles := AcpStyles OF obj;~ IF styles=Null THEN Null~ ELSE IF FindInText(tag, styles, caseInsensitive: True) = 0 THEN Null~ ELSE FindInText(tag&':\s*(\d+|[\w-]+)',styles, caseInsensitive: True, re: True, subpattern:1, return: 'S') NodeLocation: 472,544,1 NodeSize: 104,16 NodeInfo: 1,1,1 WindState: 2,635,8,964,820 Variable ACP_test_ACP_style_g Title: Eg test ACP_style_get Definition: ACP_style_get('Navigation_style', ACP_Top_model) NodeLocation: 472,600,1 NodeSize: 80,20 ValueState: 2,724,407,416,303,,MIDM Variable ACP_style_reset Title: ACP_style_reset Description: To reset ACP_style_get() after any ACP_style_set() call,~ and to reset Definition: 1 NodeLocation: 104,544,1 NodeSize: 80,20 Text ACP_Te1923076995 Title: Not yet implemented NodeLocation: 872,528,-11 NodeSize: 88,160 NodeInfo: 1,,,,1,1 WindState: 2,1274,740,476,224 NodeFont: Arial Black, 15 AcpStyles: Show_description:30 Decision ACP_Hide_nontab_modu Title: Hide nontab module nodes Description: Check this box to hide top level module nodes that you have deselected in "Show modules as tabs" in desktop Analytica as well as ACP. Definition: Checkbox(1) NodeLocation: 472,312,1 NodeSize: 88,16 WindState: 2,461,246,720,350 Aliases: FormNode ACP_New110328707 Decision ACP_Default_index_me Title: Index menus Description: Select whether to show pivot index menus for graphs and tables as a default style for tables and graphs in Frame or Tall node. ~ Yes: Always show the pivot index menus.~ Fly-in: (default) Show the green pivot icon when you move the cursor over the result. ~ Click the icon to toggle showing the pivot index menus.~ No: Don't show pivot index menus or the green pivot icon, but show slicer menus.~ Not_even_slicers: Show nothing, not even slicer menus.~ ~ This sets the default style, also shown in the Preview to the right.~ You can override these defaults for selected nodes using the options below. Definition: Choice(Self,2,0) NodeLocation: 872,160,1 NodeSize: 80,20 WindState: 2,885,16,779,648 Aliases: FormNode ACP_New68087459, FormNode ACP_New93551491 {!40300|DomainExpr: Discrete('Yes','Fly-in','No','Not_even_slicers',type:['text'])} AcpStyles: Show_index_menus: Yes OnChange: ACP_style_set('Show_index_menus', self);~ IF ACP_is_running THEN ACP_Preview_result; {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Decision ACP_Default_Descript Title: Description Units: % Description: Select maximum percent (vertical) of table or graph in a Frame or Tall node to use to show the Description of the variable. It may use less for a short Description. For a longer description it shows a scroll bar.~ ~ Select 0 to hide the Description.~ ~ This sets the default style, also shown in the Preview to the right.~ You can override these defaults for selected nodes using the options below. Definition: Choice(Self,4,0) NodeLocation: 872,208,1 NodeSize: 80,20 WindState: 2,281,84,747,764 Aliases: FormNode ACP_New1141829283, FormNode ACP_New1167293315 NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15, {!40300|DomainExpr: Discrete(0,5,10,20,30,33,40,50,type:'all')} OnChange: IF ACP_is_running THEN ACP_Preview_result;~ ACP_style_set('Show_description', self); {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Text ACP_Te2027486083 Title: Result styles NodeLocation: 872,184,-11 NodeSize: 88,176 NodeInfo: 1,,,,1,1 WindState: 2,1274,740,476,224 NodeFont: Arial Black, 15 AcpStyles: Show_description:30 Decision ACP_Show_uncertainty {!40300|Att_PrevDomainValue: ['No',0.1,0.2,0.3,0.4,0.5,0.6,0.8]} Title: Uncertainty view Description: Check to show the uncertainty view menu in result views to let users select Mid, Mean, PDF, Sample, and so on. Uncheck to hide it for models with no uncertainties (probabilistic values).~ ~ This sets the default style, also shown in the Preview to the right.~ You can override these defaults for selected nodes using the options below. Definition: Checkbox(1) NodeLocation: 872,64,1 NodeSize: 80,20 WindState: 2,768,62,746,729 Aliases: FormNode ACP_Fo2014244515, FormNode ACP_Fo1157168003 NumberFormat: 2,DB,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15, {!40300|DomainExpr: Discrete()} AcpStyles: Show_uncertainty_view: No OnChange: IF ACP_is_running THEN ACP_Preview_result;~ ACP_style_set('Show_uncertainty_view', self) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Decision ACP_graph_toggle_def {!40300|Att_PrevDomainValue: ['No',0.1,0.2,0.3,0.4,0.5,0.6,0.8]} Title: Graph/ Table toggle icon Description: Check to show the icon in the top right of a Result that lets you toggle between Graph and Table view. ~ ~ This sets the default style, also shown in the Preview to the right.~ You can override these defaults for selected nodes using the options below. Definition: Checkbox(1) NodeLocation: 872,112,1 NodeSize: 80,20 WindState: 2,442,264,746,729 Aliases: FormNode ACP_Fo68087459, FormNode ACP_Fo620297091 NumberFormat: 2,DB,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15, {!40300|DomainExpr: Discrete()} AcpStyles: Show_graph_table_icon: Yes OnChange: IF ACP_is_running THEN ACP_Preview_result;~ ACP_style_set('Show_graph_table_icon', self); {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Decision ACP_Tab_color Title: Tab color Description: Select the color for the ACP tabs:~ Default: Unselected tabs are bluish white. The selected tab (module) uses the background color for its diagram.~ Background: All tabs use their diagram background color, whether selected or not~ Node: The selected Tab uses its diagram background color.The other tabs use the color of their Module node (not their diagram background). You can use this to change tab colors by modifying their node color in an Analytica function -- for example, to show which tabs (modules) the user has visited or completed. Definition: Choice(Self,2,0) NodeLocation: 472,272,1 NodeSize: 88,16 WindState: 2,623,8,720,529 Aliases: FormNode ACP_Fo1730858883 {!40300|DomainExpr: Discrete('Default','Background','Node',type:'text')} AcpStyles: Tab_color: Null OnChange: ACP_style_set('Tab_color', self) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Constant ACP_Default_style_va Title: ACP Default style val Description: Value of ACP style that tells ACP to use the default style (it removes the style tag from ACPStyles) Definition: '' NodeLocation: 104,488,1 NodeSize: 80,20 WindState: 2,1,130,720,350 Decision Show_result_titles {!40300|Att_PrevDomainValue: ['No',0.1,0.2,0.3,0.4,0.5,0.6,0.8]} Title: Show result titles Description: Check to show the Title at the top of graph and table results (tall and frame nodes).~ ~ This sets the default style for all results. You can override these defaults for selected nodes using the options in the "Set non-default styles" module. Definition: Checkbox(1) NodeLocation: 1056,56,1 NodeSize: 80,16 WindState: 2,245,0,746,729 Aliases: FormNode ACP_Fo394256707 NumberFormat: 2,DB,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15, {!40300|DomainExpr: Discrete()} OnChange: ACP_Preview_result;~ ACP_style_set('Show_title', self) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Variable ACP_model_Reset Title: ACP model Reset Description: Reset ACP Styles variables to reflect changes in the parent model. Definition: Checkbox(0) NodeLocation: 96,168,1 NodeSize: 72,24 NodeInfo: 1,,,,,,,0,,,,,,0 WindState: 2,1053,55,736,654 Aliases: Alias ACP_Al1165224259, Alias Al301557571, FormNode ACP_New1368619907 Text ACP_Te1510852419 Title: Obsolete NodeLocation: 1056,528,-11 NodeSize: 88,160 NodeInfo: 1,,,,1,1 WindState: 2,1274,740,476,224 NodeFont: Arial Black, 15 AcpStyles: Show_description:30 Decision ACP_URL_of_Help_page Title: URL of Help page Description: Specify URL for a Help page for this model (accessed from ? menu in ACP). Until this is implemented, you can add a URL link into the model user interface directly. Definition: '' NodeLocation: 872,512,1 NodeSize: 80,16 WindState: 2,519,-17,578,548 Script: ~ OnChange: ACP_style_set('show_banner', self) Module ACP_Top_styles Title: Top styles Author: Max Henrion~ Lumina Date: Mon, Oct 18, 2021 5:28 PM NodeLocation: 472,184,1 NodeSize: 88,16 DiagState: 2,282,81,1169,305,19,10, DisplayInputs: Object Object, Object Decision, Decision ACP_node_radius Variable ACP_obj_types_w_ra Title: Obj types w radius Description: Handles to parent Objects for which you can specify a corner radius. Definition: DetermTable(ACP_object_types)(Handle(Text),Handle(FrameNode),Handle(FormNode),Handle(Button)) NodeLocation: 808,176,1 NodeSize: 72,24 DefnState: 2,77,525,416,303,0,DFNM ValueState: 2,858,560,416,303,,MIDM Variable ACP_Get_radius Title: Get corner radius Description: The maximum corner radius set for any selected object type (Text, Framenode, button or tall node. Definition: Local x := Max(ACP_get_att_field(Nodeinfo, ACP_obj_types_w_ra, 'Corner radius'), ACP_object_types);~ IF IsNumber(x) THEN x ELSE 0 NodeLocation: 808,240,1 NodeSize: 72,24 WindState: 2,112,523,720,350 ValueState: 2,146,590,416,303,,MIDM Variable ACP_Preview_styles Title: Preview styles for results Description: This example result (graph or table) illustrates the effect of the "Styles for result variables" that you select to in the controls to the left. These are the default styles for all results in this model. You can override these defaults for selected variables in "Set non-default styles" module. Definition: 1/(1 + Exp(-(ACP_i1 -5)/@ACP_abc*2))+ ACP_k NodeLocation: 808,96,1 NodeSize: 72,24 NodeInfo: 1,,,,,,,,,,,0 WindState: 2,371,196,762,572 ValueState: 2,1128,151,577,418,1,MIDM Aliases: FormNode ACP_New2123594627, FormNode ACP_Fo636231747, Alias Al1324377923, FormNode ACP_preview_Tall_nod ReformVal: [ACP_i1,ACP_abc] Att_ResultSliceState: [ACP_k,1,ACP_abc,1,ACP_i1,1] {!40300|ProactivelyEvaluate: 4} {!40600|Att_ClusterIndex: ACP_i1} {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Index ACP_i1 Title: eg i Definition: 1 .. 10 NodeLocation: 640,32,1 NodeSize: 72,24 Aliases: Alias Al787507011 Index ACP_abc Title: eg abc Definition: ['A','B','C'] NodeLocation: 808,32,1 NodeSize: 72,24 Aliases: Alias Al1861248835 Index ACP_k Title: eg k Definition: Sequence(0, 3, 1) NodeLocation: 640,96,1 NodeSize: 72,24 Aliases: Alias Al519071555 Index ACP_model_styles Att_PrevIndexValue: ['Navigation_style','show_tabs','Show_outline','Show_As_Tab','Screen size','Tab_color','node_drop_shadow','Bevel_node_border','Show_description','Show_index_menus','Show_uncertainty_view','Show_graph_table_icon','auto_zoom_diagrams'] Title: ACP model styles Definition: ['Navigation_style','show_tabs','Show_outline','Show_As_Tab','Screen size','Tab_color','node_drop_shadow','Bevel_node_border','Show_description','Show_index_menus','Show_uncertainty_view','Show_graph_table_icon','auto_zoom_diagrams'] IndexVals: ['item 1'] NodeLocation: 112,152,1 NodeSize: 64,24 WindState: 2,0,0,720,350 ValueState: 2,117,13,416,303,,MIDM Variable ACP_Model_ACP_style_ Title: Model ACP style settings Description: ACP style settings for this model. Definition: Local x := ACP_Style_get(ACP_model_styles, (ACP_Top_model));~ x := TextSentenceCase(x);~ IF x=Null OR IsNumber(x) THEN x ~ ELSE IF ACP_style_type='Number' THEN ParseNumber(x, 0)~ ELSE IF ACP_style_type='Text' THEN x~ ELSE IF ACP_style_type='Boolean'~ THEN IF x='Yes' THEN 1 ELSE IF x='No' THEN 0 ELSE x~ ELSE 0 NodeLocation: 264,32,1 NodeSize: 64,24 WindState: 2,371,145,720,350 ValueState: 2,907,133,434,413,,MIDM Variable ACP_User_inputs_by_A Title: User input vars by ACP style Description: Handle to each user input option variable for each ACP model style. Definition: Table(ACP_model_styles)(Handle(ACP_Navi_style),Handle(ACP_ToolbarTabs),Handle(ACP_Outline_view),Handle(ACP_IncludTop_As_Tab),Handle(ACP_Screen_size),Handle(ACP_Tab_color),Handle(ACP_Shadows),Handle(ACP_Bevels),Handle(ACP_Default_Descript),Handle(ACP_Default_index_me),Handle(ACP_Show_uncertainty),Handle(ACP_graph_toggle_def),Handle(ACP_auto_zoom)) NodeLocation: 264,96,1 NodeSize: 64,24 WindState: 2,151,40,720,350 DefnState: 2,162,38,416,303,0,DFNM ValueState: 2,170,119,416,303,,MIDM ReformDef: [Undefined,ACP_model_styles] {!40700|Att_CellFormat: CellEntry(0,0,0,0,1)} Variable ACP_defaults_by_ACP_ Title: ACP defaults by ACP style Description: Default values for ACP Styles used by ACP Definition: Table(ACP_model_styles)('Outline',1,1,1,'Browser window','Default',0,0,33,'Fly-in',1,1,0) NodeLocation: 264,208,1 NodeSize: 64,24 WindState: 2,304,15,720,350 DefnState: 2,272,118,416,303,0,DFNM ValueState: 2,308,466,416,303,,MIDM ReformDef: [Undefined,ACP_model_styles] {!40700|Att_CellFormat: CellFormats(CellEntry(0,0,0,0,1),CellEntry(1,0,0,0,0))} Index ACP_Style_fields Att_PrevIndexValue: ['User input vars','Type','ACP Defaults','Library defaults'] Title: ACP Style fields Definition: ['User input vars','Type','ACP Defaults','Library defaults'] NodeLocation: 464,80,1 NodeSize: 64,24 Constant ACP_styles_info Title: ACP styles info Description: Information for each ACP Style, including the corresponding user input variable, the data type, the default value used in ACP, and the default value set in the ACP Styles library. Definition: MultiTable(ACP_Style_fields)(ACP_User_inputs_by_A,ACP_style_type,ACP_defaults_by_ACP_,ACP_style_library_de) NodeLocation: 464,152,1 NodeSize: 64,32 WindState: 2,743,289,720,350 DefnState: 2,228,234,416,303,0,DFNM ValueState: 2,372,378,416,303,,MIDM ReformDef: [ACP_Style_fields,ACP_model_styles] ReformVal: [ACP_Style_fields,ACP_model_styles] Variable ACP_style_type Title: ACP style type Description: Expected data type for each ACP model style. Definition: Table(ACP_model_styles)('Text','Boolean','Boolean','Boolean','Text','Text','Boolean','Boolean','Number','Text','Boolean','Boolean','Boolean') NodeLocation: 264,152,1 NodeSize: 64,24 DefnState: 2,279,48,455,439,0,DFNM ValueState: 2,170,119,416,303,,MIDM ReformDef: [Undefined,ACP_model_styles] {!40700|Att_CellFormat: CellFormats(CellEntry(0,0,0,0,1),CellEntry(0,0,1,0,0))} Variable ACP_style_library_de Title: ACP style library defaults Description: Default values for ACP Styles set by the ACP styles library. Definition: Table(ACP_model_styles)('Top_tabs',0,0,1,'Browser window','Default',1,0,10,'Fly-in',1,1,0) NodeLocation: 264,264,1 NodeSize: 64,24 WindState: 2,247,271,720,350 ValueState: 2,308,466,416,303,,MIDM ReformDef: [Undefined,ACP_model_styles] {!40700|Att_CellFormat: CellFormats(CellEntry(0,0,0,0,1),CellEntry(1,0,0,0,0))} Alias Al298739523 Title: Set node corner radius to Definition: 1 NodeLocation: 640,240,1 NodeSize: 72,24 Original: ACP_node_radius Alias Al1372481347 Title: for object types Definition: 1 NodeLocation: 640,176,1 NodeSize: 72,24 Original: ACP_object_types Close ACP_Top_styles Variable ACP_num_mods_as_tabs Title: Num of top modules shown as tabs Description: List of sequence numbers (1 to n), separated by commas, of top modules (starting with the main model) excluding any whose ACPStyles = show_as_tab: No.~ To be used to reset the ACP_Show_modules_as_ Definition: ACP_model_Reset;~ JoinText(IF TextSentenceCase( ACP_style_get('show_as_tab', ACP_top_modules))='No' THEN Null ~ ELSE @ACP_top_modules, ACP_top_modules, ',') NodeLocation: 96,232,1 NodeSize: 72,24 ValueState: 2,1169,358,416,303,,MIDM Decision ACP_auto_zoom Title: Auto zoom diagrams Description: This style is usually set in the Screen size choice menu on the main Acp Style diagram.~ When set, ACP aautomatically zooms the UI to fit the browser window -- the most constraining of width or height so it retains the aspect ratio. Definition: Checkbox(1) NodeLocation: 280,320,5 NodeSize: 88,24 WindState: 2,698,99,655,653 Aliases: FormNode ACP_Fo377897763 AcpStyles: Show_outline: No OnChange: ACP_style_set('auto_zoom_diagrams', self); {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Decision Hide_Help_menus Title: Hide Help menus Description: Select Help menus that you want to hide from the help (?) menu on the top right of ACP. If you are running ACP on a server behind a firewall, you will usually want to hide all three (leaving only 'Connect status'). Definition: MultiChoice(ACP_Help_menu_option,,allowNone:1) NodeLocation: 1056,192,1 NodeSize: 80,16 WindState: 2,727,524,662,345 Aliases: FormNode Fo690446755 OnChange: INDEX menus := CopyIndex(self);~ ACP_style_set('Remove_help_menu_options', JoinText(menus, menus, ', ')) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Index ACP_Help_menu_option Title: ACP Help menu options Definition: ['ACP_Online_docs','Analytica_Q_A_forum','Tech_support'] NodeLocation: 1056,272,1 NodeSize: 64,32 Close ACP_Style_lib_detail Variable ACP_Style_lib_ready_ Title: ACP Style lib ready to import Description: Set to true when ACP Style lib is running standalone (not embedded in a model) and ready to import into a model.~ ~ When the ACP Style lib is imported into a model, the "ACP Style lib on load" button checks this variable. If it's true, it prompts the user for whether they want to use ACP style defaults from this library, or retain any existing defaults set for the model.~ It then resets this variable to False so it won't do it again the next time the model is loaded. Definition: 0 NodeLocation: 856,32,1 NodeSize: 72,24 WindState: 2,685,192,720,350 Function ACP_Bitn(x, n: Number) Title: ACP_Bitn(x, n) Description: Returns the nth bit of integer x -- i.e. true (1) if x contains the nth power of 2.~ For example, Power2(1, 0)-> 1~ Power2(0, 0)-> 0~ Power2(3, 1)-> 1~ Power2(4, 2)-> 1 Definition: Mod(Floor(x/2^n), 2) NodeLocation: 96,312,1 NodeSize: 88,24 Module ACP_autocalc_by_Diag Title: Set autocalc Description: To view and set Autocalc status by Diagram or Output variable to override the Model default styles Author: Alex Graham~ Lumina Decision Systems Date: Thu, Oct 15, 2020 1:45 PM DefaultSize: 64,24 NodeLocation: 312,240,1 NodeSize: 72,24 NodeInfo: 1,0,0 DiagState: 2,277,408,895,245,23,, WindState: 2,162,418,720,350 DiagramColor: 65535,65535,65535 AcpStyles: show_as_tab: No {!40300|ProactivelyEvaluate: 4} Function ACP_Set_Autocalc(obj: Handle Atom; acMid, acProb, acIndex, acEditMode, evalOnLoad: Atom = False ) Title: Set_Autocalc(obj, acmid, acIndex, acProb) Description: Set object «obj» to Autocalc (aka "Proactively Evaluate") its mid value if «acMid» is True, prob value if «acProb» is True, Index value, «acIndex» is true, all only in Browse mode, unless «acEditMode» is True (all options in except «acMid» default to False). If «obj» is a variable, Autocalc means calculate it when it appears in a user output or Frame node, and recalculate it immediately after user changes any variable that influences it. If «obj» is a Module, it calculates the user outputs when you open its diagram (dashboard) in DTA or ACP. If «obj» is a Button or Picture, «evalOnLoad» = True causes it to calculate when the model is loaded (starts up).~ ~ If all flags are 0 it sets ProactivelyEvaluate to Null, so that if«obj» is a variable or user output, it will use the default autocalc settings for its parent module. Definition: ACP_model_Reset := NOT ACP_model_Reset;~ Local v := ProactivelyEvaluate OF obj;~ v := IF IsNumber(v) THEN v ELSE 0;~ Local start := BitAnd([v, BitNot(4+8+64)]);~ Local newFlags := BitOr([start, acIndex, acMid*4, acProb*8, evalOnLoad*32, acEditMode*64]);~ IF NOT ISNumber(newFlags) THEN MsgBox('In Set_Autocalc, newFlags = '&newFlags&', but it should be a number');~ ProactivelyEvaluate OF obj := IF newFlags=0 THEN Null ELSE newFlags NodeLocation: 112,40,1 NodeSize: 104,24 NodeInfo: 1,1,1 WindState: 2,367,106,897,658 Decision ACP_Autocalc_default Title: Autocalc Description: Select default Autocalc behavior -- i.e. so that user output variables will be calculated automatically when you open a Diagram (or ACP dashboard) containing them.~ None | Calculate them only when a user clicks [Calc] button or asks to view their result in a Frame node -- i.e. "lazy evaluation" which is Analytica's normal behavior.~ ~ Mid values | Automatically calculate the Mid (deterministic value) of output variables when you view Diagram (or ACP dashboard) containing them.~ ~ Mid and prob values | Automatically calculate the Mid and probabilistic value of output variables when you view Diagram (or ACP dashboard) containing them.~ This sets the default for Autocalc in the dashboards (top modules).~ You can override these defaults for selected modules or nodes using the options below. Definition: Choice(ACP_Autocalc_optio1,1,0) NodeLocation: 768,40,1 NodeSize: 88,24 WindState: 2,148,81,720,589 Aliases: FormNode ACP_New580090755, FormNode ACP_New2014244515, FormNode ACP_New160660355 DisplayOutputs: Object Module, Module ACP_old_autocalc OnChange: ACP_Set_Autocalc((ACP_top_modules), ~ acMid: ACP_Autocalc_default <>'None',~ acProb: ACP_Autocalc_default = 'Mid and prob values'); {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Index ACP_Diags_with_User_ Att_PrevIndexValue: [Sensitivity_analysis,Details,Incentive_adjustments,Each_group_solves_with_incentive,Portfolio_optimizati] Title: Diags with User outputs or Framenodes Description: All diagrams that contain user outputs. Definition: ACP_model_Reset;~ Unique(ISIN OF (ACP_User_output_and_)) NodeLocation: 112,184,1 NodeSize: 88,32 WindState: 2,699,76,720,350 ValueState: 2,1105,387,597,369,,MIDM MetaOnly: 1 Index ACP_Autocalc_options Att_PrevIndexValue: ['Default','None','Mid values','Mid and prob values'] Title: Autocalc options + default Definition: Concat('Default', ACP_Autocalc_optio1) NodeLocation: 560,112,1 NodeSize: 88,24 ValueState: 2,1223,516,416,303,,MIDM Aliases: Alias ACP_Al694502979 Function ACP_Autocalc_status(o: Handle Atom) Title: Get_Autocalc_status(o) Description: Returns the autocalc status (from Autocalc options) corresponding to the ProactivelyEvaluate attribute for object o. Definition: ACP_model_Reset;~ Local ac := ProactivelyEvaluate OF (o);~ Slice(ACP_Autocalc_options, ~ IF ac=Null THEN 1~ ELSE IF ACP_Bitn(ac, 3) THEN 4~ ELSE IF ACP_Bitn(ac, 2) THEN 3~ ELSE 2) NodeLocation: 336,112,1 NodeSize: 104,24 NodeInfo: 1,1,1 WindState: 2,997,94,720,538 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Function ACP_Set_Autocalc_st(o: Handle Atom; status: Text) Title: Set_Autocalc_status(o) Description: Set the autocalc status (from Autocalc options) corresponding to the ProactivelyEvaluate attribute for object o. Definition: IF status = 'Default' THEN ACP_Set_Autocalc(o, 0)~ ELSE ACP_Set_Autocalc(o, ~ acMid: status<>'None',~ acProb: status='Mid and prob values') NodeLocation: 336,40,1 NodeSize: 104,24 NodeInfo: 1,1,1 WindState: 2,952,105,720,466 Index ACP_Autocalc_optio1 Att_PrevIndexValue: ['None','Mid values','Mid and prob values'] Title: Autocalc options Definition: ['None','Mid values','Mid and prob values'] NodeLocation: 560,40,1 NodeSize: 88,24 ReformVal: [Undefined,Self] Module ACP_old_autocalc Title: ACP old autocalc Author: Max Henrion Date: Wed, Jul 7, 2021 11:39 PM NodeLocation: 320,192,1 NodeSize: 64,24 NodeInfo: 1,0 DiagState: 2,0,0,1297,757,23,10, DisplayInputs: Object Decision, Decision ACP_Autocalc_default {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Index ACP_Output_vars Att_PrevIndexValue: [] Title: Output vars Definition: LocalAlias m := ACP_Select_a_diagram;~ IF m=Null THEN [] ELSE ACP_User_outputs_in_(m) NodeLocation: 760,496,1 NodeSize: 80,24 ValueState: 2,967,250,510,302,0,MIDM MetaOnly: 1 Decision ACP_User_output Title: User output Description: Select a user output variable from the selected diagram. Definition: Choice(ACP_Output_vars,1,0) NodeLocation: 760,568,1 NodeSize: 80,24 WindState: 2,564,457,720,350 ValueState: 2,1041,955,416,303,,MIDM Aliases: FormNode ACP_New43219843 DisplayOutputs: Object Module, Module ACP_autocalc_UI OnChange: ACP_Autocalc_for_thi := ACP_Autocalc_status(self) Decision ACP_Select_a_diagram Title: Select a diagram Description: Select one of Diagrams that may override the model default autocalc status. Definition: Choice(ACP_Diagrams_that_ov,1,0,0) NodeLocation: 760,424,1 NodeSize: 80,24 NodeInfo: 1,,,,,,,,,,,0 WindState: 2,1044,521,778,524 ValueState: 2,1700,151,416,303,,MIDM Aliases: FormNode ACP_New1553169283, FormNode ACP_New1653832579 DisplayOutputs: Object Module, Module ACP_autocalc_UI OnChange: ACP_Autocalc_for_thi := IF Self-Null THEN 'Default'~ ELSE ACP_Autocalc_status(self) Function ACP_User_outputs_in_(m : module) Title: User_outputs_in_ module(m) Description: A list of the user outputs (Formnodes with Value 1) in module m (and not its submodules). Definition: #SetIntersection([FindObjects(class: Formnode, attribute: Fixeddef, value:1),~ \(Contains of m)]) NodeLocation: 552,496,1 NodeSize: 88,24 NodeInfo: 1,,1 WindState: 2,276,525,889,436 Decision ACP_Diagrams_that_ov Att_PrevIndexValue: [] Title: Diagrams that override model default Description: Select those diagrams for which you want to override the model default Autocalc status for some or all variables. You can select none, one, some, or all Diagrams (ctrl+A).~ ~ Those not selected use the Autocalc model default. Definition: MultiChoice(ACP_Diags_with_User_,allowNone:1,returnList:1) NodeLocation: 760,352,1 NodeSize: 80,24 WindState: 2,766,249,720,350 Aliases: FormNode ACP_New1116961667 DisplayOutputs: Object Module, Module ACP_autocalc_UI OnChange: ACP_Set_Autocalc_st((ACP_Diagrams_that_ov), ACP_Autocalc_default) Button ACP_all_user_outputs Title: Set all user outputs to Autocalc NodeLocation: 560,648,1 NodeSize: 88,24 WindState: 2,792,518,720,350 OnClick: ACP_Set_Autocalc((ACP_Diags_with_User_), 1, 1, 0) Button ACP_Initialize_to_ca Title: Initialize to calc on load NodeLocation: 760,648,1 NodeSize: 88,24 WindState: 2,1015,68,720,350 OnClick: ACP_Set_Autocalc(Handle(ACP_Init_show_in_fra), acMid:1, evalOnLoad: 0) Variable ACP_Autocalc_by_di1 Title: Autocalc by diags w outputs Definition: ACP_Get_att(ProactivelyEvaluate, (ACP_Diags_with_User_)) NodeLocation: 264,32,1 NodeSize: 88,24 ValueState: 2,598,565,470,612,,MIDM Decision ACP_Autocalc_for_thi Title: Autocalc for this user output Description: Select the autocalc status you want for this user output. Definition: Null NodeLocation: 1192,496,1 NodeSize: 88,24 WindState: 2,794,129,720,350 Aliases: FormNode ACP_New311655299 DisplayOutputs: Object Module, Module ACP_autocalc_UI OnChange: ACP_Set_Autocalc_st((ACP_User_output), self) Variable ACP_Autocalc_status_ Title: Autocalc status by diagram Description: The default autocalc status by diagram. ~ Selected diagrams may contain variables that override their default status. Definition: ACP_Autocalc_status(ACP_Diags_with_User_) NodeLocation: 984,360,1 NodeSize: 88,24 WindState: 2,747,122,720,350 ValueState: 2,1080,66,516,218,,MIDM Aliases: FormNode ACP_New1922268035 DisplayOutputs: Object Module, Module ACP_autocalc_UI AcpStyles: Show_uncertainty_view: Yes~ show_graph_table_icon:yes~ Show_Description: 20~ Show_index_menus: Fly-in~ Show_graph_table_icon: Yes {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Variable ACP_Autocalc_statu2 Title: Autocalc status for vars in this diag Definition: ACP_Autocalc_status(ACP_Output_vars) NodeLocation: 984,496,1 NodeSize: 88,24 ValueState: 2,626,349,416,303,0,MIDM Aliases: FormNode ACP_New848526211 DisplayOutputs: Object Module, Module ACP_autocalc_UI AcpStyles: Show_uncertainty_view: Yes~ show_graph_table_icon: yes~ Show_Description: 20~ Show_index_menus: Fly-in~ Show_graph_table_icon: Yes {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Decision ACP_Autocalc_defdiag Title: Default autocalc for this diagram Description: Select the default autocalc status you want for variables in this Diagram. Definition: Choice(ACP_Autocalc_options,2,0) NodeLocation: 1080,176,1 NodeSize: 88,24 WindState: 2,98,82,720,350 Aliases: FormNode ACP_New1385397123 DisplayOutputs: Object Module, Module ACP_autocalc_UI OnChange: ACP_Set_Autocalc_st((ACP_Select_a_diagram), self) Decision ACP_Autocalc_also_in Title: Autocalc also in Edit mode Definition: Checkbox(0) NodeLocation: 1080,240,1 NodeSize: 88,24 Decision ACP_prob_comps Title: prob computations Description: Check if you want to set Autocalc (Proactive evaluation) for the probabilistic value of User outputs as well as Mid (deterministic values). If probabalistic values take a long time to compute, It's usually best to leave this unchecked Definition: Checkbox(0) NodeLocation: 472,216,1 NodeSize: 64,24 WindState: 2,98,82,774,619 Aliases: FormNode ACP_New747862915 OnChange: ACP_SaveProactFlags() Decision ACP_Configure Title: Configure Description: What level to configure the proactive calculation at. Definition: Choice(Self,2,0) NodeLocation: 88,96,1 NodeSize: 64,24 Aliases: FormNode ACP_New1821604739 {!40300|DomainExpr: Discrete('Module level','Variable','Output node only',type:['text'])} OnChange: ACP_Set_Checkboxes() Decision ACP_mid_computations Title: mid computations Definition: Checkbox(0) NodeLocation: 472,160,1 NodeSize: 64,24 OnChange: ACP_SaveProactFlags() Decision ACP_Autocalc_in_edit Title: Autocalc in edit mode Description: Check if you want to set Autocalc (Proactive evaluation) for User outputs in Edit mode as well as Browse mode. Definition: Checkbox(0) NodeLocation: 472,272,1 NodeSize: 64,24 WindState: 2,367,458,720,350 Aliases: FormNode ACP_New479427459 OnChange: ACP_SaveProactFlags() Function ACP_Set_Checkboxes() Title: Set Proactive Checkboxes Definition: ACP_mid_computations := BitAnd([ACP_src_flags,4])>0;~ ACP_prob_comps := BitAnd([ACP_src_flags,8])>0;~ ACP_Autocalc_in_edit := BitAnd([ACP_src_flags,64])>0;~ ChangeNodeVisibility(Handle(ACP_User_output), if ACP_Configure='Module level' then 'Hidden' else 'Visible',what:'UserInputs') NodeLocation: 296,216,1 NodeSize: 64,24 WindState: 2,435,181,927,575 Variable ACP_Proactive_src Title: Proactive src Definition: DetermTable(ACP_Configure)(ACP_Select_a_diagram,original of (ACP_User_output),ACP_User_output) NodeLocation: 248,96,1 NodeSize: 64,24 DefnState: 2,193,435,769,303,0,DFNM ValueState: 2,968,162,416,303,,MIDM Variable ACP_src_flags Title: src flags Definition: Local v := ProactivelyEvaluate of (ACP_Proactive_src);~ if IsNumber(v) then v else 0 NodeLocation: 400,96,1 NodeSize: 64,24 WindState: 2,759,55,720,350 ValueState: 2,45,598,416,303,,MIDM NumberFormat: 2,B,6,2,0,0,6,0,$,0,"ABBREV",0,,,0,0,15 Function ACP_SaveProactFlags() Title: Save proactive flags Definition: Local start := BitAnd([ACP_src_flags,BitNot(4+8+64)]);~ Local newFlags := BitOr([ start, ACP_mid_computations*4, ACP_prob_comps*8, ACP_Autocalc_in_edit*64 ]);~ ProactivelyEvaluate of (ACP_Proactive_src) := if newFlags=0 then null else newFlags NodeLocation: 744,184,1 NodeSize: 64,24 WindState: 2,685,533,894,532 Button ACP_Proactive_sync Title: Proactive sync Description: This button synchs the checkboxes with the currently selected configuration, diagram & variable.~ Its purpose is to synch these when the library is first loaded NodeLocation: 96,40,1 NodeSize: 64,24 {!40300|ProactivelyEvaluate: 32} OnClick: ACP_Set_Checkboxes() {!50500|ArrowClass ACP_Arrow628413059} {!50500|Att_HeadNode: ACP_SaveProactFlags} {!50500|Att_TailNode: ACP_Proactive_src} {!50500|Att_ArrowWayPoints: [Null,Null,0.4444444444444444,-56]} {!50500|Att_ArrowProperties: 1} Decision ACP_Select_Autocalc Title: Set Autocalc Description: Apply Autocalc -- i.e. Proactively evaluate User outputs when user views Module containing them Definition: Choice(Self,1,0) NodeLocation: 880,176,1 NodeSize: 64,24 WindState: 2,448,407,1176,762 Aliases: FormNode ACP_New1016298371 {!40300|DomainExpr: Discrete('for all user outputs','for no user outputs','for selected diagrams')} OnChange: IF self='for all user outputs' THEN BEGIN~ ACP_Hide_node(Handle(ACP_Diagrams_that_ov), what: 'UserInputs');~ ACP_Set_Autocalc(ACP_Diags_with_User_, 1, ACP_prob_comps, ACP_Autocalc_in_edit)~ END~ ELSE IF self='for no user outputs' THEN BEGIN~ ACP_Hide_node(Handle(ACP_Diagrams_that_ov), what: 'UserInputs');~ ACP_Set_Autocalc(ACP_Diags_with_User_, 0,0,0)~ END~ ELSE IF self='for selected diagrams' THEN BEGIN~ ACP_Show_node(Handle(ACP_Diagrams_that_ov), what: 'UserInputs');~ Definition OF ACP_Diagrams_that_ov := 'MultiChoice('&Handle(ACP_Diags_with_User_)&', allowNone:True)'; {Select diagrams }~ ACP_Set_Autocalc(ACP_Diagrams_that_ov, 1, ACP_prob_comps, ACP_Autocalc_in_edit)~ END Decision ACP_prob_comps1 Title: prob computations Description: Check if you want to set Autocalc (Proactive evaluation) for the probabilistic value of User outputs as well as Mid (deterministic values). If probabalistic values take a long time to compute, It's usually best to leave this unchecked Definition: Checkbox(0) NodeLocation: 880,232,1 NodeSize: 64,24 OnChange: ACP_SaveProactFlags() Decision ACP_Autocalc_in_ed1 Title: Autocalc in edit mode Description: Check if you want to set Autocalc (Proactive evaluation) for User outputs in Edit mode as well as Browse mode. Definition: Checkbox(0) NodeLocation: 880,288,1 NodeSize: 64,24 WindState: 2,367,458,720,350 OnChange: ACP_SaveProactFlags() Text ACP_Te146049277 Title: Autocalc by Diagram NodeLocation: 248,488,-1 NodeSize: 192,104 NodeInfo: 1,,,,1,1 NodeColor: 65535,63895,52427 Button ACP_Refresh_options Title: Refresh Description: Click to refresh the list of diagrams. You should do this after any NodeLocation: 310,394,1 NodeSize: 38,10 WindState: 2,1183,67,720,350 OnClick: InvalidateResult(ACP_Diags_with_User_) Button ACP_Open1 Title: Open NodeLocation: 440,424,1 NodeSize: 44,20 OnClick: Local d :=ACP_Select_a_diagram;~ ShowWindow(d, 'Diagram') FormNode ACP_New747862915 Title: prob computations Definition: 0 NodeLocation: 148,540,1 NodeSize: 84,12 Original: ACP_prob_comps FormNode ACP_New1821604739 Title: Configure for Definition: 0 NodeLocation: 200,460,1 NodeSize: 128,12 NodeInfo: 1,,,,,,,152,,,,,,0 Original: ACP_Configure FormNode ACP_New479427459 Title: Proactive in edit mode Definition: 0 NodeLocation: 148,564,1 NodeSize: 84,12 Original: ACP_Autocalc_in_edit FormNode ACP_New1553169283 Title: Which diagram Definition: 0 NodeLocation: 204,424,1 NodeSize: 140,16 NodeInfo: 1,,,,,,,118,,,,,,0 Original: ACP_Select_a_diagram FormNode ACP_New1016298371 Title: Autocalc status Definition: 0 NodeLocation: 232,512,1 NodeSize: 168,16 NodeInfo: 1,,,,,,,204 Original: ACP_Select_Autocalc Alias ACP_New2090040195 Title: Auto calc Definition: 1 NodeLocation: 264,320,2 NodeSize: 88,24 Original: ACP_Auto_calc Module ACP_autocalc_UI Title: old autocalc UI Author: Max Henrion~ Lumina Date: Wed, Sep 22, 2021 7:42 PM NodeLocation: 984,424,1 NodeSize: 64,24 DiagState: 2,0,0,1334,819,17 DisplayInputs: Object Object, Object Variable, Object Decision, Decision ACP_User_output, Decision ACP_Select_a_diagram, Decision ACP_Diagrams_that_ov, Decision ACP_Autocalc_for_thi, Variable ACP_Autocalc_status_, Variable ACP_Autocalc_statu2, Decision ACP_Autocalc_defdiag Text ACP_Te1428869763 Title: Autocalc Description: Normally, you have to click [Calc] button for a user output or ask to see a result in another way before Analytica calculates a variable. ~ ~ "Autocalc" means that Analytica will automatically calculate the value of every user output when you view its tab dashboard in ACP or parent Diagram in desktop Analytica. This is an alternative to the default method, where the user must click on each User output to compute its value. With Autocalc set each visible user output recalculates immediately when the user changes any input that affects it. ~ ~ Autocalc is sometimes called "Proactive Evaluation" as an alternative to Analytica's default "Lazy Evaluation". It works well for simple models that don't take long to evaluate. For user outputs that take more than a few seconds to evaluate, it's usually best to leave Autocalc off, especially if an end user may want to modify several inputs before looking at the result. NodeLocation: 348,568,-1 NodeSize: 300,152 NodeInfo: 1,,,,1,1 Button ACP_all_output_vars_ Title: Set all output vars to model default autocalc Description: Click to reset all user output variables (including tall nodes) to the default Autocalc settings. NodeLocation: 532,92,1 NodeSize: 100,20 OnClick: Definition OF ACP_Diagrams_that_ov := 'MultiChoice(Diags_with_User_outp,,allowNone:1,returnList:1)' Button ACP_Open_diagram1 Title: Open diagram NodeLocation: 532,204,1 NodeSize: 100,20 OnClick: ShowWindow(ACP_Select_a_diagram, 'Diagram') Button ACP_Reset_all_output Title: Reset all output vars to diagram default Description: Click to reset all user output variables (including tall nodes) to the default Autocalc settings. NodeLocation: 532,292,1 NodeSize: 100,20 OnClick: ACP_Set_Autocalc_st(ACP_Output_vars, 'Default') Text ACP_Te609805187 Title: Set Autocalc to override model default NodeLocation: 348,216,-1 NodeSize: 300,192 NodeInfo: 1,,,,1,1 FormNode ACP_New43219843 Title: Output to configure Definition: 0 NodeLocation: 348,344,3 NodeSize: 292,16 NodeInfo: 1,,,,,,,276,,,,,,,,,, Original: ACP_User_output FormNode ACP_New1116961667 Title: Select diagrams Definition: 0 NodeLocation: 348,136,1 NodeSize: 292,16 NodeInfo: 1,,,,,,,276,,,,1 Original: ACP_Diagrams_that_ov FormNode ACP_New580090755 Title: Autocalc for Definition: 0 NodeLocation: 348,56,1 NodeSize: 292,16 NodeInfo: 1,,,,,,,276,,,,,,, Original: ACP_Autocalc_default FormNode ACP_New1653832579 Title: Select a diagram Definition: 0 NodeLocation: 348,168,1 NodeSize: 292,16 NodeInfo: 1,,,,,,,276,,,,,,, Original: ACP_Select_a_diagram FormNode ACP_New311655299 Title: Default auto calc for this diagram Definition: 0 NodeLocation: 348,376,1 NodeSize: 292,16 NodeInfo: 1,,,,,,,276,,,,,,,,,, Original: ACP_Autocalc_for_thi FormNode ACP_New1385397123 Title: Default status for this diagram Definition: 0 NodeLocation: 348,248,1 NodeSize: 292,16 NodeInfo: 1,,,,,,,276,,,,,,, Original: ACP_Autocalc_defdiag FormNode ACP_New848526211 Title: Autocalc status for vars in this diag Definition: 1 NodeLocation: 948,552,1 NodeSize: 292,168 NodeInfo: 1,,,,1,1,,276 NodeColor: 58982,58982,58982 Original: ACP_Autocalc_statu2 FormNode ACP_New1922268035 Title: Autocalc status by diag Definition: 1 NodeLocation: 948,200,1 NodeSize: 292,176 NodeInfo: 1,,,,1,1,,276 NodeColor: 58982,58982,58982 Original: ACP_Autocalc_status_ Button ACP_assign_none_to_m Title: assign none to multichoce NodeLocation: 1024,180,1 NodeSize: 64,28 OnClick: ACP_Diagrams_that_ov := 'None' Close ACP_autocalc_UI Close ACP_old_autocalc Alias ACP_Al1165224259 Title: ACP Styles Lib Reset Definition: 1 NodeLocation: 112,112,1 NodeSize: 88,24 Original: ACP_model_Reset Close ACP_autocalc_by_Diag Button ACP_Set_ACP_styles_a Title: Set model ACP styles to Lib settings Description: Click to apply the ACP styles set in this library as the defaults for this model. NodeLocation: 472,160,1 NodeSize: 72,24 WindState: 2,284,0,917,668 OnClick: IF NOT ACP_is_running THEN Msgbox('These styles do not apply in desktop Analytica. You will need to upload the model to ACP to see their effects.', 0, 'Warning');~ ACP_style_set('Navigation_style',ACP_Navi_style);~ { Set "Show modules as tabs" to }~ Definition OF ACP_Show_modules_as_ := 'MultiChoice(ACP_top_modules,allowNone:0,returnList:1)';~ ACP_style_set('Tab_color', ACP_Tab_color);~ ACP_style_set('Show_outline', ACP_Outline_view);~ ACP_style_set('Show_tabs',ACP_ToolbarTabs);~ ACP_SetDashSize(ACP_Screen_size, ACP_Margin);~ ~ ACP_style_set('Node_drop_shadow', ACP_Shadows);~ ACP_style_set('Bevel_node_border', ACP_Bevels);~ ACP_Set_att_field(Nodeinfo, ACP_obj_types_w_ra, ACP_node_radius, 'Corner radius');~ ~ ACP_style_set('Show_title', Show_result_titles);~ ACP_style_set('Show_uncertainty_view', ACP_Show_uncertainty);~ ACP_style_set('Show_graph_table_icon', ACP_graph_toggle_def);~ ACP_style_set('Show_description', ACP_Default_Descript);~ ACP_style_set('Show_index_menus', ACP_Default_index_me);~ ~ ACP_Set_Autocalc((ACP_top_modules), ~ acMid: ACP_Autocalc_default <>'None',~ acProb: ACP_Autocalc_default = 'Mid and prob values');~ Button ACP_Run_on_import Title: Run on import Description: This button is set to run automically when the model is loaded.~ The only reason to click it is to test it.~ If ACP_Style_lib_alone (and the ACP_styles is not running alone) it assumes that the ACP Style library is being imported into a model, and it sets the ACP Style model defaults. NodeLocation: 668,32,1 NodeSize: 76,24 WindState: 2,292,37,990,765 {!40300|ProactivelyEvaluate: 32} OnClick: IF ACP_Style_lib_ready_ AND HandleFromIdentifier("ACP_styles_added") = null AND ACP_Top_model<>Handle(ACP_Styles) AND ACP_Top_model<>Handle(Orphans) THEN BEGIN~ IF Sys_DomainSelfIndex THEN Sys_DomainSelfIndex:=False;~ { Switch off this ancient legacy preference, which is incompatible with Multichoice}~ {ACP_Reinit_formnode_; } { Clean up a common problem with form node defaults }~ ACP_Reset_changes; { Reflect latest changes in the model }~ Local noACPStyles := ACP_Get_att(ACPStyles, ACP_Top_model)=Null;~ IF Msgbox((IF noACPStyles~ THEN 'This model has no ACP Styles set. Would you like to use the standard ACP defaults (Outline, Tool tabs)? [yes]'~ ELSE 'This model already has some ACP Styles set. Would you like to retain them? [yes]') & ACP_Newline~ & 'Or would you prefer to use the recommended defaults (Tabs across the top, node shadows, descriptions in results) [No]'~ & ACP_Newline & 'Either way you can modify them later with this ACP Styles library.',~ buttons: 4 + 32, title: 'Standard ACP settings?')=6 { Yes }~ THEN (IF noACPStyles THEN ACP_Set_ACP_defaults ~ ELSE (MsgBox('OK. We will update the ACP Style library settings to match those in this model.', 1, ~ 'Confirmation'));~ ACP_Set_user_inputs_)~ ELSE BEGIN { Reset model default styles with those set in this library }~ ACP_Set_att(ACPstyles, (ACP_Top_model), Null); {Delete any previous ACP styles from the model} ~ ACP_Set_ACP_styles_a; { Set defaults from this ACP Styles library }~ END;~ ACP_Style_lib_ready_ := False; { Set so that this won't run again the next time the parent model is loaded.}~ END;~ Button ACP_Reinit_formnode_ Title: Reinit formnode nodeinfo Description: Click to reinitialize the NodeInfo for the default Formnode (user inputs and outputs), Framenode, Text node, and Button. This fixes a problem due to a former bug in the ACP Styles Lib that sometimes causes user input choice menus to take the full width of the node, and buttons in user outputs to be in the middle instead of left or right of the node. NodeLocation: 472,240,1 NodeSize: 72,24 WindState: 2,79,522,720,350 OnClick: Nodeinfo OF Handle(Formnode) := '1,0,0,,0,0,,,,0,,,0';~ Nodeinfo OF Handle(Framenode) := '1,0,0,0,,,,,,,,,0';~ Nodeinfo OF Handle(Text) := '1,0,0,,0,0,,,,,,,0';~ Nodeinfo OF Handle(button) := '1,0,0,1,1,1,0,,1,0,0,0,,,0'; Button ACP_Set_ACP_defaults Title: Set ACP defaults Description: Click to set ACP style defaults to those set in ACP3 -- i.e. when there are no explicit settings in ACP styles of the top Model. NodeLocation: 472,96,1 NodeSize: 72,24 WindState: 2,311,119,720,350 OnClick: IF NOT ACP_is_running THEN Msgbox('These styles do not apply in desktop Analytica. You will need to upload the model to ACP to see their effects.', 0, 'Warning');~ ~ ACP_Navi_style := 'Outline';~ ACP_Outline_view := True;~ ACP_Show_dash_title := False;~ ACP_ToolbarTabs := True;~ ACP_Tab_color := 'Default';~ ACP_Screen_size := 'Browser window';~ ACP_Shadows := False;~ ACP_Bevels := False;~ ACP_Show_uncertainty := True;~ ACP_graph_toggle_def := True;~ ACP_Default_Descript := 20;~ ACP_Default_Descript := 33;~ ACP_Default_index_me := 'Fly-in';~ {Show the Intro}~ ACP_styles_Intro~ Button ACP_Set_user_inputs_ Title: ACP Set lib inputs to model settings Description: Click to set user inputs in ACP styles lib to the model-level ACP Styles in this model. NodeLocation: 668,160,1 NodeSize: 76,28 WindState: 2,336,0,847,554 OnClick: ACP_style_reset := NOT ACP_style_reset;~ FOR s := ACP_model_styles DO BEGIN~ LocalAlias acps := ACP_User_inputs_by_A[ACP_model_styles=s];~ Local x := ACP_Model_ACP_style_[ACP_model_styles=s];~ {MsgBox('In ACP_Set_user_inputs_, acps = '&Handle(acps)&' and x = '&x);}~ ACP_Set_choice_check(Handle(acps), ~ IF x=Null THEN ACP_defaults_by_ACP_[ACP_model_styles=s] ELSE x)~ END;~ ACP_Hierarchy_bar_ac := ShowHier; {Set show hierarchy bar to system var ShowHier}~ Definition OF ACP_Show_modules_as_ := {Set to top modules to be shown as tabs}~ 'MultiChoice('&Identifier OF ACP_top_modules &', '~ & ACP_num_mods_as_tabs &',allowNone:0,returnList:1)';~ ACP_Set_choice_check(Handle(ACP_node_radius), ACP_Get_radius);~ IF (ACP_auto_zoom) THEN ~ ACP_Set_choice_check(Handle(ACP_Screen_size), 'Auto zoom')~ Button ACP_Make_ready_for_i Title: Make ready for import Description: Click to make this ACP Styles library ready to import into another model.~ Normally, you should do this when running this library stand-alone, rather than embedded within a model. You may also click "Set ACP style defaults" if you want to make sure it uses the standard defaults.~ ~ This button sets ACP_Style_lib_alone. When someone imports this library into another model, it will then trigger setting the ACP style model defaults for that model. NodeLocation: 472,32,1 NodeSize: 72,24 WindState: 2,484,169,720,350 OnClick: ACP_Style_lib_ready_ := True;~ ACP_styles_Intro;~ Definition OF ACP_object_types := 'MultiChoice(Self,1,2,3,allowNone:0,returnList:1)';~ ACP_Set_Autocalc(Handle(ACP_Run_on_import), evalOnLoad: 1);~ ACP_Reset := NOT ACP_Reset; ~ {set "Run on import" button to evaluate on loading } Button ACP_Init_on_load Title: Initialize On Model Load Description: Click to initialize selected ACP Styles when you load a model using the ACP Style library. NodeLocation: 668,88,1 NodeSize: 76,24 WindState: 2,485,254,855,388 {!40300|ProactivelyEvaluate: 32} OnClick: ACP_show_node(ListOfHandles(ACP_Decision_exampl1, ACP_Variable_exampl1), ACP_Shadows AND NOT ACP_is_running); Function ACP_Set_choice_check(var: Handle Atom; val: Atom; domainVals: Optional) Title: ACP_Set_choice_check(var, val) Description: If var is a variable containing a Choice, it checks if val is in its domain and if it is, assigns val as the new value of var.~ If var is a variable containing a Checkbox, and val is 1 or 0, it assigns 1 or 0 as the new value of var.~ If val is not in the domain (or 0 or 1 for a Checkbox) it gives a warning and does not do the assignment. Definition: LocalAlias uiVar := var;~ Local def := Definition OF uiVar;~ IF SelectText(def, 1, 7)='Choice(' THEN~ IF Setcontains(\(IF IsNotSpecified(domainVals) THEN Domain OF uiVar~ ELSE domainVals), val)~ THEN uiVar := val~ ELSE MsgBox(val & ' is not a valid option for user input "'&Title OF uiVar&'"', 1+48, 'Warning')~ ELSE IF SelectText(def, 1, 9)='Checkbox(' THEN BEGIN~ IF val=0 OR val=1 ~ THEN uiVar := val~ ELSE MsgBox(val & ' is not a valid option for user input '&Title OF uiVar, 1+48, 'Warning')~ END~ ELSE MsgBox('Variable '&Title OF uiVar&' is not the kind of variable to which you can assign a value like '&val, 1+48, 'Warning') NodeLocation: 144,376,1 NodeSize: 136,24 WindState: 2,396,78,765,624 Button ACP_test_set_choice_ Title: test ACP_set_choice_check Description: Click to test ACP_Set_choice_check NodeLocation: 464,380,1 NodeSize: 72,28 OnClick: ACP_Set_choice_check(Handle(ACP_Default_Descript), 50) Module ACP_styles_for_nodes Title: ACP styles for nodes details Description: Click to change identifiers of Frame nodes to X_frame, where X is the first 10 chars of the identifier of the parent module for each frame. Author: Max Henrion Date: Wed, Jul 7, 2021 11:39 PM NodeLocation: 312,168,1 NodeSize: 72,24 DiagState: 2,150,27,1100,542,19,10, WindState: 2,98,82,720,350 Index ACP_Frame_nodes Att_PrevIndexValue: [Te378907187,Te120171059,Te991816243,Te958261811,Te1160358451] Title: ACP Frame nodes Description: All Frame nodes in the model.~ Excludes those in ACP_styles Definition: ACP_model_Reset;~ #SetDifference(FindObjects(Class: FrameNode), ~ FindObjects(Class: FrameNode, within: Handle(ACP_Styles))) NodeLocation: 112,96,1 NodeSize: 72,24 WindState: 2,899,371,720,350 ValueState: 2,225,280,296,385,0,MIDM Aliases: Alias Al1198090051 MetaOnly: 1 Index ACP_User_output_and_ Att_PrevIndexValue: [Marginal_value_vs_co,Most_valuable_projec,Optimal_funded_proj1,Optimal_total_value,Group_vs_global_fund,Incentive_value2,Te378907187,Te120171059,Te991816243,Te958261811,Te1160358451] Title: User output and Frame nodes Description: User output nodes and Frame nodes, excluding those in ACP_styles library.~ Definition: ACP_model_Reset;~ #Setunion([\ACP_User_output_node, \ACP_Frame_nodes]) NodeLocation: 296,96,1 NodeSize: 72,24 WindState: 2,976,417,720,350 ValueState: 2,1036,152,488,493,0,MIDM MetaOnly: 1 Variable ACP_Styles_by_node Title: Styles by node Description: Node style settings for each frame node and tall node. ~ Use the controls on the top left to reset them all to the same default.~ Use the controls on the bottom left to set selected objects to other options. Definition: ACP_style_get(ACP_tag_by_style, ACP_User_output_and_) NodeLocation: 488,32,1 NodeSize: 72,24 ValueState: 2,1331,61,471,427,0,MIDM ReformVal: [ACP_Node_styles,ACP_User_output_and_] AcpStyles: Show_uncertainty_view: Yes~ show_graph_table_icon: yes~ Show_index_menus: No~ Show_Description: 20 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Decision ACP_Objects_w_non_de Title: Objects w nondefault styles Description: Select any objects for which you want to specify non-default result table or graph styles. You can then select their styles from "Set result styles by node" just below. Definition: MultiChoice(ACP_User_output_and_,allowNone:1,returnList:1) NodeLocation: 488,96,1 NodeSize: 72,24 WindState: 2,373,311,720,350 ValueState: 2,1105,63,416,303,0,MIDM Aliases: FormNode ACP_Fo805914179, FormNode ACP_Fo1201976899, FormNode ACP_New1771273091 MetaOnly: 1 Index ACP_Node_styles Att_PrevIndexValue: ['Uncertainty view','Graph/table icon','Description','Index'] Title: Node styles Definition: ['Uncertainty view','Graph/table icon','Description','Index'] IndexVals: ['item 1'] NodeLocation: 112,32,1 NodeSize: 72,24 Variable ACP_tag_by_style Title: Tag by node style Description: ACP style tag for each Node style Definition: Table(ACP_Node_styles)('Show_uncertainty_view','Show_graph_table_icon','Show_Description','Show_index_menus') NodeLocation: 304,32,1 NodeSize: 72,24 DefnState: 2,1284,448,416,303,0,DFNM ValueState: 2,292,298,416,303,,MIDM Index ACP_Index_menu_optio Att_PrevIndexValue: ['Default','No','Fly-in','Yes'] Title: Index menu options w def Definition: ['Default','No','Fly-in','Yes'] NodeLocation: 296,408,1 NodeSize: 88,24 Index ACP_Descrip_opts_w_d Att_PrevIndexValue: ['Default',0,5,10,20,30,33,40,50] Title: Descrip options w default Description: Options for description style for tall and frame nodes, with 'Default' meaning use the model default. Definition: ['Default',0,5,10,20,30,33,40,50] IndexVals: ['item 1'] NodeLocation: 296,464,1 NodeSize: 88,24 WindState: 2,98,82,720,350 ValueState: 2,276,282,416,303,,MIDM NumberFormat: 2,I,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15, Decision ACP_styles_by_node1 Title: Set styles by node Description: Select the "Show index" and "Description" style for each Frame or Tall node.~ "Default" means use the model default styles. Definition: Table(ACP_User_output_and_,ACP_Node_styles)(~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0),~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0),~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0),~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0),~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0),~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0),~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0),~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0),~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0),~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0),~ Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0)) NodeLocation: 488,336,1 NodeSize: 72,24 WindState: 2,290,234,750,487 DefnState: 2,839,151,831,431,0,DFNM ValueState: 2,100,106,886,460,0,MIDM ReformDef: [ACP_Node_styles,ACP_User_output_and_] ReformVal: [ACP_Node_styles,ACP_User_output_and_] TableCellDefault: ACP_vals_for_Set_sty OnChange: ACP_style_set(ACP_tag_by_style, ACP_styles_by_node2, (ACP_Objects_w_non_de) ) {!50000|Att_ColumnWidths: [,ACP_Node_styles,\([,,97,])]} {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute OnChange} Variable ACP_vals_for_Set_sty Title: Def vals for Set styles by node Definition: Table(ACP_Node_styles)(Choice(ACP_Default_yes_no,1,0),Choice(ACP_Default_yes_no,1,0),Choice(ACP_Descrip_opts_w_d,1,0),Choice(ACP_Index_menu_optio,1,0)) NodeLocation: 296,336,1 NodeSize: 72,24 DefnState: 2,440,459,861,303,0,DFNM ReformDef: [Null,ACP_Node_styles] Decision ACP_styles_by_node2 Title: Set styles by node Description: Select the desired ACP style for each Frame or Tall node.~ "Default" means use the default style set for this model. Definition: Subtable(ACP_styles_by_node1[ACP_User_output_and_=ACP_Objects_w_non_de]) NodeLocation: 488,240,1 NodeSize: 72,24 WindState: 2,82,72,718,555 DefnState: 2,1136,443,552,449,0,DFNM ValueState: 2,596,602,517,289,,MIDM Aliases: FormNode ACP_Fo1656047171 ReformDef: [ACP_Node_styles,ACP_Objects_w_non_de] ReformVal: [ACP_Node_styles,ACP_Objects_w_non_de] NumberFormat: 2,G,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15, Variable ACP_node_styles1 Title: ACP node styles Definition: ACP_style_get(ACP_tag_by_style, ACP_User_output_and_) NodeLocation: 608,160,1 NodeSize: 72,24 ValueState: 2,1063,494,761,186,0,MIDM ReformVal: [ACP_Node_styles,ACP_User_output_and_] FormNode ACP_Fo805914179 Title: Objects w non default styles Definition: 0 NodeLocation: 708,408,1 NodeSize: 268,16 NodeInfo: 1,,,,,,,299,,,,,,0 Original: ACP_Objects_w_non_de Decision ACP_User_outputs_w_n Title: User outputs w nondefault Autocalc Description: Select one or more user output variables for which you want to specify non-default Autocalc options. You can then use "Set Autocalc by node" just below to select your prefered Autocalc options for those variables Definition: MultiChoice(ACP_User_output_node,allowNone:1,returnList:1) NodeLocation: 688,96,1 NodeSize: 72,24 WindState: 2,497,230,720,350 ValueState: 2,1535,161,416,303,,MIDM Aliases: FormNode ACP_Fo1217742403 MetaOnly: 1 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} {!60005|Att_AttsToHide: Object Object, Object Attribute, Attribute OptDimensions} Decision ACP_Autocalc_by_node Title: Autocalc by node Description: Select the "Show index" and "Description" style for each Frame or Tall node.~ "Default" means use the model default styles. Definition: Table(ACP_User_output_node)(Choice(ACP_Autocalc_options,1,0),Choice(ACP_Autocalc_options,1,0),Choice(ACP_Autocalc_options,1,0),Choice(ACP_Autocalc_options,1,0),Choice(ACP_Autocalc_options,1,0),Choice(ACP_Autocalc_options,1,0)) NodeLocation: 688,336,1 NodeSize: 72,24 WindState: 2,841,377,750,487 ValueState: 2,100,106,886,460,0,MIDM ReformDef: [ACP_Node_styles,ACP_User_output_and_] ReformVal: [ACP_Node_styles,ACP_User_output_and_] TableCellDefault: ACP_Default_Autocalc OnChange: ACP_Set_Autocalc_st(ACP_User_outputs_w_n, ~ IF ACP_Autocalc_by_no1='Default' THEN 'None' ELSE ACP_Autocalc_by_no1) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles, Attribute OnChange} Decision ACP_Autocalc_by_no1 Title: Set Autocalc by node Description: Select the "Show index" and "Description" style for each Frame or Tall node.~ "Default" means use the model default styles. Definition: Subtable(ACP_Autocalc_by_node[ACP_User_output_node=ACP_User_outputs_w_n]) NodeLocation: 688,240,1 NodeSize: 72,24 WindState: 2,82,72,720,350 DefnState: 2,858,111,552,449,0,DFNM ValueState: 2,1274,627,517,289,0,MIDM Aliases: FormNode ACP_Fo2023048771 ReformDef: [ACP_Node_styles,ACP_User_outputs_w_n] ReformVal: [ACP_Node_styles,ACP_User_outputs_w_n] NumberFormat: 2,%,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15 AcpStyles: Show_Description: 20~ Show_uncertainty_view: Yes~ show_graph_table_icon:yes~ Show_index_menus: Fly-in~ Show_graph_table_icon: Yes {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Index ACP_User_output_node Att_PrevIndexValue: [Marginal_value_vs_co,Most_valuable_projec,Optimal_funded_proj1,Optimal_total_value,Group_vs_global_fund,Incentive_value2] Title: User output nodes Description: All variables that have user outputs (including tall nodes),~ excluding those in the ACP_styles library. Definition: ACP_model_Reset;~ #SetDifference(FindObjects(hasUserOutput:True), FindObjects(hasUserOutput: True, within: Handle(ACP_Styles))) NodeLocation: 864,240,1 NodeSize: 72,24 WindState: 2,590,176,720,350 ValueState: 2,534,228,421,516,0,MIDM MetaOnly: 1 Alias ACP_Al694502979 Title: Autocalc options + default Definition: 1 NodeLocation: 864,336,1 NodeSize: 72,24 Original: ACP_Autocalc_options Button ACP_all_variables_to Title: Set all variables to default NodeLocation: 488,468,1 NodeSize: 80,20 Button ACP_Revert_styles_to Title: Revert styles to defaults NodeLocation: 300,192,1 NodeSize: 76,24 OnClick: ACP_User_output_and_ := [];~ Definition OF ACP_User_output_and_ := 'Concat(Concat(Unique(Original OF (ACP_Tall_nodes)), ACP_Frame_nodes1),~ ListOfHandles( Cost_summary))' FormNode ACP_Fo1201976899 Title: Objects w non default styles Definition: 0 NodeLocation: 804,24,1 NodeSize: 204,16 NodeInfo: 1,,,,,,,168,,,,,,0 Original: ACP_Objects_w_non_de Index ACP_Default_yes_no Att_PrevIndexValue: ['Default','Yes','No'] Title: Default yes no Definition: ['Default','Yes','No'] NodeLocation: 296,272,1 NodeSize: 72,24 Index ACP_User_outputs Title: User outputs Description: All Frame nodes in the model.~ Excludes those in ACP_styles Definition: ACP_model_Reset;~ #SetDifference(FindObjects(Class: FrameNode), ~ FindObjects(Class: FrameNode, within: Handle(ACP_Styles))) NodeLocation: 112,160,1 NodeSize: 72,24 ValueState: 2,231,455,302,270,0,MIDM MetaOnly: 1 Variable ACP_Default_Autocalc Title: Default Autocalcs Description: Default menu for use in Autocalc by node Definition: Choice(ACP_Autocalc_options, 1, 0) NodeLocation: 880,464,1 NodeSize: 56,24 Variable ACP_Default_Autoca1 Title: Default Autocalc option Description: Default option set for Autocalc in ACP Styles. Definition: ACP_Autocalc_default NodeLocation: 736,464,1 NodeSize: 72,24 Button ACP_styles_for_nonde Title: Set styles for nondefault nodes NodeLocation: 1016,340,1 NodeSize: 56,36 OnClick: ACP_style_set(ACP_tag_by_style, ACP_styles_by_node2, (ACP_Objects_w_non_de) ) Alias Al301557571 Title: ACP model Reset Definition: 1 NodeLocation: 112,240,1 NodeSize: 72,24 Original: ACP_model_Reset Module ACP_not_in_use Title: ACP not in use Author: Max Henrion~ Lumina Date: Fri, Oct 22, 2021 5:29 PM NodeLocation: 112,304,1 NodeSize: 72,24 DiagState: 2,889,44,515,392,23,10, Index ACP_vars_with_User_O Title: All vars with User Outputs Description: All user output nodes from the model. Definition: ACP_model_Reset;~ #FindObjects(hasUserOutput:True) NodeLocation: 352,320,1 NodeSize: 88,24 WindState: 2,742,387,720,350 ValueState: 2,1729,236,433,744,,MIDM MetaOnly: 1 Index ACP_Dashboards Title: ACP Dashboards Description: A list of handles to all modules that are ACP Dashboards.~ Include main model if Show_As_Tab_Checkbox is checked.~ Include its submodules for all Navigation styles except 'Top diagram only'~ Include subsubmodules for 'Two side tabs' or 'Two top tabs'~ ~ Exclude submodules that contain 'Show_Object: no' in ACP Styles. Definition: INDEX mods := IF ACP_Navi_style = 'Top_diagram_only' OR ACP_IncludTop_As_Tab ~ THEN [ACP_Top_model] ~ ELSE [];~ IF ACP_Navi_style <> 'Top_diagram_only' ~ THEN mods := Concat(mods, ACP_ObjectsinModule_( ACP_Top_model, 'Module'));~ IF ACP_Navi_style = 'Two_top_tabs' OR ACP_Navi_style = 'Two_side_tabs' { Include 2nd level modules }~ THEN FOR m[] := mods DO mods := Concat(mods, ACP_ObjectsinModule_(m, 'Module'));~ ~ /*Original definition caused sub modules within the styles library to be changed to the top diagram size, so filter out ACP_ in the id */~ mods := Subset(NOT FindInText("ACP_", identifier of (mods)));~ ~ Subset(NOT FindInText('Show_Object: no', if (AcpStyles OF (mods) = null) then "" else (AcpStyles of (mods)), caseInsensitive:True))~ NodeLocation: 136,112,1 NodeSize: 88,24 DiagState: 2,0,0,1254,793,17 WindState: 2,142,27,889,606 ValueState: 2,427,3,361,284,,MIDM Index ACP_Tall_nodes Title: All Tall nodes Description: Tall nodes excluding those in ACP Styles.~ A tall node is a Formnode (input or output) with height > ACP_Tall_node_min Definition: ACP_model_Reset;~ MetaIndex formNodes := #SetDifference(FindObjects(Class: FormNode), FindObjects(Class: FormNode, within: Handle(ACP_Styles)));~ Subset(ACP_Get_att_field(Nodesize, (formNodes), 'Y')>ACP_Tall_node_min_he) NodeLocation: 352,112,1 NodeSize: 88,24 WindState: 2,74,464,720,350 ValueState: 2,927,506,651,309,0,MIDM MetaOnly: 1 Constant ACP_Tall_node_min_he Title: Tall node min height Definition: 40 NodeLocation: 352,48,1 NodeSize: 88,24 Index ACP_User_Inputs Title: All User Inputs Description: All user output nodes from the model. Definition: ACP_model_Reset;~ #FindObjects('0', class: FormNode, Attribute: Definition) NodeLocation: 352,256,1 NodeSize: 88,24 WindState: 2,742,387,720,350 ValueState: 2,1149,204,583,705,,MIDM MetaOnly: 1 Index ACP_Form_nodes Title: Form nodes Definition: ACP_model_Reset;~ #FindObjects(Class: FormNode, Attribute: Definition) NodeLocation: 352,176,1 NodeSize: 88,24 WindState: 2,1120,162,720,350 Decision ACP_set_index_menu Title: Show index menus Description: Select whether to show index menus for graphs and tables in this Frame or Tall node.~ The default is "Fly-in menu" which means that it shows the index menus when you move the cursor over the icon on top right. Definition: Choice(Self,2,0) NodeLocation: 136,232,1 NodeSize: 72,24 WindState: 2,1267,-6,720,568 {!40300|DomainExpr: Discrete('No','Fly-in','Yes',type:['text'])} OnChange: ACP_style_set('Show_index_menus', self, (ACP_Objects_w_non_de) ) Decision ACP_Show_Descripti1 Title: Show Description Description: Select how much of a result (in a Frame or tall node) to use to show the Description of the variable as a percent of its height. ~ Or select 'No' not to show the Description at all. Definition: Choice(Self,1,0) NodeLocation: 136,176,1 NodeSize: 72,24 WindState: 2,1300,527,746,729 ValueState: 2,120,88,416,303,,MIDM NumberFormat: 2,%,4,0,0,0,4,0,$,0,"ABBREV",0,,,0,0,15 {!40300|DomainExpr: Discrete('No',10%,20%,30%,40%,50%,60%,80%,type:'all')} OnChange: ACP_style_set('Show_description', ~ IF self='No' OR self=0 THEN '' ELSE (self*100), ~ (ACP_Objects_w_non_de)); Index ACP_Variables_in_Das Title: Variables in Dashboards Definition: ACP_Objectsinmod(ACP_Dashboards ) NodeLocation: 136,48,1 NodeSize: 88,24 Button ACP_Clarify_Frame_no Title: Clarify Frame node identifiers NodeLocation: 140,308,1 NodeSize: 60,36 Close ACP_not_in_use Close ACP_styles_for_nodes Module ACP_Frame_views Title: ACP Frame views Author: Max Henrion~ Lumina Date: Fri, Oct 22, 2021 5:29 PM NodeLocation: 312,96,1 NodeSize: 72,24 DiagState: 2,392,6,1281,448,23,10, Module ACP_styles_in_progre Title: ACP styles in progress Author: Max Henrion~ Lumina Date: Tue, Oct 5, 2021 7:47 PM DefaultSize: 64,32 NodeLocation: 320,32,1 NodeSize: 72,24 DiagState: 2,0,0,579,271,17 Library ACP_and_arrange_node Title: Add and arrange nodes library Description: Functions to create and arrange buttons as tabs down the left side, each of which opens a module diagram to its right. Author: Lumina Decision Systems, Inc. Date: Wed, Sep 25, 2019 3:38 PM NodeLocation: 136,120,1 NodeSize: 88,24 DiagState: 2,436,0,1152,732,17 WindState: 2,442,600,720,350 {!40300|ProactivelyEvaluate: 5} Variable ACP_Nodes_to_arrange Title: Nodes to arrange Description: A list of the tab buttons, used by stackNodes to arrange them. Definition: ListOfHandles(ACP_Node_start_x,ACP_Node_start_y,ACP_Node_height,ACP_Node_width ,ACP_Node_Gap,ACP_Diagram_height,ACP_Diagram_width,ACP_left_width,ACP_Margin) NodeLocation: 480,48,1 NodeSize: 48,24 WindState: 2,1517,38,720,350 ValueState: 2,1065,470,416,303,,MIDM Decision ACP_Node_start_x Title: Node start x Definition: 600 NodeLocation: 632,40,1 NodeSize: 60,20 Decision ACP_Node_height Title: Node height Definition: 40 NodeLocation: 904,40,1 NodeSize: 60,20 Function ACP_Arrange_Nodes(nodes: List Object; m: Module; width, height: Number; as: = 'Row'; gap, x, y: = 0; maxX, maxY: = INF) Title: Arrange_Nodes(nodes, mod, width, height) Description: Arrange the nodes (a list of handles to objects) as an equally spaced row, column, or array where~ parameters:~ m: Module (diagram) to contain these nodes~ as:~ 'Row' as a horizontal row (default). It wraps to more rows(s) to prevent exceeding ~ maxWidth if specified.~ 'Column' as a vertical column. It wraps to more column(s) to prevent exceeding ~ maxHeight if specified.~ width, height: The full width and height of each node.~ gap: Horizontal and vertical gap between nodes. (default 0 -- i.e. the nodes touch.)~ x, y: Top left corner of the first node. (default 0 -- i.e. top left of Diagram).~ maxX: If as='Row' it wraps to a new row to prevent nodes appearing beyond maxX.~ maxY If as='Column' it wraps to start a new column to prevent nodes appearing beyond maxY.~ ~ All quantities are in pixels from top left of the Diagram window. ~ with specified width and height (default leave nodes at their existing width and height)~ vertical stack each with size width and height, with the first top left corner at startX, startY, and specified gap between adjacent nodes. (In pixels)~ For buttons used as tabs, it often looks good to have startX = - 5 so that the left edge of the rounded button is invisible. Definition: Local w := Ceil(width/2); ~ Local h := Ceil(height/2);~ Local lx := x + w; ~ Local ly := y + h;~ FOR i := 1⇄..Size(nodes) DO BEGIN~ Local n := Slice(nodes, i);~ IF NOT IsNotSpecified(m) THEN IsIn OF n := m;~ NodeSize OF n := w&','&h;~ NodeLocation OF n := lx & ',' & ly & ',' &',1';~ IF as='Row' THEN BEGIN~ lx := lx + 2*w + gap;~ IF lx + w > maxX THEN (lx := x + w; ly := ly + 2*h + gap);~ END ~ ELSE BEGIN~ ly := ly + 2*h + gap;~ IF ly + h > maxY THEN (ly := y + h; lx := lx + 2*w + gap);~ END~ END NodeLocation: 144,48,1 NodeSize: 136,24 WindState: 2,667,155,876,905 Button ACP_Arrange_nodes_te Title: Arrange nodes test Description: Click to arrange the NodeLocation: 360,52,1 NodeSize: 64,28 WindState: 2,1123,578,720,350 OnClick: Local xy1 := ACP_GetNodeLocXY(Handle(ACP_Node_start_x));~ ACP_Arrange_Nodes(ACP_Nodes_to_arrange, Handle(ACP_and_arrange_node), ~ width:ACP_Node_width, height:ACP_Node_height, ~ as: 'Row', gap: ACP_Margin, ~ x: xy1[ACP_XY='X']-ACP_Node_width/2, y: xy1[ACP_XY='Y'] - ACP_Node_height/2,~ maxX:ACP_Diagram_width, maxY:ACP_Diagram_height) Button ACP_UI_diags_loc_and Title: Set UI diags loc and size to first one Description: Click to arrange all the UI tab Diagram windows to have the same size and location~ as the first one. NodeLocation: 276,452,1 NodeSize: 68,36 WindState: 2,98,83,720,350 OnClick: Local d1xywh := ACP_Get_att_field(Diagstate, Slice(ACP_List_of_UIO_node, 1), ACP_XYWH);~ ACP_Set_att_field(Diagstate, ACP_List_of_UIO_node, d1xywh, ACP_XYWH) Index ACP_List_of_UIO_node Title: List of UIO nodes Description: List of user interface modules. "Arrange diagrams" button puts all these diagrams in the top left corner of application window and makes them the same size as the first one, which should be the main model. Definition: ListOfHandles(ACP_Diagram_width, ACP_Diagram_height, ACP_Fo1955822467, ACP_New546536323) NodeLocation: 632,272,1 NodeSize: 64,24 WindState: 2,1679,486,720,350 ValueState: 2,1109,710,416,303,,MIDM Decision ACP_Node_start_y Title: Node start y Definition: 200 NodeLocation: 768,40,1 NodeSize: 60,20 Decision ACP_Node_width Title: Node width Definition: 120 NodeLocation: 632,96,1 NodeSize: 60,20 Function ACP_SetTabOrder(diag: Module; vars: Handle List) Title: SetTabOrder(diag, vars) Description: Sets the tabbing order for a set of user inputs and outputs (vars) in the diagram for module diag. It sets the form node (user input or output) for the first node as the first in the Tabbing order, where you go when you press Tab before any node is selected. Definition: Local node1 := ACP_Aliasofvar(Slice(vars, 1), diag);~ FOR i := 2⇄..Size(vars) DO BEGIN~ Local node2 := ACP_Aliasofvar(Slice(vars, i), diag);~ ACP_Set_att(NextinTabOrder, node1, node2);~ node1 := node2~ END~ NodeLocation: 152,368,1 NodeSize: 136,24 WindState: 2,140,195,934,460 Variable ACP_Nodes_in_UI Title: Nodes in UI Definition: ListOfHandles(ACP_Node_Gap,ACP_Diagram_height,ACP_Diagram_width) NodeLocation: 816,248,1 NodeSize: 64,32 Button ACP_Arrange_tabs1 Title: Arrange tabs Description: Click to arrange the NodeLocation: 352,116,1 NodeSize: 56,20 WindState: 2,411,190,720,350 OnClick: ACP_Arrange_Nodes(ACP_Nodes_to_arrange, Handle(ACP_and_arrange_node), 'Rows', ACP_Node_width, ACP_Node_height, ACP_Node_Gap, ACP_Node_start_x, ACP_Node_start_y ) Decision ACP_Node_Gap Title: Node Gap Definition: 8 NodeLocation: 768,96,1 NodeSize: 60,20 Decision ACP_Diagram_height Title: Diagram height Definition: 894 NodeLocation: 904,96,1 NodeSize: 60,20 WindState: 2,98,82,720,350 Aliases: FormNode ACP_New1083407235 Decision ACP_Diagram_width Title: Diagram width Definition: 1000 NodeLocation: 632,152,1 NodeSize: 60,20 Aliases: FormNode ACP_New546536323 Function ACP_Arrange_result_w(diags: List Handle; x, y, width, height: Number) Title: Arrange_result_windows(vars, x, y, width, height) Description: Arranges diags (a list of handles to modules) so that they have the same location (top left corner) at x, y and the same width and height (pixels). Definition: Local dstate := '2,' & x & ',' & y & ',' & width & ',' & height &',17';~ LocalAlias d := diags DO BEGIN~ DiagState OF d := dstate;~ ShowWindow(d, 'Diagram');~ END;~ {CloseWindow(m, 'Diagram');~ DiagState OF m := '2,0,0,' & width& ',' & height &',17';~ ShowWindow(m, 'Diagram');} NodeLocation: 152,184,1 NodeSize: 136,24 WindState: 2,278,343,720,474 Variable ACP_Diagstate_of_UI_ Title: Diagstate of UI modules Definition: ACP_GetDiagState( (ACP_List_of_UIO_node)) NodeLocation: 488,424,1 NodeSize: 56,24 ValueState: 2,898,16,902,303,,MIDM ReformVal: [ACP_DiagState_fields,ACP_List_of_UIO_node] FormNode ACP_Fo1955822467 Title: Node Gap Definition: 1 NodeLocation: 428,304,1 NodeSize: 108,16 Function ACP_Add_frame(diag: Module; frameID: Text Optional; otitle: =''; UI_width: Number Optional; margin: = ACP_Node_Gap) Title: ACP_Add_frame(diag, w, h, diag_w, diag_h, margin) Description: Add a Frame node with identifier «frameID» to fill the right side of the diagram of module «diag» with a «margin» pixels between the frame node and the top, right, bottom of the diagram and between its left edge and rightmost existing node. Definition: 0{LocalAlias fr := CreateNewObject(Framenode, inModule: diag, ~ title: otitle,~ identifier: IF IsNotSpecified(frameID) THEN 'Frame_'&identifier OF diag ELSE frameID);~ ACP_set_att_field(NodeLocation, fr, Array(ACP_XYZ, ~ [margin + UI_width/2, margin + height-~ SetSize(fr, Array(XYZ, [margin + UI_width/2, margin + height-~ } NodeLocation: 152,240,1 NodeSize: 136,24 WindState: 2,56,227,915,350 Decision ACP_left_width Title: UI left width Description: Width of text node on the left for ACP models Definition: 400 NodeLocation: 768,152,1 NodeSize: 60,20 WindState: 2,98,82,720,350 Decision ACP_Margin Title: Margin Description: Margin around nodes in a diagram. Definition: 8 NodeLocation: 904,152,1 NodeSize: 60,20 Function ACP_Arrange_res_wind(var1: Handle; vars: List of Handle) Title: Arrange_Result_windows(list) Description: Set the location and size of the Result window for each variable in vars to be the same as var1. Useful for arranging them to be over the same Frame as in ACP. Definition: LocalAlias v := (vars) DO ValueState OF v := ValueState OF (var1) NodeLocation: 144,120,1 NodeSize: 136,24 WindState: 2,306,215,720,350 FormNode ACP_Fo1544411261 Title: Node Gap Definition: 1 NodeLocation: 428,336,1 NodeSize: 108,16 Original: ACP_New546536323 FormNode ACP_New1083407235 Title: Diagram height Definition: 891 NodeLocation: 428,272,1 NodeSize: 108,16 Original: ACP_Diagram_height FormNode ACP_New546536323 Title: Diagram width Definition: 1262 NodeLocation: 428,240,1 NodeSize: 108,16 Aliases: FormNode ACP_Fo1544411261 Original: ACP_Diagram_width {!40700|NextInTabOrder: Self} Close ACP_and_arrange_node Library ACP_Make_and_copy_ob Title: Make and copy objects Description: Functions, buttons, and prototype variables and user inputs for creating Risk diagrams. Under development. For now, we create new Risk diagrams by manual copying an existing module. Author: Max Henrion Date: Fri, Oct 4, 2019 3:06 PM NodeLocation: 136,48,1 NodeSize: 88,24 DiagState: 2,331,65,1347,506,19,10, Index ACP_Risk_quantities Title: Risk quantities Description: The chance variables used to estimate Risk, including those in Primary and secondary loss modules. Definition: ACP_Objs_in_module(oClass: Handle(Chance), submodules:True) NodeLocation: 504,408,1 NodeSize: 64,24 WindState: 2,654,463,720,350 ValueState: 2,187,192,573,737,,MIDM MetaOnly: 1 Button ACP_copy_object1 Title: eg copy_object NodeLocation: 704,288,1 NodeSize: 80,24 OnClick: ACP_Copy_object(ListOfHandles(Low1), dx:100) Button ACP_Make_user_inputs Title: Make user inputs NodeLocation: 504,280,1 NodeSize: 80,24 OnClick: ACP_Copy_user_input(User_input_params, New_orig_params, Handle(ACP_Parent_example_3), Location_of_paramete) Function ACP_Copy_user_input(userInput, orig: Atom Handle; parent: Handle Atom; dxy: Number [ACP_XY]) Title: Copy_user_input(userInput, orig, parent, dxy) Description: Make a new user input that is a copy of userInput, with the same node size, ~ and location dx, dy pixels from the parent object. Definition: LocalAlias newObj := CreateNewObject(Class OF userInput, IsIN OF parent, original: orig);~ FOR a := ACP_User_input_attri DO a OF newObj := a OF userInput;~ ACP_Set_att_field(NodeLocation, Handle(newObj), ~ ACP_Get_att_field(NodeLocation, orig, ACP_XY) + dxy);~ Handle(newObj) NodeLocation: 296,280,1 NodeSize: 120,24 WindState: 2,1326,183,826,483 Index ACP_User_input_attri Title: User input attribs Units: test Definition: ['NodeSize','NodeInfo'] IndexVals: ['item 1'] NodeLocation: 96,280,1 NodeSize: 56,24 WindState: 2,98,82,720,350 Function ACP_Copy_paramS_U_In(param, ui_node, parent: Atom Handle; dxy: Number [ACP_XY]) Title: Copy parameters and user inputs Description: Given an original risk quantity variable and user input node for it, it generates a copy of both, with the param node dx to the right of the original param, and the ui_node located relative to parent. Definition: Local newParam := ACP_Copy_object(param, dx: 200, orig: Handle(parent));~ Local newUI := ACP_Copy_user_input(ui_node, newparam, Handle(parent), dxy);~ Handle(newParam) NodeLocation: 296,344,1 NodeSize: 120,24 WindState: 2,354,789,828,448 Button ACP_Make_user_inpu1 Title: Make user inputs NodeLocation: 504,344,1 NodeSize: 80,24 OnClick: result_of_user_input := Copy_paramS_U_In(User_input_params, New_orig_params, Handle(Parent_example_3), Location_of_paramete) Chance ACP_Parent_example_3 Title: Parent example 3 Definition: 0 NodeLocation: 152,488,1 NodeSize: 64,32 FormNode ACP_State252935043 NodeLocation: 288,488,1 NodeSize: 64,16 Original: State1 FormNode ACP_Low252935043 NodeLocation: 288,512,1 NodeSize: 64,16 Original: Low1 FormNode ACP_Mid252935043 NodeLocation: 288,536,1 NodeSize: 64,16 Original: Mid1 FormNode ACP_High252935043 NodeLocation: 288,560,1 NodeSize: 64,16 Original: High1 FormNode ACP_State1326676867 NodeLocation: 288,488,1 NodeSize: 64,16 Original: State1 FormNode ACP_Low1326676867 NodeLocation: 288,512,1 NodeSize: 64,16 Original: Low1 FormNode ACP_Mid1326676867 NodeLocation: 288,536,1 NodeSize: 64,16 Original: Mid1 FormNode ACP_High1326676867 NodeLocation: 288,560,1 NodeSize: 64,16 Original: High1 Variable ACP_Va2 Definition: 0 NodeLocation: 592,104,1 NodeSize: 16,16 NodeInfo: 1,,,0 Function ACP_Aliasofvar(v: Handle Atom; m: Module) Title: Aliasofvar(v, mod) Description: Returns the alias (usually to a user input or output node) in module m of variable v. Gives a warning if v has no alias in module m. Definition: IF Class OF v = 'Button' THEN v~ ELSE BEGIN ~ Local a := Aliases OF v;~ Local i := 1;~ WHILE i<= Size(a) AND ISIN OF Slice(a, i)<>m DO i:=i+1;~ IF i>Size(a) THEN Error('Object "'&Identifier OF v~ &'" has no aliases in module '&Identifier OF m)~ ELSE Slice(a, i)~ END NodeLocation: 176,32,1 NodeSize: 136,24 WindState: 2,935,325,720,402 Function ACP_Copy_object(obj: Atom Handle; id, oTitle: text Optional; dx, dy: = 0; orig: Handle Optional) Title: Copy_object(obj, id, oTitle, dx, dy) Description: Return a handle to a new object that is a copy of object obj, with the same class, title, units, definition, node location, size and color. and the same parent module, unless you specify a different parent. Definition: LocalAlias newObj := CreateNewObject(Class OF obj, IsIN OF obj, ~ IF IsNotSpecified(oTitle) THEN Title OF obj ELSE oTitle);~ FOR a := ACP_Attribs_to_copy DO a OF newObj := a OF obj;~ ~ IF NOT (dx=0 AND dy=0) ~ THEN ACP_Set_att_field(NodeLocation, Handle(newObj), ~ ACP_Get_att_field(NodeLocation, Handle(obj)) + Array(ACP_XYZ, [dx, dy, 0]));~ Handle(newObj) NodeLocation: 200,216,1 NodeSize: 152,16 WindState: 2,463,251,861,561 Index ACP_Attribs_to_copy Title: Attribs to copy Units: test Definition: ['Title','Units','Description','Definition','Onchange','NodeLocation','NodeSize','NodeInfo','NodeColor'] NodeLocation: 448,80,1 NodeSize: 64,24 WindState: 2,98,82,720,350 Button ACP_copy_object2 Title: eg copy_object NodeLocation: 448,216,1 NodeSize: 80,20 OnClick: ACP_Copy_object((Example_objects), dx:100) Function ACP_Objs_in_module(m: Module Optional; oClass: Optional; submodules: = False) Title: Objs_in_module(m, oClass) Description: Returns all the objects in module m (by default, the module containing the variable that uses this function). If you specify class, it returns only the objects of that class.~ If you set submodules=True it also returns objects in submodules of m. Definition: IF IsNotSpecified(m) THEN m := (IsIN of HandleFromIdentifier('_caller'));~ IF submodules THEN IF IsNotSpecified(oClass) ~ THEN #FindObjects(within: m)~ ELSE #FindObjects(within: m, class: oClass)~ ELSE BEGIN~ INDEX s := Contains OF m;~ IF IsNotSpecified(oClass) THEN CopyIndex(s)~ ELSE Subset(Class OF (s) = oClass)~ END NodeLocation: 160,104,1 NodeSize: 120,24 WindState: 2,98,82,813,546 Function ACP_Create_object(m: Handle; class: Object; x, y, w, h: Number) Title: Create_object(m, class, x, y, w, h) Description: Create an object withs specified class in module m with title t, and node with top right corner at x, y, full width w and height h pixels. Returns a handle to the new object Definition: LocalAlias o := CreateNewObject(class, inModule: m, title: "Frame new");~ Local wh := Ceil(Array(ACP_XY, [w, h])/2);~ ACP_Set_att_field(NodeLocation, o, Array(ACP_XY, [x, y]) + wh, ACP_XY);~ ACP_Set_att_field(Nodesize, o, wh, ACP_XY);~ Handle(o) NodeLocation: 200,168,1 NodeSize: 152,16 WindState: 2,1172,586,811,527 Button ACP_Test_Create_obje Title: Test Create_object() NodeLocation: 448,164,1 NodeSize: 80,20 OnClick: Local loc := ACP_Get_att_field(NodeLocation, Handle(ACP_Va2), ACP_XY);~ ACP_Create_object(ISIN OF self, Handle(framenode), loc[ACP_XY='X'], loc[ACP_XY='Y'], 300, 200) {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} {!50500|FrameNode ACP_Frame_new4594131} {!50500|Title: Frame new} {!50500|NodeLocation: 822,132,1} {!50500|NodeSize: 150,100} {!50500|NodeInfo: 1,,,,,,,0} {!50500|AcpStyles: Show_uncertainty_view: Yes~ show_graph_table_icon:yes~ Show_Description: 20~ Show_index_menus: Fly-in~ Show_graph_table_icon: Yes} {!50500|ProactivelyEvaluate: 4} FormNode ACP_State1584810371 NodeLocation: 288,488,1 NodeSize: 64,16 Original: State1 FormNode ACP_Low1584810371 NodeLocation: 288,512,1 NodeSize: 64,16 Original: Low1 FormNode ACP_Mid1584810371 NodeLocation: 288,536,1 NodeSize: 64,16 Original: Mid1 FormNode ACP_High1584810371 NodeLocation: 288,560,1 NodeSize: 64,16 Original: High1 FormNode ACP_State1004635613 NodeLocation: 288,488,1 NodeSize: 64,16 Original: State1 FormNode ACP_Low1004635613 NodeLocation: 288,512,1 NodeSize: 64,16 Original: Low1 FormNode ACP_Mid1004635613 NodeLocation: 288,536,1 NodeSize: 64,16 Original: Mid1 FormNode ACP_High1004635613 NodeLocation: 288,560,1 NodeSize: 64,16 Original: High1 Close ACP_Make_and_copy_ob Module ACP_frames_to_diagra Title: Add frames to diagrams Author: Max Henrion Date: Mon, Apr 19, 2021 10:43 AM NodeLocation: 376,128,1 NodeSize: 88,24 DiagState: 2,473,-30,946,784,17 Button ACP_Bu1 NodeLocation: 368,80,1 NodeSize: 48,24 OnClick: (eg_result_form_Readc, test_csv_file_name) := Read_csv_file(test_csv_file_name, eg_cols2, Eg_rows2, colHeaders:0, rowHeaders:0, showDialog:1) Button ACP_Resize_Windows Title: Resize UI Windows Description: Please click this always before saving a version of the model to upload to ACP.~ It resizes the main model diagram and all UI tab diagrams to the specified UI height and width. ACP will use the main model diagram window size diagrams. This size is for the UI diagram. ACP uses extra space for tabs and title area. NodeLocation: 208,32,1 NodeSize: 80,24 WindState: 2,186,609,693,576 AcpStyles: Show_Object: no OnClick: MetaVar diag[] := UI_Tabs ~ DO Set_Diag_Size(diag, UI_width, UI_Height);~ UI_reset := UI_reset + 1; Button ACP_Resize_Windows1 Title: Position UI Windows Description: Please click this always before saving a version of the model to upload to ACP.~ It resizes the main model diagram and all UI tab diagrams to the specified UI height and width. ACP will use the main model diagram window size diagrams. This size is for the UI diagram. ACP uses extra space for tabs and title area. NodeLocation: 208,108,1 NodeSize: 80,28 WindState: 2,655,228,693,576 AcpStyles: Show_Object: no OnClick: MetaVar diag[] := UI_Tabs ~ DO Set_Diag_Size(diag, UI_width, UI_Height);~ UI_reset := UI_reset + 1; Function ACP_Find_or_make_fra(m: Module; margin, leftWidth, diagWidth, diagHeight: Number) Title: Find_or_make_framenode(m) Description: It sets diagram for module m to have specified diagWidth and diagHeight. It positions a text node to contain user inputs and outputs on the left, with width leftWidth and margin to left, above and below. It positions a Frame node on the right, with margin space from left text node, above, below, and right. Width of Frame node is therefore (diagram_width - leftWidth - 3*margin).~ If the module already contains two text nodes, it repositions the top leftmost one as the left text node and the rightmost one as the right frame node. Otherwise it creates new text nodes for them. Definition: Local textNodes := #FindObjects(within: m, class: Text);~ LocalAlias leftText := IF Size(textNodes)=0 ~ THEN Create_Object(m, Text, 'Title') ~ ELSE SLice(textnodes, 1);~ Local h := Ceil(diagHeight - 2*margin);~ Local ltSize := Array(XY, [leftwidth, h])/2;~ Set_attrib_field(NodeSize, leftText, ltSize, XY);~ Set_attrib_field(NodeLocation, leftText, ~ margin + Array(XY, [leftWidth, 0]) + ltSize, XY);~ LocalAlias frameNode :=IF Size(textNodes)<2 ~ THEN CreateNewObject(Text, m, 'Title') ~ ELSE Slice(textnodes, 2);~ SetNodeSize(frameNode, Array(xwz, [leftWidth/2, h, 1]);~ NodeLocation OF frameNode := 2*margin + leftWidth & ',' & margin & ',' &',1';~ CloudPlayerStyles OF M := 'Frame NodeLocation: 280,296,1 NodeSize: 152,16 WindState: 2,192,339,720,577 Variable ACP_value_state Title: eg value state Definition: ValueState OF Handle(ACP_Diagstate_of_UI_ ) NodeLocation: 536,312,1 NodeSize: 64,24 WindState: 2,899,597,720,350 ValueState: 2,1420,661,459,206,,MIDM Button ACP_Test_AddFrame Title: Test AddFrame() NodeLocation: 528,252,1 NodeSize: 80,20 OnClick: ACP_frame_on_Right(ISIN OF self, 400, 8) Function ACP_frame_on_Right(m: Handle; width: = 400; margin: = 8) Title: Add_frame_on_Right(m, w) Description: Add a Frame node to the diagram for module m with left edge at margin pixels from the rightmost edge of existing nodes in m, top at margin below top of diagram, bottom margine above the bottom of the diagram, with specified width. It resizes the diagram window to allow a margin to the right of the frame node. It returns a handle to the new Frame node. Definition: Local maxXY := ACP_DiagramMax(m);~ Local f := ACP_Create_object(m, Handle(FrameNode), ~ maxXY[ACP_XY='X'] + margin, margin, width, ~ maxXY[ACP_XY='Y'] - margin);~ {SetDiagWidth(m, width + Margin*2);}~ Handle(f) NodeLocation: 280,248,1 NodeSize: 152,16 WindState: 2,98,82,919,556 Decision ACP_Select_modules Title: Select modules Description: Select which modules you want to add frame nodes and/or text nodes Definition: Choice( Self, 1, inclAll:0 ) NodeLocation: 192,552,1 NodeSize: 80,16 WindState: 2,98,82,720,350 Aliases: FormNode ACP_New1955822467 {!40300|DomainExpr: Discrete('Top model only','Modules in top model','Modules in top model inc top model','All modules with user input/outputs','All modules except libraries',type:'text')} Decision ACP_text_and_frame_n Title: Add text and frame nodes Definition: Choice( Self, 1, inclAll:0 ) NodeLocation: 200,600,1 NodeSize: 80,16 Aliases: FormNode ACP_New210992003 {!40300|DomainExpr: Discrete('Text node on ','Modules in top model','Modules to 2 levels','All modules with user input/outputs','All modules except libraries',type:'text')} Decision ACP_Frame_node_width Title: Frame node width Definition: Choice(Self,4,0) NodeLocation: 648,376,1 NodeSize: 64,32 Aliases: FormNode ACP_New1284733827 {!40300|DomainExpr: Discrete(200,240,300,400,500,type:'number')} Index ACP_Hide_node_fields Title: Hide node fields Definition: Subset(@ACP_Nodeinfo_fields > 3 AND @ACP_Nodeinfo_fields < 6) NodeLocation: 280,384,1 NodeSize: 48,24 ValueState: 2,1474,486,416,303,0,MIDM Variable ACP_Result_frame Title: Result frame Definition: Frame_new885790339 NodeLocation: 776,232,1 NodeSize: 48,24 Variable ACP_Contains_a_frame Title: Contains a frame node? Definition: ACP_ObjectsinModule_(ISIN OF self, 'FrameNode') NodeLocation: 664,64,1 NodeSize: 56,40 {!50500|FrameNode ACP_Frame_new1048712} {!50500|Title: Frame new} {!50500|NodeLocation: 1656,568,1} {!50500|NodeSize: 200,488} {!50500|NodeInfo: 1,,,,,,,0} {!50500|AcpStyles: Show_Description: 20~ Show_uncertainty_view: Yes~ show_graph_table_icon:yes~ Show_index_menus: Fly-in~ Show_graph_table_icon: Yes} {!50500|ProactivelyEvaluate: 4} FormNode ACP_New1955822467 Title: Select modules Definition: 0 NodeLocation: 540,568,1 NodeSize: 228,16 NodeInfo: 1,,,,,,,312,,,,,,0 Original: ACP_Select_modules FormNode ACP_New210992003 Title: Add text and frame nodes Definition: 0 NodeLocation: 576,600,1 NodeSize: 264,16 NodeInfo: 1,,,,,,,301,,,,,,0 Original: ACP_text_and_frame_n FormNode ACP_New1284733827 Title: Frame node width Definition: 0 NodeLocation: 556,488,1 NodeSize: 116,16 NodeInfo: 1,,,,,,,66,,,,,,0 Original: ACP_Frame_node_width Close ACP_frames_to_diagra Module ACP_Show_View_in_Fra Title: Show View in Frame Author: Max Henrion Date: Thu, Mar 25, 2021 11:54 AM NodeLocation: 376,48,1 NodeSize: 88,24 NodeInfo: 1,,,,,,,0,,,,,,0 DiagState: 2,247,135,1371,439,23,10, WindState: 2,676,204,720,350 FontStyle: Arial,15 {!40300|ProactivelyEvaluate: 5} Button ACP_Object_view Title: Object view NodeLocation: 936,417,1 NodeSize: 16,15 NodeInfo: 1,,,0 NodeColor: 62258,62258,62258 Pict: (0000000000090017002100041C04000089504E470D0A1A0A0000000D494844520000002A000000290802000000CC352CA2000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA864000003A1494441545847ED97CB4F13511487591B372EDCB8D19DC685266A74E5C23F00138DE2038B82F27E28082A2F2B055BA5088A0229A00441C580682A6D81D2E7B4C34C814229B5D0403B50FA02A1C0600B54C41B6F75169A94911AD4F497B3FDE69B3BF7CE3933616B9B9ABF46BFBCB23AE5F6F67C9896F6D83B311BA88E6E5B3B3A29544DB421E37C05F14E66162004A2B5DBA716BD4B3E48B95CAE8181011445113A210802E2941EB831FD54D92B4376455F469906547A297EB5044BBAA78E2B52C6DC9145E549E2583266252EC1ADE00E20A5D7EBEBEAEAB85C2E9B4E140A05C4293D5877D94B434E65DFF5873D507FED019E5ADC9DC856C5162AA29932466E576476670CB38BC5D3205A1BA482A697F63AC0BA33BFBBBFE9B1946275021BB9C2925FBA2DBD90233E73A323224B149D2F7E2B198354D0F460B37F88615D2DE94EBEAF8ABFABBC5C20BB982F89CC164764B59F4C171C4F7DDFF0DE08A93FA5071B9FC6ED4EE2A8E2C093BF2363E449CEDDEA3C9D293A714D109EC27F1E74BD5AE72A7AA6BB51FE7DE34BF1542E9AC841620BE5D14C2923577CF666C7A9EBA2884C61CA5D9910B1402A687AA365EE45FB18BB4E074EDFCDC7BD59E59A8C522C8DAB4EE228E30AE5314C4954AE9891D3995824AB7D33A4377D84D4F0F0707373338FC7ABA0130CC3204EE9498FCF6C2385A8F519DF54FA72A8A4517FBF5EC77EAA65D5F432AB34794FB0EC4728A7B6B7B16DD86C9DF778FDEFFDECECACC96402CF4047270E8703E2947E75F58B67E9F3B8831C1C9DC587A6410F40075DEA0107D26F57F6D9E43D9352CD2436E81C21DCDEA5CF7E0634ABE5659224E768C6EBF5429CD26F4A427A98F9F9B98909226059ADE34EA76371918494CFE7031BE9F1783ED1C9CACA0AC429BD48C04F4E880E58E969F1C59C0254AD84D4CCCC8CD168ECEFEFEFA3139BCD3F32283DAFAA7CFFDE5D01EBC8C13DE723C25BDFBC8694D96C1689444D4D4D8D74026634C4293DF71E6BDBD6B080B563FB9663470F35D4D7422A685D2FA4FF49F673FDA77A70F2F7EDDD19B00E1FD87DEE74786B4B13A4E0C4ABAEAEF6CFB2F5E517134FD0F62E219611B0D2922F738A6EAB1139A4AC562BF872150A857C3A01AD02E2947ECEED262C63016B9CB0D86D9324B9002930F1161616C01073D34968E27DCB3FAE07B30B7CEDCC8371492741DB7B708E4647470D06036800EB8FD3E984F846F52323232D2D2D353535957482E338C437AA074B094ED7FBBD84F421FD26E9C11BACD56A552A15B8E2FA63B1F87F9037AADF603655BFB6F61503ABD3BC9124FB7D0000000049454E44AE426082) Button ACP_Show_graph_view2 Title: Show graph view NodeLocation: 972,416,1 NodeSize: 20,16 NodeInfo: 1,,,0,0,0 WindState: 2,304,556,720,350 Pict: (000000000000001D001D00046B05000089504E470D0A1A0A0000000D494844520000001D0000001D0802000000D9F1F058000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA864000004F049444154484BE596794C937718C7DDB2EBBF1D66318B894BB619334C74C32D8BD9F40F9DA82097D0D29696DEA5949EB4D083961E147A612947B94FB9054544A0884605E5984C443C2232E770C09289586DB98F3DA5EC9566C9C618FFED9B4FD2E7FDE5C9E7FDF5D7E67DDE4D4B7F666161616A6A6AE8A7479D5D3D4DCDADF50DE74F9F6D5C0B67CE369E6FB6B57774DEBBFFC0FEE20578C0B6E25D5C5C74381C8F7E7E5C5E754AAAD0E022E8C7D184C0501C424008CE3710ED1714B67AD14D102A1C4BA0C6C4C5E7E417DF1EB86BB7DBC1E6F2C2C7ECEC6C77CF0DADCE446372290C365F28556A7449BA140455A29E4C8B667184AB17DD68928CC238393D8A47A030E5AA64DB854B3333332E2F481F0C3ECC2F2AC5931860B464643736D9AEB45FBBDED98D70F1D215B9529B9A96B57AD14DC7B5AEE69636D8AC48AC20D25846733AECDAE575389D75F50D4289028D239796573F181C721D8D67E0E0ACD9F967CF35AD5CFF25C34F7E6D686C865D4771858525652EEF73BBDD78229DC98E11CB947DB76E3B2727DDADABF38FDEE9E9E95F869F184C16F0C4C9125CDE67CF26A4720D83C5B7A467C16DDD7DEE38E6166A86ECE6FE7163F7304F9F25CEAF83DA4DEEBD8911C7DC4ADF725EBE749C2CAFE6C548C88C6897777CFC9920363E8A232C2DAB1A1BFBCDDDE4CEA873EEBBFAC79BB2EFBD93F1E37E917997A2046A371F950E768C3957FA96035FF47C934D1CAFC210A86BF5BE95DEBB8B6BFA4452FC37DEC9C9C996D6369942F32FBC6FA6F57E1E6DDC262E42BC5B72EFB654F54DD4F5228CD5743564564A04F11E5E38EFE29315A36BF67E98DA57852E1C3C908270C727A58A668825093CBC241637B5B0707864D46D746703BC282295AB54E5D69EAA6E6B45C86B6AD99B72664B42ED5659B93759B293990435B04D51F3555C99E9B8B6E69014A1F2A8D44252B0F1D11E5EDF106C20891AC063070879087E31FC6F22A55F50155F52A4FBD0B4BD5816D4C07EB20C858FE5F833E38ED05EE1C790E0F9540CDDC31B44A230B5EA96EB1DB7871E225C1EB8BF2FEFEABBC9AD9B35E776D31276704E400DBCAF6BDBAEB165849A2F7CAF44683EA2CCA1A879048E87F7388D1169D699BA6CD90F7B100C777ED85ED1F77A66FFDBA9DD5E2CFDC7B1F95003AF5907E07CCBD005770F1A11FA0E1B2A687A1191EFE10DA14786A768B697277E70FA15EFD59ADE28E8F84FBFDBFFCF3BB0EC151137DE6BAAA0EA8444DE8A179E939278158A1E8956CB3E3BA95EB7B7DFC7981D91C08E60C3D47079279E3F4FD2A7843358017CF6A779F2CDB59A7578EF1F30F51C4A4E4409E8449818129717267165752D5724F5C186EF5471B616C8D6E1ED3CA82DF311D3FD494C96C09A5BE8F2C2F8BCD53F60C9CCF1C712BE8D247BCBD9BBD3A5DE79AA3D4589DE4506AFCCFA1D964B5EA6A6BD4CE5D7C254A881DDE6B6C3C98D4514EB4594A13554571FA8B2FA894447E9F86062A2D608A3DDE585390FEAB6CB57A38462349E124C208772D8388514AF4DC0276B309AD430B5354C6109A0708358128CDA0A30E51655ACC1C4D59E60A9F54C8590C4276269F0CA111D155377AA1E669DCB0B819794DF9F3EBD71B30FC6B5402247C303289C780C4738868BF0C3527CB1545F0CE54830F66808DE0F4B05023114149A84092562422230A111F8702A8F2F36A759DBDBAF8F8E8C816DC50B810BA7D309A3BFD976A1A4AC32B7A0243BAF682DC0568A4B2B60C8DFE8BD097FADF9F979B0BDF26E649696FE000DDC0B4189C6E49C0000000049454E44AE426082) Variable ACP_test_of_S_687 Title: A test of S-687 Description: A result that can be shown as a table of graph in a frame node. Definition: Random(over:ACP_I,ACP_J) NodeLocation: 192,96,1 NodeSize: 64,24 DiagState: 2,440,440,568,344,17 WindState: 2,723,378,537,289 DefnState: 518,461,110,537,289,, ValueState: 2,723,378,537,289,1,MIDM Aliases: FormNode ACP_New2131983235 Index ACP_I Att_PrevIndexValue: [1,2,3,4,5,6,7,8,9,10] Title: I Definition: 1..10 NodeLocation: 64,40,1 NodeSize: 48,24 Index ACP_J Att_PrevIndexValue: [1,2,3,4,5,6,7,8,9,10] Title: J Definition: 1..10 NodeLocation: 64,96,1 NodeSize: 48,24 {!50500|FrameNode ACP_Test_FrameNode} {!50500|Description: Example_frame_node} {!50500|NodeLocation: 724,212,-1} {!50500|NodeSize: 284,172} {!50500|WindState: 2,98,82,673,595} {!50500|AcpStyles: Show_Description: 20~ Show_uncertainty_view: Yes~ show_graph_table_icon:yes~ Show_index_menus: Fly-in~ Show_graph_table_icon: Yes} {!50500|ProactivelyEvaluate: 4} Button ACP_Change_to_Object Title: Change to Object view NodeLocation: 80,184,1 NodeSize: 64,24 OnClick: Att_FrameNodeShowing of ACP_Test_FrameNode := Array(Sys_FrameNodeShowIdx,[Handle(ACP_test_of_S_687),'OBJV',0,null]) Button ACP_Show_diagram Title: Show diagram NodeLocation: 72,248,1 NodeSize: 56,24 OnClick: Att_FrameNodeShowing of ACP_Test_FrameNode := Array(Sys_FrameNodeShowIdx,[Handle(ACP_Google_Maps_OGD_),'DIAG',0,null]) Button ACP_Open_obj_window Title: Open obj window NodeLocation: 152,324,1 NodeSize: 48,28 OnClick: ShowWindow(Handle(ACP_OnDraw_Google_ma),'Object') Button ACP_Show_Object_view Title: Show Object view NodeLocation: 368,188,1 NodeSize: 64,28 OnClick: ACP_Show_frame_view(Handle(ACP_test_of_S_687), Handle(ACP_Test_FrameNode), 'Object') Button ACP_Show_Diagram_vie Title: Show Diagram view NodeLocation: 368,252,1 NodeSize: 64,28 OnClick: ACP_Show_frame_view(Handle(ACP_old3), Handle(ACP_Test_FrameNode), 'Diagram') Button ACP_Show_graph_view1 Title: Show graph view NodeLocation: 368,316,1 NodeSize: 64,28 WindState: 2,684,109,720,350 OnClick: ACP_Show_frame_view(Handle(ACP_test_of_S_687), Handle(ACP_Test_FrameNode), 'Graph') Button ACP_Show_Table_view1 Title: Show Table view NodeLocation: 368,380,1 NodeSize: 64,28 OnClick: ACP_Show_frame_view(Handle(ACP_test_of_S_687), Handle(ACP_Test_FrameNode), 'Table') Button ACP_Show_defn_view Title: Show defn view NodeLocation: 368,124,1 NodeSize: 64,28 OnClick: ACP_Show_frame_view(Handle(ACP_test_of_S_687), Handle(ACP_Test_FrameNode), 'Definition') Variable ACP_edit_table Title: eg edit table Description: A result that can be shown as a table of graph in a frame node. Definition: Table(ACP_I,ACP_J)(~ 0.8721065739505489,0.26556926512418744,0.4576059288613526,0.1659489810308204,0.456849674441316,0.5822276634081396,0.9904985236891073,0.25034417782460533,0.5433796767813059,0.3086876428260876,~ 0.12176221847616239,0.6312182208668525,0.6173815143375572,0.33111147132288266,0.41786885001597407,0.10452418499836894,0.29544473546345007,0.8829830097420993,0.4222208347275019,0.48421284113275487,~ 0.7705221603487256,0.440319140181094,0.19590241191717908,0.6989868570580086,0.7621204349035958,0.9477665796632723,0.5345966981419347,0.2047291594579486,0.5842611750514531,0.5318370920288549,~ 0.9825565931306018,0.5860057289646965,0.3011584460275054,0.867972368778648,0.2724783351982377,0.9982867096542785,0.030072654145803606,0.16852840183699894,0.5003389006016491,0.11321297805440285,~ 0.16522091821079185,0.38991195633537695,0.7379772675866155,0.4437890236469866,0.11290440061730538,0.9539127251850035,0.3483062150647427,0.18393632824715989,0.4111721843533088,0.9958684272113575,~ 0.15701542895148296,0.9463300201791944,0.8862269166327207,0.011602062737383909,0.958314387574007,0.7505095553353939,0.9036918133048768,0.8140965219652729,0.42263894221868314,0.9686491517204089,~ 0.7521744509004868,0.7959962844829989,0.29270186940799553,0.46792675623108015,0.9564660438133711,0.1930935812150564,0.8286607460252292,0.6624099522188353,0.958149424734595,0.5938262728014152,~ 0.21577719003696796,0.4381669733851063,0.21827773108066886,0.080972440112835,0.8846381091906866,0.3095533057626119,0.6544426892206272,0.5396689342053929,0.570002384283581,0.43109822852122515,~ 0.1240669419635399,0.3247983713284127,0.5672329513203506,0.9122989256457886,0.9667056714960865,0.34953178528208834,0.8157878461367394,0.27232168348148544,0.9801366701629649,0.08629296491215609,~ 0.8600798430201038,0.44499197576427457,0.903800976417866,0.36192163888454515,0.8518326393569972,0.5538099108048761,0.7562868030538256,0.32381948145284295,0.2969604946193101,0.8169847325500961) NodeLocation: 192,32,1 NodeSize: 64,24 DiagState: 2,440,440,568,344,17 WindState: 2,609,311,720,350 DefnState: 2,530,419,537,289,0,DFNM ValueState: 2,518,88,520,276,1,MIDM Aliases: FormNode ACP_New613645187 ReformDef: [ACP_I,ACP_J] Button ACP_Show_edit_table Title: Show edit table NodeLocation: 368,60,1 NodeSize: 64,28 OnClick: ACP_Show_frame_view(Handle(ACP_edit_table), Handle(ACP_Test_FrameNode), 'Definition') Button ACP_Object_view1 Title: Object view NodeLocation: 955,24,1 NodeSize: 13,14 NodeInfo: 1,,,0 WindState: 2,1563,805,720,350 NodeColor: 62258,62258,62258 Pict: (00000000000C0011001E00041C04000089504E470D0A1A0A0000000D494844520000002A000000290802000000CC352CA2000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA864000003A1494441545847ED97CB4F13511487591B372EDCB8D19DC685266A74E5C23F00138DE2038B82F27E28082A2F2B055BA5088A0229A00441C580682A6D81D2E7B4C34C814229B5D0403B50FA02A1C0600B54C41B6F75169A94911AD4F497B3FDE69B3BF7CE3933616B9B9ABF46BFBCB23AE5F6F67C9896F6D83B311BA88E6E5B3B3A29544DB421E37C05F14E66162004A2B5DBA716BD4B3E48B95CAE8181011445113A210802E2941EB831FD54D92B4376455F469906547A297EB5044BBAA78E2B52C6DC9145E549E2583266252EC1ADE00E20A5D7EBEBEAEAB85C2E9B4E140A05C4293D5877D94B434E65DFF5873D507FED019E5ADC9DC856C5162AA29932466E576476670CB38BC5D3205A1BA482A697F63AC0BA33BFBBBFE9B1946275021BB9C2925FBA2DBD90233E73A323224B149D2F7E2B198354D0F460B37F88615D2DE94EBEAF8ABFABBC5C20BB982F89CC164764B59F4C171C4F7DDFF0DE08A93FA5071B9FC6ED4EE2A8E2C093BF2363E449CEDDEA3C9D293A714D109EC27F1E74BD5AE72A7AA6BB51FE7DE34BF1542E9AC841620BE5D14C2923577CF666C7A9EBA2884C61CA5D9910B1402A687AA365EE45FB18BB4E074EDFCDC7BD59E59A8C522C8DAB4EE228E30AE5314C4954AE9891D3995824AB7D33A4377D84D4F0F0707373338FC7ABA0130CC3204EE9498FCF6C2385A8F519DF54FA72A8A4517FBF5EC77EAA65D5F432AB34794FB0EC4728A7B6B7B16DD86C9DF778FDEFFDECECACC96402CF4047270E8703E2947E75F58B67E9F3B8831C1C9DC587A6410F40075DEA0107D26F57F6D9E43D9352CD2436E81C21DCDEA5CF7E0634ABE5659224E768C6EBF5429CD26F4A427A98F9F9B98909226059ADE34EA76371918494CFE7031BE9F1783ED1C9CACA0AC429BD48C04F4E880E58E969F1C59C0254AD84D4CCCC8CD168ECEFEFEFA3139BCD3F32283DAFAA7CFFDE5D01EBC8C13DE723C25BDFBC8694D96C1689444D4D4D8D74026634C4293DF71E6BDBD6B080B563FB9663470F35D4D7422A685D2FA4FF49F673FDA77A70F2F7EDDD19B00E1FD87DEE74786B4B13A4E0C4ABAEAEF6CFB2F5E517134FD0F62E219611B0D2922F738A6EAB1139A4AC562BF872150A857C3A01AD02E2947ECEED262C63016B9CB0D86D9324B9002930F1161616C01073D34968E27DCB3FAE07B30B7CEDCC8371492741DB7B708E4647470D06036800EB8FD3E984F846F52323232D2D2D353535957482E338C437AA074B094ED7FBBD84F421FD26E9C11BACD56A552A15B8E2FA63B1F87F9037AADF603655BFB6F61503ABD3BC9124FB7D0000000049454E44AE426082) OnClick: ACP_ChangeViewinFram(Handle(ACP_Test_FrameNode), 'Object') Button ACP_Show_graph_view3 Title: Show graph view NodeLocation: 985,22,1 NodeSize: 13,14 NodeInfo: 1,,,0,0,0 WindState: 2,125,605,720,350 Pict: (000000000000001B001900045201000089504E470D0A1A0A0000000D49484452000000190000001B08020000000643B33F000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA864000000D749444154484BED95310AC2401045BD84602578002F21D8D86D2136DEC3F4DA0936B6365AD959899D2751EBE414EB8309D9CD288BC6010B5D5E1196FFDF6E8A4C5ADE6ED55C795E2C576B379E0E47EE450853A1483DB82ED7DB5B96188AD44B1762110DDCA4BF98F7B69BF6F918936533B503C40853115DE9E29E22EAEE77AA203C7509544457BAE4521CA272150917500C2E9EE0F1D52AD22E8ADAA512316957E7743073C12FBA283446BBD45131A4D58EE2EFAAF15597CDB76D39732C67618319CD9C214658446146B3CCFE1DB2CCFE699F2F3B97F777783071AF23F9C8490000000049454E44AE426082) OnClick: ACP_ChangeViewinFram(Handle(ACP_Test_FrameNode), 'Result') Variable ACP_Framenode_XYWH Title: Framenode XYWH Definition: ACP_GetNodeXYWH(Handle(ACP_Test_FrameNode)) NodeLocation: 1104,208,1 NodeSize: 64,32 WindState: 2,159,353,720,350 ValueState: 2,566,145,537,289,,MIDM Button ACP_test_show Title: test show NodeLocation: 1104,288,1 NodeSize: 64,32 OnClick: CloseWindow(Handle(ACP_Framenode_XYWH), 'Result');~ ACP_Set_att_field(valueState, Handle(ACP_Framenode_XYWH), ACP_GetWindowXYWH_fr(Handle(ACP_Test_FrameNode), ACP_Frame_margin), ACP_XYWH);~ ShowWindow(Handle(ACP_Framenode_XYWH), 'Result') Button ACP_Close_window Title: Close window NodeLocation: 1104,376,1 NodeSize: 64,32 OnClick: CloseWindow(Handle(ACP_Framenode_XYWH), 'Result') Variable ACP_framenode_XYWH_v Title: framenode XYWH valuestate Definition: ACP_Get_att_field(ValueState, Handle(ACP_Framenode_XYWH), ACP_XYWH) NodeLocation: 1104,120,1 NodeSize: 64,32 ValueState: 2,1645,111,416,303,,MIDM Variable ACP_Test_node_xywh Title: Test node xywh Definition: ACP_GetNodeXYWH(handle(ACP_Test_FrameNode))~ + Array(ACP_XYWH, [ACP_Frame_margin, ACP_Frame_margin, -4*ACP_Frame_margin, -6*ACP_Frame_margin])~ + (ACP_Get_att_field(Diagstate, Handle(ACP_Show_View_in_Fra), ACP_XY) + ACP_DiagWindow_offse)[ACP_XY = ACP_XYWH, defVal: 0]~ NodeLocation: 176,400,1 NodeSize: 72,24 WindState: 2,477,398,720,350 ValueState: 2,1329,195,416,303,,MIDM Variable ACP_Diag_offset Title: Diag offset Definition: ACP_Get_att_field(ValueState, Handle(ACP_Framenode_XYWH), ACP_XY)~ - ACP_Get_att_field(Diagstate, Handle(ACP_Show_View_in_Fra), ACP_XY) NodeLocation: 1256,208,1 NodeSize: 64,32 ValueState: 2,1388,717,416,303,,MIDM Button ACP_Object_view2 Title: Object view NodeLocation: 924,22,1 NodeSize: 12,13 NodeInfo: 1,,,0 WindState: 2,771,316,720,350 NodeColor: 62258,62258,62258 Pict: (0000000000070016001E00047609000089504E470D0A1A0A0000000D494844520000002500000024080200000081A064F1000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA864000008FB494441545847E5D7D95713691600F0F92F66E661CE2C0FB3F4BCF499E9999E6E75B455D4166C14DCA5955610655F4411A1517665DF970861917D0984845508108C908435EC0949C84AAA925456B25412E6AB547A0402B6F33CF7DC0381DCAF7EB95F2AB72ABFD8D9D9414C5A0122DE9D7C44CC538BD655C255A56019DA585470F96A89D288A0761BA8770F876307B53960C4BCB6A99D5955B296613C994B306B099E5D530A657ABDD16AB73B308FA7DE1CD898D895F45EDE78CF3A8DB4F2B66D69A069A1B76E8EDCBF3E0160136AC6817D81DAEC0003476F1EE417B7AEE4352DE5356299F36631E70DA7B865A97B54C8E1A974462BE62D41DCB6E53E3C5B97FA9A16A9F50B64E26C6725BBB564AA299F519F452736CE51D99225A3D58403FB42A3B75027C485CDCB89E5334F4BA6E38AD94F8AD8B185ACE8BCC9882C46D8CB8988AC89B4D7ECF97525E671146B4D8B14908D9C9E370BDD35739D84E9B652665301A33E9B4E4C1F25BC182EAB66774D8A160C966D508FA2280CC37ABDDE69ED98AD76814C5FDABEFAAC743A3A8F09322A9719913319FA8AF1209D1E903CEAFFE3C8ADF8A1A014DA1BCAEA07AF7191E28E658C129287CB12068B09CC0EC6E69CDEE901698C3E31BFC0D16834562B0A9A9B5B57A555CFE3184877ECDAE37EBFA7830945EF5D9E1323D7CC915CD87B1C7B9D3C5C9E38581CD7975F36D93A219CD15B8CA05E24128747C5C6272475912932F9964265602D2B53AB5C5E64CE943BE61BDD7B2DB62F266B1CF316146BFBB1893D580C35FB59675E666369790DB18A589B955B70CEEBE2854B57C2221F159594779087BADE7292CAD9601B230FEA0C60DEE13DBE5194F08C51CC9BDB5AFD4867000B2767DE2E8AF50AF13BE271E6CB2327FE9B5F1D3B79E2D4B9E0A8673995DD4F0ADE012CEC10CC33B8CB3B8C1C9A36827933B2E58F630F4969B70A62CEBB7938E973FD5E485C7E44E6F0EECEFC7661E783BBCE06757A857485E01E4BBAB8671B47CA13873E60C1A4B4FB1D29D1CD2F53EA0A4BAA5E5710AA5F66E59EF3BCF8F5BF4F819F91314FB20A0845357D8F72E90762A03380790476605EEA30E64D49163E748663FDBBB1E480F617AF466B46782C9DD900EA85C2CD80A0109FAB37A31FC5F50F0E2DAE09C11049286505A68C1D82B59F0E68FF2EB4EB51B6F37C6188E6B2E9356ED84BB08DA03380EDF320082E29AB6C69EB585BE7AA11446730713735C995EC801734F76DC4319057632884760EE68113DD1DC3B731B01D6B6E9F67DCDE9E9B5F100837AD56ABC3E100535189987AC6852F6B661EA68D82F37EF73602EFDB079DB79FF6A5564C323972CC0383AA6CAAA588D19837519F35464CA7554577BCBA4388FBBEF249586B7AE24009C82A16982F1C7CBEB8078ADA15EAEDE129714EFD6C74D6F88D984E0FFFAA53B7093E61AD013F0E06A70EE7D64E0F4F8A74060BE681A3280CAA2DBD12A45C07CB7450610DE1B8B7D7716FCF829A4A8946011236A84199DD61C7817D01AE0F56D4AE3558E44AA348AECB29AEFFFA94EF57277DB38BEAF812AD50AA95C306F0AC0DBF3EB807A18A889FEEE081EB5FFF4B7C64F9FF95A78020267BBAB1B935382C125F001E34B7B62F2DAF201A8DABE8F0F894E57BBC752EAFB6BEE1D2951B6076E00B8E1C3F7DF5E66D32B5572295B98A0E8F4F59BEC73399CCCB2BAB91318FCF9EF7C61778795F7E9A90C4E56D58AC5657D1E1F129CBF7BF7F6A35D2D6417A181AF1AFA3DF1C3DE1012616B56F40A3D1BA9EFEB9F8D9E57B3C07788D162B5F24CD2E2A3FE9E9EBE573E335B14EA552A3E8C1B765FBC3EEB0184D12A1B820BFF8CCD90BDEDE57AA08449502462D56EC13EA8C3D1E6ADFD19A6D6BB091D0C7084AAF887D5536489F04772B6068B92A3E1A76BD0995AAB737A181A6EEA4A8848CF8D45152BF59AAB221468719C56B5C1E6A77288CB6598599BA61685CD165D2F8912DCCB8B6490283CF906ECB0DA8C9F651D26E07988523DEA6CE835CA9A00E2411C6D26A795503C6DE05137D1D15ABF142CC038742CC7686D45431AF793C0647D1A0C8112862040A1F86226950F27BE5DB4DA3580F6E685D6D82DF668B05F4EDFC0B0BF0F2AD3C85B1735A93410509A791B752BAD4E91424B50749A3680ADF9A183CAC4587739E69CCF679C89C3F8D3C1D77612001F66048717760CB7F501E42DBEAE0E910B30D90A0DE6C366F6CF02118765A58D8354663CF9CAE6404F7900C0A86A5F4A89F772B133AE1679DDAC649CBDA96C3E4BCDFE56BAC5D5C43E284129740863931FF7EF9F55ED9C51E8927599CCC5432E4DB7A2B36AF81544EA8029FEBB9798E56ABB52206EB8A4C5F45D766F5E19EC6D919863DEB841FB729A29A95E9546D3B1B857498C7929B0BA69127633090F06DC4B16B54D97764C91992E858FBA65F9F28675232CB15818B3BFD1DC3F7DA2DBF3BF7F20B4B26992C116B594D99D1E40FFE8451F761F2D00679C81BE879B779518A7934D136682E868661A0B32037EC8B16E13F89B327B2495782A26E7E7FF7F275BF63DF9C397EEAACA7B7EFED1F028B62D399E90D5B19E4C33059509DF41E5116D1A4696162DE5BA11134173502853AB13B3F611E2E4CF0D706FE1F4BA7FE145FFBC5395F7C70E0093ED4C74E78DCF7F1AF7E98C24D6A56A5910FC4243F548BBF7F2D09AC55163AEF9768226382F3CDC3B1AB54E9052776B47DF3EF18B6F1873ADE9F2BD85F66B65FBC170EE6E1A5CB37C0ECC027C8B7172E055CBF9B1B18BF98500FBD20A90EC4FC089BD7CA45FED530EECD284C453348F8088463A0B3D39DA2236D18F659C3C6EFEB78BF26723DBB05B95322F62A1F0C43DAD8B8EFD59B00033F4B2B08E32DBD82BA112893A24C2229E33B302CB209BC61BB31814F89F87EAD616C0DF3C43AB4976F881983C0D9083AC3B1BF357FC07E59BD1E322E67294C0630817676A45259425272E2F39486A616CEE2928A273133059A82216502098E6D7561F76B7763A2801A45F680850F639E0975AC23964C96EACEA0FC6C97F8E82EEC37B5DCDFD6F13E6FE1172DA80CD8F75350BE83201AF04D055CEAB64D263058766C7654A6D156D395495D0760BEA5828BC5F2E7DDBAE1159BCE8479E0287A8B7D163267CFA8BD7A24FF6811FEA561E37775BC5F11B99F356E5CEA1313969125B519C740D86C3670DB693018300C8463C7AE3519C7D7D40543EE9D014C70BD42457C872A740ED4F61F45547EC0D1351F310000000049454E44AE426082) OnClick: ACP_ChangeViewinFram(Handle(ACP_Test_FrameNode), 'Diagram') Variable ACP_FrameNodeShowin1 Title: Att_FrameNodeShowingIdx Definition: ACP_Reset_attribs;~ Att_FrameNodeShowing of ACP_Test_FrameNode NodeLocation: 1112,40,1 NodeSize: 80,32 ValueState: 2,1301,36,416,303,,MIDM FormNode ACP_New2131983235 Title: A test of S-687 Definition: 1 NodeLocation: 120,136,1 NodeSize: 104,16 Original: ACP_test_of_S_687 FormNode ACP_New613645187 Title: eg edit table Definition: 1 NodeLocation: 356,8,1 NodeSize: 92,16 Original: ACP_edit_table Button ACP_reset_Att_framen Title: reset Att_framenodeshow NodeLocation: 1296,40,1 NodeSize: 80,32 OnClick: ACP_Reset_attribs := NOT ACP_Reset_attribs; Index ACP_Probabilistic_vi Title: Probabilistic views Definition: ['MEAN','STAT','CONF','CDFP','PDFP','XCDX','SAMP','SMPL'] NodeLocation: 216,232,1 NodeSize: 72,24 WindState: 2,98,82,720,350 Close ACP_Show_View_in_Fra Module ACP_Frame_and_tall_n Title: Frame and tall node styles Author: Max Henrion Date: Tue, Jun 1, 2021 1:59 PM NodeLocation: 136,184,1 NodeSize: 88,24 NodeInfo: 1,0,0 DiagState: 2,-122,20,1524,543,17,10 AcpStyles: show_as_tab: No {!40300|ProactivelyEvaluate: 5} Decision ACP_Select_indented_ Title: Select indented module Definition: Choice(ACP_Indented_module_,15,0) NodeLocation: 872,568,1 NodeSize: 88,24 Aliases: FormNode ACP_New294878083 Index ACP_Indented_module_ Att_PrevIndexValue: ['> Portfolio planner',' > Oil price',' > Options',' > Indexes',' > Multi- attributes',' > Multi-objective model',' > Opportunities',' > Opportunity model',' > Opportunity inputs',' > Opportunity analysis',' > Portfolios',' > Portfolio optimization',' > Old optimization',' > Portfolio analysis',' > Manual portfolios'] Title: Indented module names Definition: ACP_Indented_modules(ACP_Top_model) NodeLocation: 680,560,1 NodeSize: 80,16 ValueState: 2,232,235,430,548,,MIDM Index ACP_Module_groups Att_PrevIndexValue: ['Top model only','Top model and its modules','Top modules without top model','Modules with user inputs & outputs','All modules except libraries'] Title: Module groups Definition: ['Top model only','Top model and its modules','Top modules without top model','Modules with user inputs & outputs','All modules except libraries'] NodeLocation: 720,488,1 NodeSize: 48,24 Decision ACP_Select_module_gr Title: Select module group Definition: Choice(ACP_Module_groups, 1, 0) NodeLocation: 872,488,1 NodeSize: 88,24 Decision ACP_Modules_to_selec Title: Modules to select Definition: Choice(self, 1, 0) NodeLocation: 104,496,1 NodeSize: 48,24 {!40300|DomainExpr: Discrete(['Main model only','Top level modules','Top 2 level modules','All modules except libraries','All modules'],type:'all')} Variable ACP_Example_value_B Title: Example value B Description: Here is a description fo the example value to see how much of it will appear:~ Line 2~ Line 3~ line 4~ Line 5~ Line 6~ Line 7~ Line 8 Definition: ACP_i1^2 + @ACP_abc + ACP_k NodeLocation: 96,160,1 NodeSize: 72,16 ValueState: 2,956,204,480,361,1,MIDM Aliases: FormNode ACP_New563313539 AcpStyles: Show_description: 40 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Decision ACP_Object_button_on Title: Object button on Frame node Definition: Checkbox(0) NodeLocation: 104,552,1 NodeSize: 88,24 Button ACP_object_button_1 Title: Add object button on Frame NodeLocation: 1252,48,1 NodeSize: 60,24 Text ACP_Te1205360259 Title: Tall node NodeLocation: 328,32,-1 NodeSize: 48,24 Text ACP_Te1608013443 Title: Frame node NodeLocation: 808,28,-1 NodeSize: 128,20 Decision ACP_Apply_styles_to Title: Apply styles to Definition: ['Frame nodes only','User outputs only','User outputs and Frame nodes','All variables'] NodeLocation: 392,568,1 NodeSize: 80,32 Variable ACP_objects_with_ACP Title: objects with ACPstyles Definition: #FindObjects('\w.*', attribute:ACPStyles) NodeLocation: 1248,496,1 NodeSize: 64,24 ValueState: 2,260,266,409,620,,MIDM Variable ACP_styles_by_object Title: ACP styles by object Definition: ACPStyles OF (ACP_objects_with_ACP) NodeLocation: 1400,496,1 NodeSize: 64,24 ValueState: 2,292,298,1034,846,,MIDM Button ACP_Init_show_in_fra Title: Init show in frames Description: Click to show results or edit tables in frame for each dashboard with a Frame node.~ This button runs automatically when the model is loaded NodeLocation: 1252,112,1 NodeSize: 60,24 WindState: 2,792,488,720,350 {!40300|ProactivelyEvaluate: 0} OnClick: ACP_Show_frame_view(Handle(Select_vehicles), Handle(Main_frame), 'Definition');~ ACP_Show_frame_view(Handle(Fuel_cost_per_year), Handle(Frame_fuel_costs), 'Graph');~ ACP_Show_frame_view(Handle(Discounted_lifetime_), Handle(Frame_model), 'Graph');~ ACP_Show_frame_view(Handle(Example_value), Handle(Frame_tall_frame), 'Graph');~ Variable ACP_styles_of_frame_ Title: ACP styles of frame nodes Definition: ACP_Auto_calc;~ ACP_Get_att(AcpStyles, (ACP_Frame_nodes)) NodeLocation: 1088,536,1 NodeSize: 80,32 ValueState: 2,505,600,578,589,,MIDM Variable ACP_styles_for_Tall_ Title: ACP styles for Tall node Definition: ACP_Style_Reset;~ AcpStyles OF ACP_Preview_styles NodeLocation: 185,406,1 NodeSize: 72,16 WindState: 2,445,219,720,350 ValueState: 2,1388,177,416,303,,MIDM Button ACP_Blank_ACP_Styles Title: Blank ACP Styles fo frame nodes Description: Click to apply the Index menu and description styles to all Frame nodes. NodeLocation: 368,484,1 NodeSize: 80,28 WindState: 2,328,272,720,350 OnClick: ACP_show_node(Handle(ACP_Preview_styles)) Variable ACP_Diagram_by_frame Title: Diagram by frame node Definition: IsIN OF (ACP_Frame_nodes) NodeLocation: 1424,192,1 NodeSize: 56,40 ValueState: 2,711,292,416,496,0,MIDM Variable ACP_nodes_by_diagram Title: nodes by diagram Definition: METAVAR v[] := ACP_Frame_nodes DO \(Contains OF (ISIN OF (v))) NodeLocation: 1424,288,1 NodeSize: 48,24 {!50500|FrameNode ACP_Style_lib_frame} {!50500|Title: Styles for result variables} {!50500|Description: Example result to show the selected index and description styles.} {!50500|NodeLocation: 996,240,-18} {!50500|NodeSize: 316,200} {!50500|NodeInfo: 1,,,,1,1} {!50500|WindState: 2,165,37,476,224} {!50500|NodeFont: Arial Black, 15} {!50500|AcpStyles: Show_Description: 20~ Show_uncertainty_view: Yes~ show_graph_table_icon:yes~ Show_index_menus: Fly-in~ Show_graph_table_icon: Yes} {!50500|ProactivelyEvaluate: 4} FormNode ACP_New2123594627 Title: Example value Definition: 1 NodeLocation: 136,204,1 NodeSize: 128,20 NodeInfo: 1,,,,,,,184,,,,1,,,,,, Original: ACP_Preview_styles FormNode ACP_New563313539 Title: Example value 2 Definition: 1 NodeLocation: 136,240,1 NodeSize: 128,20 NodeInfo: 1,,,,,,,184,,,,,,,,,, Original: ACP_Example_value_B FormNode ACP_New294878083 Title: Select indented module Definition: 0 NodeLocation: 1268,632,1 NodeSize: 284,16 NodeInfo: 1,,,,,,,358 Original: ACP_Select_indented_ FormNode ACP_New1368619907 Title: ResetAutocalc Definition: 0 NodeLocation: 1308,352,1 NodeSize: 108,16 Original: ACP_model_Reset FormNode ACP_Fo636231747 Title: Example value Definition: 1 NodeLocation: 476,240,1 NodeSize: 196,200 NodeInfo: 1,,,,1,1,,,,,,1 NodeColor: 62258,62258,62258 Original: ACP_Preview_styles Alias Al1324377923 Title: Preview styles for results Definition: 1 NodeLocation: 184,104,1 NodeSize: 48,24 Original: ACP_Preview_styles Alias Al787507011 Title: eg i Definition: 1 NodeLocation: 80,40,1 NodeSize: 48,24 Original: ACP_i1 Alias Al1861248835 Title: eg abc Definition: 1 NodeLocation: 184,40,1 NodeSize: 48,24 Original: ACP_abc Alias Al519071555 Title: eg k Definition: 1 NodeLocation: 80,104,1 NodeSize: 48,24 Original: ACP_k Close ACP_Frame_and_tall_n Close ACP_styles_in_progre Function ACP_Show_frame_view(obj, fr: Handle; view: = 'Result'; graphview: = Null; probView: = 'DEFA') Title: Show_frame_view(obj, frame, view) Description: In ACP, show the specified «view» of object «obj» in frame node «fr». ~ In DTA (desktop editions of Analytica), open a window to show the «view» positioned over in frame node «fr». ~ See Parameter enumerations for possible values of «view». ~ ~ If the «view» is 'Result' (default), set «graphview» to 1 to display it as a graph, 0 to display as a table, or Null (default) to use the most recent saved result state. (Irrelevant for Object, diagram, or edit table views.) ~ By default it shows the last saved uncertainty view. Or you can specify «ProbView» as one of the options listed in Parameter Enumerations to select a particular uncertainty view.~ ~ If «view» is 'Diagram', if «obj» is a Module, it shows its diagram, otherwise it shows the diagram of the parent module of «obj».~ Save «obj» in Vars by frame node so it can be displayed in initial view of the frame in ACP. Definition: view := TextSentenceCase(view);~ IF view='Diagram' AND NOT ACP_IsaModule(obj) ~ THEN obj := IsIn OF obj { Parent diagram of obj}~ ELSE IF view='Graph' THEN graphview := True ~ ELSE IF view='Table' THEN graphview := False;~ ~ Local frameShow := Array(Sys_FrameNodeShowIdx,~ [obj, ~ IF view='Result' THEN probView ~ ELSE ACP_View_type_by_win[ACP_Window_types=view], ~ graphView, 0]);~ {Saved_Frame_views := IF ACP_Frame_nodes=fr THEN frameShow ELSE Saved_Frame_views;}~ Att_FrameNodeShowing OF fr := frameshow;~ IF NOT ACP_is_running THEN BEGIN { For DTA, show the window over the frameNode }~ Local nxywh := ACP_GetWindowXYWH_fr(fr, ACP_Frame_margin); ~ CloseWindow(obj, view);~ Local att :=~ IF view = 'Diagram' THEN Handle(DiagState)~ ELSE IF view = 'Object' THEN Handle(WindState)~ ELSE IF view = 'Definition' THEN Handle(Defnstate)~ ELSE Handle(valueState);~ ACP_Set_att_field(att, obj, nxywh, ACP_XYWH);~ ShowWindow(obj, view);~ END NodeLocation: 320,168,1 NodeSize: 136,24 WindState: 2,484,71,832,741 {!40500|ParameterEnumeration: view~ "Diagram"| The Diagram window of «obj» if it is a module, otherwise the diagram of its parent module.~ "Object"| Object window for «obj».~ "Result"| (default) Result window for «obj» as a table or graph, based on last saved view.~ "Graph"| The graph view of the result for «obj» (or table view if it is a scalar).~ "Table"| The value as a table result. ~ "Definition"| The definition of «obj» as an edit table, if it is one.~ probview~ 'DEFA'| (default) Show the default result view (as saved with result window)~ 'MIDM'| Mid (deterministic) value~ 'MEAN'| Mean~ 'STAT'| Statistics view~ 'CONF'| Probability or confidence bands~ 'CDFP'| Cumulative probability distribution~ 'PDFP'| Probability density or probability mass view~ 'XCDZ'| Exceedance probability distribution~ 'SAMP'| Sample view~ 'SMPL'| Sample view, even if if is non-probabilistic.} Constant ACP_View_type_by_win Title: View type by window type Description: For each Window type, it gives the corresponding view type -- a code used in the Att_Framenodeshowing attribute to determine the view for the object shown in the frame node. Definition: Table(ACP_Window_types)('DIAG','OBJV','MIDM','MIDM','MIDM','DFNM') NodeLocation: 96,168,1 NodeSize: 72,24 WindState: 2,751,783,720,364 DefnState: 2,1209,56,416,303,0,DFNM {!40700|Att_CellFormat: CellEntry(0,0,1)} Index ACP_Window_types Att_PrevIndexValue: ['Diagram','Object','Result','Graph','Table','Definition'] Title: Window types Definition: ['Diagram','Object','Result','Graph','Table','Definition'] NodeLocation: 96,232,1 NodeSize: 72,24 Decision ACP_Frame_margin Title: Frame_margin Description: Used in DTA, the margin around a Result window within its Frame node. Definition: 8 NodeLocation: 96,104,1 NodeSize: 72,24 WindState: 2,684,267,720,350 Decision ACP_DiagWindow_offse Title: DiagWindow offset Description: The location of the top left corner of a Diagram relative to the top left corner of the Window containing the diagram. Adjusts for whether show hierarchy bar is set or not. Definition: Array(ACP_XY, [8,30 + 25*ShowHier]) NodeLocation: 96,32,1 NodeSize: 72,24 WindState: 2,219,448,720,350 ValueState: 2,1436,729,416,303,,MIDM Function ACP_GetWindowXYWH_fr(obj: Handle; margin: = 0) Title: GetWindowXYWH_from_node(obj, margin) Description: Return the top left, X, Y, width, W and height, H for a window that will fit over the node of object «obj», ~ allowing for a «margin» around it, and offset with the position of the parent diagram window of «obj».~ Used to simulate use of ACP Frame node in DTA by showing a result or other window over the Frame node. Definition: ACP_GetNodeXYWH(obj)~ + Array(ACP_XYWH, [margin, margin, -2*margin - 15, -2*margin - 39])~ + (ACP_Get_att_field(Diagstate, ISIN OF obj, ACP_XY) ~ + ACP_DiagWindow_offse)[ACP_XY = ACP_XYWH, defVal: 0] NodeLocation: 320,104,1 NodeSize: 136,24 WindState: 2,857,202,800,430 Function ACP_ChangeViewinFram(fr: Handle; view: = 'Result') Title: ChangeViewinFrame(frame, view) Description: In ACP, change the view to «view» of the object shown in frame node «fr» See Parameter enumerations for possible values of «view». In desktop editions of Analytica, it opens a window to show the «view» over the frame. Definition: ACP_Show_frame_view((Att_FrameNodeShowing of fr)[@Sys_FrameNodeShowIdx=1], fr, view) NodeLocation: 320,232,1 NodeSize: 136,24 WindState: 2,782,63,897,771 {!40500|ParameterEnumeration: view~ "Diagram"| The Diagram window of «obj» if it is a module, otherwise the diagram of its parent module.~ "Object"| Object window for «obj».~ "Result"| (default) Result window for «obj» as a table or graph, based on last saved view.~ "Graph"| The graph view of the result for «obj» (or table view if it is a scalar).~ "Table"| The value as a table result. ~ "Definition"| The definition of «obj» as an edit table, if it is one.~ probview~ 'DEFA'| (default) Show the default result view (as saved with result window)~ 'MIDM'| Mid (deterministic) value~ 'MEAN'| Mean~ 'STAT'| Statistics view~ 'CONF'| Probability or confidence bands~ 'CDFP'| Cumulative probability distribution~ 'PDFP'| Probability density or probability mass view~ 'XCDZ'| Exceedance probability distribution~ 'SAMP'| Sample view~ 'SMPL'| Sample view, even if if is non-probabilistic.} Button ACP_Init_frame_views Title: Init frame views Description: Click to initialize each frame to show its saved view (Graph, Table, Object, Diagram etc) of a variable. Set to execute automatically when model is loaded. NodeLocation: 584,112,1 NodeSize: 64,32 WindState: 2,918,29,687,441 {!40300|ProactivelyEvaluate: 32} OnClick: LocalAlias v := (ACP_Frame_nodes) DO BEGIN ~ Local fv := ACP_Saved_Frame_view[ACP_Frame_nodes=v];~ Local obj := fv[Sys_FrameNodeShowIdx= 'obj'];~ Att_FrameNodeShowing OF v := ~ IF IsNull(obj) THEN Null ~ ELSE BEGIN~ Array(Sys_FrameNodeShowIdx, ~ [IF IsNull(obj) THEN Null ELSE HandleFromIdentifier(obj),~ fv[Sys_FrameNodeShowIdx='view'],~ fv[Sys_FrameNodeShowIdx='graph'],~ Null~ ])~ END;~ ACP_Set_Autocalc(v, acMid: True, ~ acProb: SetContains(\ACP_Probabilistic_vi, fv[Sys_FrameNodeShowIdx='view']))~ END;~ ~ Variable ACP_1st_var_by_frame Title: Initial var by frame node Description: The initial variable to show in each frame node when opening a tab with that Frame node. Definition: Table(ACP_Frame_nodes)(0,0,0,0,0) NodeLocation: 96,288,1 NodeSize: 72,24 WindState: 2,128,191,720,350 DefnState: 2,1554,252,417,490,0,DFNM ValueState: 2,840,63,691,435,,MIDM MetaOnly: 1 Function ACP_frame_view(fr, obj: Handle; view: Text = 'Result') Title: Set_frame_view(fr, obj, view) Description: Set frame «fr» to show view «view» of object «obj» Definition: IF NOT SetContains(\ACP_Frame_nodes, fr) THEN ACP_Frame_nodes := Concat(ACP_Frame_nodes, fr);~ Att_FrameNodeShowing OF fr := ~ Array(Sys_FrameNodeShowIdx,~ [Identifier OF obj, ~ IF view='Result' THEN ACP_Probview ~ ELSE ACP_View_type_by_win[ACP_Window_types=view], ~ Null, Null]); NodeLocation: 320,352,1 NodeSize: 136,24 WindState: 2,152,-20,745,449 Button ACP_initial_frames_t Title: Set "Init frame views" to autocalc on load NodeLocation: 744,108,1 NodeSize: 80,28 WindState: 2,873,49,720,350 OnClick: ACP_Set_Autocalc(Handle(ACP_Init_frame_views), evalOnLoad: True) Variable ACP_Saved_Frame_view Title: Saved Frame views Description: A table that saves the information in Att_FrameNodeShowing for each Frame node, used to initialize Frame nodes to show the objects when first viewed in ACP. (Because ACP doesn't save that information with the model yet.) Definition: Table(ACP_Frame_nodes)(0,0,0,0,0) NodeLocation: 96,416,1 NodeSize: 72,24 WindState: 2,214,76,794,441 DefnState: 2,1041,82,748,317,0,DFNM ValueState: 2,1235,131,729,493,,MIDM ReformDef: [Sys_FrameNodeShowIdx,0] ReformVal: [Sys_FrameNodeShowIdx,0] Att_ResultSliceState: [ACP_I,9,ACP_J,5,ACP_Frame_nodes,1,Sys_FrameNodeShowIdx,1] Att_EditSliceState: [ACP_I,8,ACP_J,8,ACP_Frame_nodes,1,Sys_FrameNodeShowIdx,1] MetaOnly: 1 Button ACP_test_set_frame Title: test set frame NodeLocation: 584,328,1 NodeSize: 64,32 OnClick: Att_FrameNodeShowing OF ACP_Test_FrameNode := ACP_Saved_Frame_view[ACP_Frame_nodes=Handle(ACP_Test_FrameNode)] Button ACP_Save_Frame_views Title: Save frame views Description: Click to save the current view of a variable for each frame node. These are used to initialize the frames to show the same views when you start the model in future ACP sessions. It gives a warning if any Frame node has no view shown. NodeLocation: 584,184,1 NodeSize: 64,32 WindState: 2,887,46,767,711 OnClick: ACP_Saved_Frame_view :=~ LocalAlias fr := (ACP_Frame_nodes) DO BEGIN~ Local av := Att_FrameNodeShowing OF fr;~ IF av=Null THEN Null ~ ELSE BEGIN~ LocalAlias obj := av[Sys_FrameNodeShowIdx= 'obj'];~ Array(Sys_FrameNodeShowIdx, ~ [IF IsNull(obj) THEN Null ELSE Identifier Of obj,~ av[Sys_FrameNodeShowIdx='view'],~ av[Sys_FrameNodeShowIdx='graph'],~ Null~ ])~ END~ END;~ INDEX nullViews := Subset(ACP_Saved_Frame_view[Sys_FrameNodeShowIdx= 'obj']=Null);~ ~ IF Size(nullViews)>0 THEN Msgbox('These Frame nodes contain no view variable:~ ~ ' & JoinText('Frame node '&nullViews & ' in Diagram '& Title OF (IsIn OF (nullViews)), nullViews, ', ~ ')& '. ~ ~ You may want to display a view in each Frame ~ and then try clicking this button again.', 0, 'Warning') Button ACP_frame_views_to_b Title: Set frame views to blank Description: Click to initialize each frame view (Att_FrameNodeShowing) to Null. NodeLocation: 584,256,1 NodeSize: 64,32 WindState: 2,1308,158,687,441 {!40300|ProactivelyEvaluate: 0} OnClick: LocalAlias v := (ACP_Frame_nodes) ~ DO Att_FrameNodeShowing OF v := null Button ACP_saved_Frame_vi1 Title: Set saved Frame views to null NodeLocation: 744,280,1 NodeSize: 72,32 OnClick: ACP_Saved_Frame_view := 0 Alias Al1198090051 Title: All Frame nodes Definition: 1 NodeLocation: 96,352,1 NodeSize: 72,24 Original: ACP_Frame_nodes Variable ACP_Probview Title: ACP Probview Definition: Null NodeLocation: 320,288,1 NodeSize: 72,24 NodeInfo: 1,,,,,,,0,,,,,,0 {!50500|FrameNode Te825900707} {!50500|NodeLocation: 1052,216,-1} {!50500|NodeSize: 196,200} {!50500|WindState: 2,48,558,720,350} {!50500|NodeColor: 55705,55705,55705} {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute Saved_frame_view} Function ACP_Save_frame_view(fr: Handle) Title: ACP_Save_frame_view(fr) Description: Save the current view in frame fr into its attribute Saved_frame_view as text (or '' if it has no view), so it can be recovered when the model is started in a new session. Definition: Local view := Att_FrameNodeShowing OF fr;~ Saved_frame_View OF (fr) := ~ IF view=Null THEN '' ~ ELSE JoinText(view, Sys_FrameNodeShowIdx, ', '); NodeLocation: 320,408,1 NodeSize: 136,24 WindState: 2,823,599,720,350 Close ACP_Frame_views Close ACP_style_lib_detai1 Text ACP_Te41 Title: Browser window size NodeLocation: 212,272,-12 NodeSize: 204,48 NodeInfo: 1,,,,1,1 WindState: 2,165,37,476,224 NodeFont: Arial Black, 15 Text ACP_Te11 Title: ACP Navigation Styles NodeLocation: 212,112,-14 NodeSize: 204,104 NodeInfo: 1,,,,1,1 WindState: 2,1274,740,476,224 NodeFont: Arial Black, 15 Variable ACP_Variable_example Title: Variable Description: An example variable node to illustrate shadow and/or bevel styles. Definition: ACP_Decision_example + 10 NodeLocation: 760,384,1 NodeSize: 48,24 NodeInfo: 1,0,,,,,,,0,,,,,,,,, WindState: 2,98,82,720,350 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute CellFormatExpression} Decision ACP_Decision_example Title: Decision Description: An example decision node to illustrate shadow and/or bevel styles. Definition: 100 NodeLocation: 632,384,1 NodeSize: 48,24 NodeInfo: 1,0,,,,,,,0,,,,,,,,, WindState: 2,98,82,720,350 Module ACP_esoteric_styles Title: Esoteric ACP styles Description: These are rare, obscure, and not yet implemented options. For most purposes, you can ignore them. Author: Max Henrion Date: Sun, May 30, 2021 9:57 AM NodeLocation: 312,440,1 NodeSize: 72,24 NodeInfo: 1,0 DiagState: 2,159,9,798,590,17,10 WindState: 2,98,82,720,350 AcpStyles: show_as_tab: No {!40300|ProactivelyEvaluate: 4} FormNode ACP_Fo377897763 Title: Auto zoom diagrams Definition: 0 NodeLocation: 192,496,5 NodeSize: 176,16 Original: ACP_auto_zoom Text ACP_Appearance_of_th Title: Balloon help NodeLocation: 200,387,-4 NodeSize: 192,51 NodeInfo: 1,,,,1,1 WindState: 2,102,83,476,224 NodeFont: Arial Black,15 Text ACP_Te584569731 Title: Rarely used ACP styles NodeLocation: 200,168,-12 NodeSize: 192,160 NodeInfo: 1,,,,1,1 WindState: 2,165,37,476,224 NodeFont: Arial Black, 15 Text ACP_Appeara577753987 Title: Not yet implemented NodeLocation: 588,224,-4 NodeSize: 188,216 NodeInfo: 1,,,,1,1 WindState: 2,102,83,476,224 NodeFont: Arial Black,15 FormNode ACP_New177437571 Title: Balloon delay Definition: 0 NodeLocation: 192,408,1 NodeSize: 176,16 NodeInfo: 1,,,,,,,88,,,,,,0 Original: ACP_Balloon_delay FormNode ACP_New1251179395 Title: Show node id in balloon Definition: 0 NodeLocation: 192,376,1 NodeSize: 176,16 Original: ACP_Identifier_in_ba FormNode ACP_New714308483 Title: Show node definition in balloon? Definition: 0 NodeLocation: 584,88,1 NodeSize: 176,16 Original: ACP_Definition_in_ba FormNode ACP_New445873027 Title: Show diagram title? Definition: 0 NodeLocation: 192,136,-10 NodeSize: 176,16 Original: ACP_Show_dash_title FormNode ACP_New1519614851 Title: Hide banner? Definition: 0 NodeLocation: 584,56,1 NodeSize: 176,16 Original: ACP_Banner_logo_and_ FormNode ACP_New982743939 Title: Show outline? Definition: 0 NodeLocation: 192,56,-5 NodeSize: 176,16 Original: ACP_Show_the_model_t FormNode ACP_New110328707 Title: Hide modules in DTA and aCP Definition: 0 NodeLocation: 192,204,1 NodeSize: 176,20 NodeInfo: 1,,,,,,,78,,,,,,,,, Original: ACP_Hide_nontab_modu FormNode ACP_Fo753125251 Title: Include top level diagram as tab Definition: 0 NodeLocation: 192,168,1 NodeSize: 176,16 Original: ACP_IncludTop_As_Tab FormNode ACP_Fo394256707 Title: Show title Definition: 0 NodeLocation: 192,96,1 NodeSize: 176,16 Original: Show_result_titles Text ACP_Appear1878442787 Title: Normally set by other inputs NodeLocation: 200,516,-4 NodeSize: 192,68 NodeInfo: 1,,,,1,1 WindState: 2,102,83,476,224 NodeFont: Arial Black,15 FormNode Fo690446755 Title: Hide Help menus Definition: 0 NodeLocation: 192,272,1 NodeSize: 176,16 NodeInfo: 1,,,,,,,184,,,,,,0 Original: Hide_Help_menus Button ACP_Save_current_fra Title: Save current frame views Description: Click to save the currently viewed variable for each frame node so that it will show the same views in each frame first when you restart this model in future ACP sessions.~ It gives a warning for any Frame node has no variable currently viewed. NodeLocation: 584,512,1 NodeSize: 72,24 WindState: 2,53,129,844,736 OnClick: IF NOT ACP_is_running THEN MsgBox('This button only works in ACP.~ To save the current views in Frame nodes in ACP: ~ 1. Show a result in each Frame node. ~ 2. Click this button to save the variable viewed in each Frame node.~ 3. Finally, select Save or Save as.. to save the model so that~ these Frame views will appear when you restart the model.', ~ 0, 'Warning')~ ELSE BEGIN~ MsgBox('Sorry, this is not yet working if you added the ACP styles library from inside ACP. It will work if you added it in Desktop Analytica, in which case it will be saved with the model in ACP', 48);~ ACP_Saved_Frame_view :=~ LocalAlias fr := (ACP_Frame_nodes) DO BEGIN~ Local av := Att_FrameNodeShowing OF fr;~ IF av=Null THEN Null ~ ELSE BEGIN~ LocalAlias obj := av[Sys_FrameNodeShowIdx= 'obj'];~ Array(Sys_FrameNodeShowIdx, ~ [IF IsNull(obj) THEN Null ELSE Identifier Of obj,~ av[Sys_FrameNodeShowIdx='view'],~ av[Sys_FrameNodeShowIdx='graph'],~ Null~ ])~ END~ END;~ INDEX nullViews := Subset(ACP_Saved_Frame_view[Sys_FrameNodeShowIdx= 'obj']=Null);~ ~ IF Size(nullViews)>0 THEN Msgbox('These Frame nodes contain no view variable: ~ ' & JoinText('Frame node '&nullViews & ' in Diagram '& Title OF (IsIn OF (nullViews)), nullViews, ', ~ ')& '. ~ ~ You may want to display a view in each Frame ~ and then try clicking this button again.', 0, 'Warning')~ END Close ACP_esoteric_styles Button ACP_set_ACP_style_mo Title: Set ACP style model defaults Description: Click to reset all ACP styles to their default values.~ Do this before saving the ACP Style library for use in other models. NodeLocation: 112,440,1 NodeSize: 72,24 WindState: 2,350,-19,648,768 OnClick: ACP_styles_Intro;~ ACP_Navi_style := 'Top_tabs';~ ~ {Definition OF Show_modules_as_tabs := }~ ACP_Outline_view := False;~ ACP_Hierarchy_bar_ac := True;~ ACP_Show_dash_title := False;~ ACP_ToolbarTabs := False;~ ACP_Screen_size := 'Auto zoom';~ ~ ACP_Shadows := True;~ ACP_Bevels := False;~ ACP_node_radius := 16;~ ~ Show_result_titles := True;~ ACP_Show_uncertainty := True;~ ACP_graph_toggle_def := True; ~ ACP_Default_Descript := 20;~ ACP_Default_index_me := 'Fly-in';~ ~ ACP_Autocalc_default := 'None';~ ACP_Auto_calc := False;~ ~ ACP_Show_dash_title := False;~ ACP_Show_the_model_t := True;~ ACP_Banner_logo_and_ := False;~ ACP_Node_highlight_e := 'Outline';~ ACP_Hide_nontab_modu := False;~ ACP_Identifier_in_ba := False; ~ ACP_Definition_in_ba := False; ~ ACP_Balloon_delay := 0.5;~ ACP_Hide_nontab_modu := True;~ ACP_Set_ACP_styles_a; Text ACP_Te1647961731 Title: Node styles NodeLocation: 628,416,-17 NodeSize: 204,88 NodeInfo: 1,,,,1,1 WindState: 2,165,37,476,224 NodeFont: Arial Black, 15 Text ACP_Te424011395 Title: Default styles for tables and graphs NodeLocation: 628,164,-23 NodeSize: 204,156 NodeInfo: 1,,,,1,1 WindState: 2,165,37,476,224 NodeFont: Arial Black, 15 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} Button ACP_styles_for_this_ Title: ACP styles for this model Description: Click to see the ACP Styles set for this model. NodeLocation: 1312,24,-19 NodeSize: 112,16 WindState: 2,217,316,720,350 NodeColor: 0xffbfbfbf OnClick: ACP_Set_att(Nodecolor, Handle(ACP_styles_for_this_), '62258,62258,62258');~ ACP_Set_att(Nodecolor, ListOfHandles(ACP_Preview_result, ACP_styles_Intro), '49151,49151,49151');~ Description OF ACP_see_model_styles := ACPStyles OF (ACP_Top_model);~ ACP_Show_node(Handle(ACP_see_model_styles));~ ACP_Hide_node(Handle(ACP_Styles_lib_intro));~ ACP_Hide_node(Handle(ACP_Preview_styles),what:'UserOutputs'); Text ACP_see_model_styles Title: ACP Styles set for this model Description: Node_drop_shadow: Yes~ Show_description: 10~ Navigation_style: Top_tabs~ Show_outline: No~ Show_tabs: No~ Use_top_diagram_size: No~ Bevel_node_border: No~ Show_title: Yes~ Show_uncertainty_view: Yes~ Show_graph_table_icon: Yes~ Show_index_menus: Fly-in~ Show_model_title: Yes~ auto_zoom_diagrams: yes~ hide_save_button: No~ Remove_help_menu_options: ACP_Online_docs,Analytica_Q_A_forum NodeLocation: 1144,272,17 NodeSize: 304,236 NodeInfo: 1,,,,1,1,,,,,,1 WindState: 2,76,132,721,523 NodeColor: 62258,62258,62258 Module ACP_Set_non_default_ Title: Set non-default styles Description: To view and set index and description styles for tables and graphs in tall and framenodes to override the defaults for selected nodes. Author: Max Henrion Date: Wed, Jul 7, 2021 11:39 PM NodeLocation: 728,280,-22 NodeSize: 88,24 NodeInfo: 1,0,0 DiagState: 2,0,1,1341,511,23,10, AcpStyles: show_as_tab: No {!40300|ProactivelyEvaluate: 4} FormNode ACP_Fo1217742403 Title: User outputs w non default Autocalc Definition: 0 NodeLocation: 256,376,1 NodeSize: 240,16 NodeInfo: 1,,,,,,,176,,,,,,0 Original: ACP_User_outputs_w_n FormNode ACP_Fo2023048771 Title: Set Autocalc by node Definition: 0 NodeLocation: 256,408,1 NodeSize: 240,16 NodeInfo: 1,,,,,,,219,,,,,,0,,,, Original: ACP_Autocalc_by_no1 Text ACP_Te82809731 Title: Non-default table and graph styles for selected objects NodeLocation: 260,160,-1 NodeSize: 252,152 NodeInfo: 1,,,,1,1 FormNode ACP_New1771273091 Title: Objects w non default styles Definition: 0 NodeLocation: 256,56,1 NodeSize: 240,16 NodeInfo: 1,,,,,,,224 Original: ACP_Objects_w_non_de FormNode ACP_Fo1656047171 Title: Set styles by node Definition: 0 NodeLocation: 256,92,1 NodeSize: 240,20 NodeInfo: 1,,,,,,,224,,,,,,,,,, Original: ACP_styles_by_node2 {!50500|FrameNode ACP_Te1552762435} {!50500|NodeLocation: 928,256,-1} {!50500|NodeSize: 408,248} {!50500|NodeInfo: 1,,,,1,1} {!50500|WindState: 2,98,82,720,350} {!50500|ProactivelyEvaluate: 4} Text ACP_Te1436433219 Title: Set Autocalc for non-default objects NodeLocation: 260,412,-1 NodeSize: 252,92 NodeInfo: 1,,,,1,1 FormNode ACP_New2014244515 Title: Autocalc for Definition: 0 NodeLocation: 256,456,1 NodeSize: 240,16 NodeInfo: 1,,,,,,,219,,,,,,0,,1,, Original: ACP_Autocalc_default FormNode ACP_New68087459 Title: Default index menus Definition: 0 NodeLocation: 256,284,1 NodeSize: 240,20 NodeInfo: 1,,,,,,,174,,,,,,0,,,, Original: ACP_Default_index_me FormNode ACP_New1141829283 Title: Default show Description Definition: 0 NodeLocation: 256,244,1 NodeSize: 240,20 NodeInfo: 1,,,,,,,174,,,,,,0,,,, Original: ACP_Default_Descript FormNode ACP_Fo2014244515 Title: Show Uncertainty view Definition: 0 NodeLocation: 256,164,1 NodeSize: 240,20 Original: ACP_Show_uncertainty FormNode ACP_Fo68087459 Title: Show Graph/ Table toggle icon Definition: 0 NodeLocation: 256,204,1 NodeSize: 240,20 Original: ACP_graph_toggle_def Picture ACP_Pi2014244515 NodeLocation: 256,195,-2 NodeSize: 240,16 Pict: (000000000000001300130004BD02000089504E470D0A1A0A0000000D4948445200000013000000120802000000366E723E000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000024249444154384F6378462E00E93C7BF67C67CF84C4B49CCCDCA2ACBC92ACFC122023392317884022F92540412003A800A80CA818A1B3ADB36FFACCB9A7CF9EBF76FDE6F51B2074E9F295ED3B770311900111014A011500950115237426A4669D3E73EED7AFDFFF61E0C78F1FD76FDC002220032AF4FF3F50015059424A164227D02540238172FFFEFDFFF9EBCF976FBF5EBFFB7CF6C21520FAF0F1CBEFDF7F213A81E0DAF51B193945089D406F00DD0394006A3B74F6496AFDEE90C20D09A58B81A8A873EFC3679F20DA8000A80CA81849673E54E78F9F7FF69C781859B6CD236D5558EE7C204ACB5D73A262FDB3FA8D1074B8784E5A582A42675466CE9C23BB363DB9BEFEC1D59EED27028A37C27526272CD9EF31E996530F04ED72A94FF68C45E8B48D8B5698562EB6BA496265B3FAE4094EB9CBBDD25786E7CE03A2E4C4C57BBD265E77E986A01DAEF549C83ADD23A3FD9ACBFC2737044C6C8C686F4FAA98905E3231A7BC1788CA0AFBA665742C4B6981A009F19551FE31089DF6B1D16A53CAE55634C92F6BD69DD8EF9EB7C42F735974FE6C204A4959B8CBAFFF826717046DF6AC4BF442B2D3262E46764685D0DA2691552D2A9327DAE7AE20D69F3671D1E4EA8C8D969D5E4E8CCE9D2EA821E41113A73CA94C7855237E9DD79CBA36BAD7C604C5237436B47539D7140235CB4FADD06E69764C9DE69E303D38B50F88A263262FF368013A12681B505B6758494B4B1742E7C953A7819A8136039D6D1F19EF1294E41690EC19980844BEFE8931DEF140BF011D191B140FD406548CD0490E78F60C00CB80958EE047DE180000000049454E44AE426082) Picture ACP_Pi68087459 NodeLocation: 256,283,-2 NodeSize: 240,16 Pict: (000000000000001600170004FB03000089504E470D0A1A0A0000000D4948445200000017000000160802000000A4149052000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000038049444154384FAD93EB4F537718C7FD2774174057682DD42A45AB94180115C7A631ECC54C7869E29B6D9A2C5964196BD71B05A671D9D0C468362FD052CEAD9EF69C43AFD02B2D520B87408B30D48165D815E9858B94762FF62367F6B880D99271F27DF1E4E47C3EF93DBFF33C3BE6B7E3D96ECB439ABE8EC09F6AD4750AD909E5DFA9934BEB65CD1F49BF0145FEE54985AC41ADB8A2ED720F0D312C6BF909864E77FCC0EFB9CF31747F60D0332941750774772BB4BF70511D17EF11991009691013A800D1D6DDF85179F70EC3B2960695820775EEECA7763A7BF379AF8FDC4B620202D9DD4FF1BCF673F4C35BB3CF1AE9A1329F838F4327557286652D350AD91EBCE74D45DEB28F40451EFBC5C8E8683AB9B09E79944A7C1EA6250EAAFA7B0DC3B2966AE577BB7168B3854F62FB09F4DC233F341F9D5B7BB5F267EE8FF50C1EFBBD71C05573B58D61FF9345B87116DBD9E1C0703A99CC663D8B0BA03E0CCE72B59561FFDD92BF97C301973FF11274645D8889034EAE19AFDADC51AD5CCA31E801F6660A6DA6321322C4A13D7693D8E7F0C6632F5657A8177307BD0E2E851D6D53332C6BA993351FD0DFE3932848E9463050084CB018D655425DFB4D48AD8DB44E4F3D9E8B629313D536B202EDAE6D51322C6B39256D2EEFBE574A2065045A4E6255661C5C87D0081F81B5929E2E9111F9D84E39A7A7269ECFEAC363C72CA60A4477BC45C1B0FFE8A8D8A02FEAA3F6B9AD0D415FFB54E4A0D75EDAD72BA60C1202AB745BBF0A8FCC2CA5E796973B9E4C0ADC560E896ED111B8DD6223CCF5DACE8F852CF1D86072B16972FC8BB1D0A580E7CB01F7B5E989602A91CE65C7965217C687391E6B218549B69C172189358E0647D2C95436BB3117994C746539128D8ECFCCC457579772B95866ADFDE964B9BFFF7D97B9E06D1601817E3232087E6722BBBE9CCB45D75E3D5D4AD3CF6743BF3D8B2413CEC5B8F4D770E5A0ABC86D79C7D9BBB5056C00CF080B7C8ECF22B46B313E9A4E29A6272E87E9A6A181A680F7021DAC0FF9F93E4781DBC28C52218956B5B7302C6B39AD92F3106D81CBCCF7D9EB43039A278F45FE7E9ECB2232E387284331C0DC96775DE65DAF07122C5DCDE66D6CD77682652FC174C5604CCC0F0E598D2524C631C242A8AB5CDFC931424504920F98CF63373BBEBE759361598B2718D474DE3FD3AAAA0169536FA4557D5CA33CA5927FA89483A2BA55CD047C50AF517DFBF36DABCFC7B0ACE5FF3CDB61999FFF0B2C321CEADEDB87B60000000049454E44AE426082) Picture Pi2014244515 NodeLocation: 256,196,-2 NodeSize: 240,16 Pict: (000000060003001700140004C802000089504E470D0A1A0A0000000D49484452000000170000001708020000006F4843F7000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000024D49444154384FAD945B4F1A5110C7FBF58C0657CB8A1529A994AAD5782B505624247D40418A9AA626BE797B68BD54DBBE72FB021568BF066FFB0272697FE7CC4A428A0D49F967B299FFEC99FF999D397B9ED8B65DABD57E942BD6D63BC3F48E4D78C60C65232EF788CB1CD53E8603252894652C268544D2950A5EE0D5B2D71F0C47E3C95426B5BB873D9F9B8FC6123BE9AC501C2841A12C6331292492AE5490841F9F9C150A8562B1C813AC872C22B95C4E280E94A05059468444D2950AB585ADB8BC03A55289E74678F3E4F43C9FCF43010E9460770120858A48572A7C2415CA0B208B065101C99D5DD2B58AE1E153119604C0EB7FAB08482191F41E15ADEE60236C898AD007154BA8A04785F9D17C3AC7560F664DCFCECD2FADE187A25B180EF4992F107AABA8D89B48CC1F58E404888A69C512349CDDBA46CE97DBEF77E56AA5FA0BC381463613E5EA4F89A860A5FAE1F0C8A98513C571609694DD059B9359AFD79B1A38D0642A7B7F2F018546A371717DEB7A3AF368772998DD58FA5B03079ACAEC773A1D898056AB7575F36DDC3D4495E17CD170BADB77D20C959C247F63661FC381BE082E0915DB4EEFBD5E098D1A533D7DD147C901E7826DA99F46001C2899ED765B2240F7E5EBF83066D4559998DE4EBF9712C0202ABA940E757DBAB876666498B391BF6E8641549ACD56F6E0E3E4944FA9F4BDA5F8471801B3A46C8003A59D42A9020906175C5CB5E2FA96EA7B63FA030B4C91E3C0B9C270A04C8446609F2F6FB2078748BC5C58B9931BF391DBDBE4C989E2B3311C2843A597CADCDE498F8F2A90706EEFFF856DFF01B17D35C9AF06B7440000000049454E44AE426082) Text ACP_Te1934552739 Title: Default styles from main ACP Styles page NodeLocation: 204,132,-1 NodeSize: 188,12 Close ACP_Set_non_default_ Decision ACP_Decision_exampl1 Title: Decision Description: An example decision node to illustrate shadow and/or bevel styles. Definition: 100 NodeLocation: 640,392,-16 NodeSize: 48,24 NodeInfo: 1,0,0,0,0,,,,,,,1 NodeColor: 55705,55705,55705 Variable ACP_Variable_exampl1 Title: Variable Description: An example variable node to illustrate shadow and/or bevel styles. Definition: ACP_Decision_example + 10 NodeLocation: 768,392,-15 NodeSize: 48,24 NodeInfo: 1,0,0,0,0,,,,,,,1 NodeColor: 52428,52428,52428 Text ACP_Styles_lib_intro Title: How to use this ACP Styles library Description: Analytica Cloud Platform (ACP) offers several user-interface styles and options to navigate models, and display tables and graphs and nodes in a diagram beyond those available in desktop Analytica. This library lets you select these ACP styles for your model. Here's how to use it:~ ~ * Usually, you'll load this library in ACP by selecting the "ACP Styles library" option from the "hamburger" menu in the teal bar at the top (3 horizontal bars).~ ~ * Mouse-over each checkbox or choice input to the left to see what it does. Or you can just check/uncheck or select a different choice option to see its effect immediately. ~ ~ * Click tab "Preview result styles" to see the effect of the "Default styles for Tables and Graphs"~ ~ * Click tab "ACP Styles for this model" to see the underlying ACP style parameters.~ ~ For more, visit ACP Styles library in the Analytica wiki. NodeLocation: 1144,270,11 NodeSize: 304,233 NodeInfo: 1,,,,1,1,,,,,,0 WindState: 2,265,211,631,525 NodeColor: 62258,62258,62258 {!60005|Att_AttsToShow: Object Object, Object Attribute, Attribute AcpStyles} FormNode ACP_New1720941443 Title: Show outline? Definition: 0 NodeLocation: 212,88,-5 NodeSize: 196,16 NodeInfo: 1,,,,,,,,,,,1 Original: ACP_ToolbarTabs FormNode ACP_New1452505987 Title: Navigation style Definition: 0 NodeLocation: 212,56,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,200 Original: ACP_Navi_style FormNode ACP_New915635075 Title: Minimum Resolution Definition: 0 NodeLocation: 212,264,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,200,,,,,,0,,,, Original: ACP_Screen_size FormNode ACP_New1989376899 Title: Show hierarchy Definition: 0 NodeLocation: 212,184,10 NodeSize: 196,16 Original: ACP_Hierarchy_bar_ac FormNode ACP_New244546435 Title: Show outline? Definition: 0 NodeLocation: 500,368,1 NodeSize: 68,16 Original: ACP_Shadows FormNode ACP_New1318288259 Title: Show outline? Definition: 0 NodeLocation: 500,400,1 NodeSize: 68,16 Original: ACP_Bevels FormNode ACP_New781417347 Title: Outline tree on left Definition: 0 NodeLocation: 212,152,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,,,,,0 Original: ACP_Outline_view FormNode ACP_New1855159171 Title: Set Text and Frame node corner radius to Definition: 0 NodeLocation: 628,440,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,104 Original: ACP_node_radius FormNode ACP_New512981891 Title: Apply radius to Definition: 0 NodeLocation: 628,472,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,216 Original: ACP_object_types FormNode ACP_New1586723715 Title: Dash size Definition: 1 NodeLocation: 212,296,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,124,,,,,,,,, Original: ACP_dashboard_size FormNode ACP_New831748995 Title: Don't show module s a tabs Definition: 0 NodeLocation: 212,88,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,200,,,,0,,0 Original: ACP_Show_modules_as_ FormNode ACP_New160660355 Title: Autocalc for Definition: 0 NodeLocation: 628,224,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,174,,,,,,0,,1 Original: ACP_Autocalc_default FormNode ACP_New93551491 Title: Default index menus Definition: 0 NodeLocation: 628,176,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,174,,,,,,0 Original: ACP_Default_index_me FormNode ACP_New1167293315 Title: Default show Description Definition: 0 NodeLocation: 628,144,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,174,,,,,,0 Original: ACP_Default_Descript FormNode ACP_Fo1157168003 Title: Show Uncertainty view Definition: 0 NodeLocation: 628,56,1 NodeSize: 196,16 Original: ACP_Show_uncertainty FormNode ACP_Fo620297091 Title: Show Graph/ Table toggle icon Definition: 0 NodeLocation: 628,88,1 NodeSize: 196,16 Original: ACP_graph_toggle_def Picture ACP_Pi417671043 NodeLocation: 764,87,-2 NodeSize: 12,12 Pict: (000000000000001300130004BD02000089504E470D0A1A0A0000000D4948445200000013000000120802000000366E723E000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000024249444154384F6378462E00E93C7BF67C67CF84C4B49CCCDCA2ACBC92ACFC122023392317884022F92540412003A800A80CA818A1B3ADB36FFACCB9A7CF9EBF76FDE6F51B2074E9F295ED3B770311900111014A011500950115237426A4669D3E73EED7AFDFFF61E0C78F1FD76FDC002220032AF4FF3F50015059424A164227D02540238172FFFEFDFFF9EBCF976FBF5EBFFB7CF6C21520FAF0F1CBEFDF7F213A81E0DAF51B193945089D406F00DD0394006A3B74F6496AFDEE90C20D09A58B81A8A873EFC3679F20DA8000A80CA81849673E54E78F9F7FF69C781859B6CD236D5558EE7C204ACB5D73A262FDB3FA8D1074B8784E5A582A42675466CE9C23BB363DB9BEFEC1D59EED27028A37C27526272CD9EF31E996530F04ED72A94FF68C45E8B48D8B5698562EB6BA496265B3FAE4094EB9CBBDD25786E7CE03A2E4C4C57BBD265E77E986A01DAEF549C83ADD23A3FD9ACBFC2737044C6C8C686F4FAA98905E3231A7BC1788CA0AFBA665742C4B6981A009F19551FE31089DF6B1D16A53CAE55634C92F6BD69DD8EF9EB7C42F735974FE6C204A4959B8CBAFFF826717046DF6AC4BF442B2D3262E46764685D0DA2691552D2A9327DAE7AE20D69F3671D1E4EA8C8D969D5E4E8CCE9D2EA821E41113A73CA94C7855237E9DD79CBA36BAD7C604C5237436B47539D7140235CB4FADD06E69764C9DE69E303D38B50F88A263262FF368013A12681B505B6758494B4B1742E7C953A7819A8136039D6D1F19EF1294E41690EC19980844BEFE8931DEF140BF011D191B140FD406548CD0490E78F60C00CB80958EE047DE180000000049454E44AE426082) Picture ACP_Pi1743071107 NodeLocation: 624,175,-2 NodeSize: 8,12 Pict: (000000000000001600170004FB03000089504E470D0A1A0A0000000D4948445200000017000000160802000000A4149052000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000038049444154384FAD93EB4F537718C7FD2774174057682DD42A45AB94180115C7A631ECC54C7869E29B6D9A2C5964196BD71B05A671D9D0C468362FD052CEAD9EF69C43AFD02B2D520B87408B30D48165D815E9858B94762FF62367F6B880D99271F27DF1E4E47C3EF93DBFF33C3BE6B7E3D96ECB439ABE8EC09F6AD4750AD909E5DFA9934BEB65CD1F49BF0145FEE54985AC41ADB8A2ED720F0D312C6BF909864E77FCC0EFB9CF31747F60D0332941750774772BB4BF70511D17EF11991009691013A800D1D6DDF85179F70EC3B2960695820775EEECA7763A7BF379AF8FDC4B620202D9DD4FF1BCF673F4C35BB3CF1AE9A1329F838F4327557286652D350AD91EBCE74D45DEB28F40451EFBC5C8E8683AB9B09E79944A7C1EA6250EAAFA7B0DC3B2966AE577BB7168B3854F62FB09F4DC233F341F9D5B7BB5F267EE8FF50C1EFBBD71C05573B58D61FF9345B87116DBD9E1C0703A99CC663D8B0BA03E0CCE72B59561FFDD92BF97C301973FF11274645D8889034EAE19AFDADC51AD5CCA31E801F6660A6DA6321322C4A13D7693D8E7F0C6632F5657A8177307BD0E2E851D6D53332C6BA993351FD0DFE3932848E9463050084CB018D655425DFB4D48AD8DB44E4F3D9E8B629313D536B202EDAE6D51322C6B39256D2EEFBE574A2065045A4E6255661C5C87D0081F81B5929E2E9111F9D84E39A7A7269ECFEAC363C72CA60A4477BC45C1B0FFE8A8D8A02FEAA3F6B9AD0D415FFB54E4A0D75EDAD72BA60C1202AB745BBF0A8FCC2CA5E796973B9E4C0ADC560E896ED111B8DD6223CCF5DACE8F852CF1D86072B16972FC8BB1D0A580E7CB01F7B5E989602A91CE65C7965217C687391E6B218549B69C172189358E0647D2C95436BB3117994C746539128D8ECFCCC457579772B95866ADFDE964B9BFFF7D97B9E06D1601817E3232087E6722BBBE9CCB45D75E3D5D4AD3CF6743BF3D8B2413CEC5B8F4D770E5A0ABC86D79C7D9BBB5056C00CF080B7C8ECF22B46B313E9A4E29A6272E87E9A6A181A680F7021DAC0FF9F93E4781DBC28C52218956B5B7302C6B39AD92F3106D81CBCCF7D9EB43039A278F45FE7E9ECB2232E387284331C0DC96775DE65DAF07122C5DCDE66D6CD77682652FC174C5604CCC0F0E598D2524C631C242A8AB5CDFC931424504920F98CF63373BBEBE759361598B2718D474DE3FD3AAAA0169536FA4557D5CA33CA5927FA89483A2BA55CD047C50AF517DFBF36DABCFC7B0ACE5FF3CDB61999FFF0B2C321CEADEDB87B60000000049454E44AE426082) FormNode ACP_Fo1730858883 Title: Tab color Definition: 0 NodeLocation: 212,120,1 NodeSize: 196,16 NodeInfo: 1,,,,,,,200,,,,0, Original: ACP_Tab_color FormNode ACP_preview_Tall_nod Title: Example value Definition: 1 NodeLocation: 1144,270,1 NodeSize: 304,234 NodeInfo: 1,,,,1,1,,,,,,1 WindState: 2,98,82,720,350 NodeColor: 62258,62258,62258 Original: ACP_Preview_styles GraphStyleTemplate ACP_MH2 Title: MH2 GraphSetup: Graph_ColorSeq:[0,31488,35328,21248,39936,60928,42496,22784,55552,54528,25088,36096,57088,27648,18944,55552,43264,20736,49152,50944,15616,30208,42240,18176,27904,49152,37120,35072,50176,61184,55808,39680,59392,53504,32256,36608,58368,43264,29696,60672,55808,28672,46848,54784,39424,43264,52480,48128,55552,55552,55552,45824,45824,45824,29440,29440,29440,6400,6400,6400] GraphStyleTemplate ACP_w_logo_colors Title: MH w logo colors GraphSetup: Graph_ColorSeq:[14848,35584,36352,0,32768,65280,33792,15616,46080,50944,16128,25600,63488,17664,8960,65280,37120,11008,29696,38144,14080,19200,47616,46848,27904,49152,37120,35072,50176,61184,55808,39680,59392,53504,32256,36608,58368,43264,29696,60672,55808,28672,46848,54784,39424,43264,52480,48128,55552,55552,55552,45824,45824,45824,29440,29440,29440,6400,6400,6400] Text ACP_Te820069955 NodeLocation: 212,416,-17 NodeSize: 204,88 NodeInfo: 1,,,,1,1 WindState: 2,165,37,476,224 NodeFont: Arial Black, 15 Button ACP_Reset_changes Title: Reset to reflect model changes Description: Click this button to make sure that all ACP Style options reflect any modules or nodes that you may have added or removed in this mode, including:~ "Show modules as tabs" reflects any new or removed modules at the top level.~ "Screen size" reflects any changes to Diagram window sizes (when set to ~ Fit main model or "Fit largest windows)~ "Set styles by node" or "Set autocalc by node" reflect any new or removed ~ modules or user output variables. NodeLocation: 112,376,1 NodeSize: 72,24 WindState: 2,168,255,731,592 OnClick: ACP_model_Reset := NOT ACP_model_Reset Button ACP_styles_Intro Title: Intro Description: Click to see an introduction on how to use this ACP Styles library. NodeLocation: 916,24,-20 NodeSize: 60,16 WindState: 2,786,161,720,350 NodeColor: 0xfff3f3f3 OnClick: ACP_Set_att(Nodecolor, Handle(ACP_styles_Intro), '62258,62258,62258');~ ACP_Set_att(Nodecolor, ListOfHandles(ACP_Preview_result, ACP_styles_for_this_), '49151,49151,49151');~ ACP_Show_node(Handle(ACP_Styles_lib_intro));~ ACP_Hide_node(Handle(ACP_see_model_styles,));~ ACP_Hide_node(Handle(ACP_Preview_styles),what:'UserOutputs'); Button ACP_Preview_result Title: Preview result styles Description: Click to see the ACP Styles set for this model. NodeLocation: 1088,24,-18 NodeSize: 112,16 WindState: 2,271,188,720,350 NodeColor: 0xffbfbfbf OnClick: ACP_Set_att(Nodecolor, Handle(ACP_Preview_result), '62258,62258,62258');~ ACP_Set_att(Nodecolor, ListOfHandles(ACP_styles_Intro, ACP_styles_for_this_), '49151,49151,49151');~ ACP_Show_node(Handle(ACP_Preview_styles),what:'UserOutputs');~ ACP_Hide_node(ListOfHandles(ACP_see_model_styles, ACP_Styles_lib_intro));~ {ShowWindow(ACP_Preview_styles, 'Result')} Picture Pi887605059 NodeLocation: 783,88,-2 NodeSize: 12,12 Pict: (000000060003001700140004C802000089504E470D0A1A0A0000000D49484452000000170000001708020000006F4843F7000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000024D49444154384FAD945B4F1A5110C7FBF58C0657CB8A1529A994AAD5782B505624247D40418A9AA626BE797B68BD54DBBE72FB021568BF066FFB0272697FE7CC4A428A0D49F967B299FFEC99FF999D397B9ED8B65DABD57E942BD6D63BC3F48E4D78C60C65232EF788CB1CD53E8603252894652C268544D2950A5EE0D5B2D71F0C47E3C95426B5BB873D9F9B8FC6123BE9AC501C2841A12C6331292492AE5490841F9F9C150A8562B1C813AC872C22B95C4E280E94A05059468444D2950AB585ADB8BC03A55289E74678F3E4F43C9FCF43010E9460770120858A48572A7C2415CA0B208B065101C99D5DD2B58AE1E153119604C0EB7FAB08482191F41E15ADEE60236C898AD007154BA8A04785F9D17C3AC7560F664DCFCECD2FADE187A25B180EF4992F107AABA8D89B48CC1F58E404888A69C512349CDDBA46CE97DBEF77E56AA5FA0BC381463613E5EA4F89A860A5FAE1F0C8A98513C571609694DD059B9359AFD79B1A38D0642A7B7F2F018546A371717DEB7A3AF368772998DD58FA5B03079ACAEC773A1D898056AB7575F36DDC3D4495E17CD170BADB77D20C959C247F63661FC381BE082E0915DB4EEFBD5E098D1A533D7DD147C901E7826DA99F46001C2899ED765B2240F7E5EBF83066D4559998DE4EBF9712C0202ABA940E757DBAB876666498B391BF6E8641549ACD56F6E0E3E4944FA9F4BDA5F8471801B3A46C8003A59D42A9020906175C5CB5E2FA96EA7B63FA030B4C91E3C0B9C270A04C8446609F2F6FB2078748BC5C58B9931BF391DBDBE4C989E2B3311C2843A597CADCDE498F8F2A90706EEFFF856DFF01B17D35C9AF06B7440000000049454E44AE426082) Button ACP_Remove_lib Title: Remove this ACP Styles lib Description: Click to remove this ACP Styles library from this model.~ The model will retain all ACP Styles and options that you have set. NodeLocation: 312,376,1 NodeSize: 72,24 WindState: 2,459,279,720,350 OnClick: IF IsIN OF Handle(ACP_Styles)=Null ~ THEN MsgBox('You cannot delete this library because you ~ have opened it as the main model', 0,'Warning')~ ELSE EvaluateScript('Delete All '&Identifier OF Handle(ACP_Styles)) Close ACP_Styles Close Portfolio_optimizati {!-40499|MsgBox("This Analytica model file contains text characters encoded in UTF-8 (Unicode) format, not ASCII. It was saved from Analytica release 6.4. You need to upgrade to Analytica 6.4 to read the model correctly. If you use it with this release, the Unicode characters may look strange and parts of the model may not work.",16,"Analytica 6.4 required")}