main 3ebfdefddd5d cached
64 files
252.4 KB
78.6k tokens
348 symbols
1 requests
Download .txt
Showing preview only (270K chars total). Download the full file or copy to clipboard to get everything.
Repository: nurjahan-shiah/Software-Design
Branch: main
Commit: 3ebfdefddd5d
Files: 64
Total size: 252.4 KB

Directory structure:
gitextract_3g0h0e_9/

├── D1/
│   └── Sequence Diagram/
│       ├── Sequence1.drawio
│       ├── Sequence2.drawio
│       └── sequence3.drawio
└── D2/
    ├── .vscode/
    │   └── settings.json
    ├── data/
    │   ├── bookings.csv
    │   ├── equipment.csv
    │   └── users.csv
    ├── lib/
    │   └── javacsv.jar
    └── src/
        ├── Main.java
        ├── data/
        │   ├── .gitkeep
        │   ├── BookingDAO.java
        │   ├── EquipmentDAO.java
        │   └── UserDAO.java
        ├── gui/
        │   ├── .gitkeep
        │   ├── CoordinatorDashboardPanel.java
        │   ├── LoginPanel.java
        │   ├── MainFrame.java
        │   ├── ManagerDashboardPanel.java
        │   ├── UI.java
        │   └── UserDashboardPanel.java
        ├── model/
        │   ├── .gitkeep
        │   ├── Deposit.java
        │   ├── Equipment.java
        │   ├── Faculty.java
        │   ├── Guest.java
        │   ├── HeadLabCoordinator.java
        │   ├── LabLocation.java
        │   ├── LabManager.java
        │   ├── PaymentTransaction.java
        │   ├── Researcher.java
        │   ├── Reservation.java
        │   ├── Student.java
        │   └── User.java
        └── pattern/
            ├── command/
            │   ├── .gitkeep
            │   ├── CancelCommand.java
            │   ├── Command.java
            │   ├── ExtendCommand.java
            │   ├── ForfeitDepositCommand.java
            │   ├── ModifyCommand.java
            │   ├── ReservationService.java
            │   └── ReserveCommand.java
            ├── factory/
            │   ├── .gitkeep
            │   └── UserFactory.java
            ├── observer/
            │   ├── .gitkeep
            │   ├── EquipmentObserver.java
            │   ├── EquipmentSubject.java
            │   ├── Observer.java
            │   └── UserNotificationObserver.java
            ├── singleton/
            │   ├── .gitkeep
            │   ├── BookingSystem.java
            │   └── HeadLabCoordinatorSingleton.java
            ├── state/
            │   ├── .gitkeep
            │   ├── AvailableState.java
            │   ├── DisabledState.java
            │   ├── EquipmentContext.java
            │   ├── EquipmentState.java
            │   └── MaintenanceState.java
            └── strategy/
                ├── .gitkeep
                ├── CreditCardPayment.java
                ├── DebitPayment.java
                ├── GrantPayment.java
                ├── InstitutionalPayment.java
                ├── PaymentProcessor.java
                └── PaymentStrategy.java

================================================
FILE CONTENTS
================================================

================================================
FILE: D1/Sequence Diagram/Sequence1.drawio
================================================
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36" version="29.6.0">
  <diagram name="Page-1" id="y0SlUyap2nFQ304lxbyJ">
    <mxGraphModel dx="2197" dy="920" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" background="none" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Times New Roman;" value=":LabManager" vertex="1">
          <mxGeometry height="60" width="120" x="1450" y="100" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-2" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Times New Roman;" value=":HeadLabCoordinator" vertex="1">
          <mxGeometry height="60" width="140" x="1205" y="100" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-3" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Times New Roman;" value=":DeptApprovalServive" vertex="1">
          <mxGeometry height="60" width="140" x="960" y="100" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-4" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Times New Roman;" value=":UserDatabase" vertex="1">
          <mxGeometry height="60" width="120" x="740" y="90" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-5" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Times New Roman;" value=":AuthenticationService" vertex="1">
          <mxGeometry height="60" width="140" x="490" y="90" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-6" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Times New Roman;" value=":RegistrationUI" vertex="1">
          <mxGeometry height="60" width="120" x="180" y="90" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-7" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Times New Roman;" value=":User&lt;div&gt;(Student/Faculty/ Researcher/Guest)&lt;/div&gt;" vertex="1">
          <mxGeometry height="60" width="120" x="20" y="90" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-8" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="Sequence Diagram 1: Registration &amp;amp; Account Management&amp;nbsp;&lt;div&gt;[Req1, Req2, Req8] - Flows: User registration, LogIn, Auto-Generate Manager Account&amp;nbsp;&lt;/div&gt;" vertex="1">
          <mxGeometry height="30" width="470" x="240" y="40" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-9" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-7" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="80" y="2040" as="sourcePoint" />
            <mxPoint x="400" y="330" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-10" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-43" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-6" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="240" y="581.2698800223214" as="sourcePoint" />
            <mxPoint x="290.72" y="29.999999999999943" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-11" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-38" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-5" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="560" y="1460" as="sourcePoint" />
            <mxPoint x="400" y="340" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-12" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-46" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-4" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="800" y="1510" as="sourcePoint" />
            <mxPoint x="450" y="300" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-13" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.557;entryY=1.028;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-3" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="1038" y="2040" as="sourcePoint" />
            <mxPoint x="700" y="500" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-14" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-2" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <Array as="points">
              <mxPoint x="1280" y="2040" />
            </Array>
            <mxPoint x="1280" y="1920" as="sourcePoint" />
            <mxPoint x="1110" y="470" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-15" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.567;entryY=1.061;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-1" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <Array as="points">
              <mxPoint x="1520" y="2040" />
              <mxPoint x="1520" y="1910" />
            </Array>
            <mxPoint x="1520" y="1910" as="sourcePoint" />
            <mxPoint x="940" y="450" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-16" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="&lt;u&gt;&lt;b&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Section 1 - User Registration (Req1, Req8)&lt;/font&gt;&lt;/b&gt;&lt;/u&gt;" vertex="1">
          <mxGeometry height="40" width="300" x="20" y="170" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-18" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="80" y="240" as="sourcePoint" />
            <mxPoint x="240" y="240" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-19" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="1: fillRegistrationForm(email, pwd,&amp;nbsp;&lt;div&gt;userType, studentID&lt;/div&gt;" vertex="1">
          <mxGeometry height="30" width="270" x="15" y="210" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-28" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-101" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="240" y="1880" as="sourcePoint" />
            <mxPoint x="240" y="580" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-30" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-43" style="html=1;align=left;spacingLeft=2;endArrow=block;rounded=0;edgeStyle=orthogonalEdgeStyle;curved=0;rounded=0;fontFamily=Times New Roman;" value="&amp;nbsp;2: validateEmailFormat(email)&lt;div&gt;&lt;br&gt;&lt;/div&gt;">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="300" y="260" />
              <mxPoint x="300" y="290" />
            </Array>
            <mxPoint x="270" y="260" as="sourcePoint" />
            <mxPoint x="245" y="290" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-32" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="3:checkEmailUniqueness(email)" vertex="1">
          <mxGeometry height="30" width="140" x="290" y="290" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-39" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-103" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-38" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="560" y="1890" as="sourcePoint" />
            <mxPoint x="560" y="150" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-38" parent="1" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;" value="" vertex="1">
          <mxGeometry height="480" width="10" x="555" y="280" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-40" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-38" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="390" y="320" />
            </Array>
            <mxPoint x="245" y="320" as="sourcePoint" />
            <mxPoint x="550" y="320" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-44" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-43" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="240" y="581.2698800223214" as="sourcePoint" />
            <mxPoint x="240" y="150" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-43" parent="1" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;" value="" vertex="1">
          <mxGeometry height="630" width="10" x="235" y="240" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-45" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=9;fontFamily=Times New Roman;" value="&lt;font&gt;2&lt;/font&gt;&lt;div&gt;&lt;font&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font&gt;3&lt;/font&gt;&lt;/div&gt;" vertex="1">
          <mxGeometry height="25" width="40" x="220" y="255" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-47" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-105" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-46" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="800" y="1910" as="sourcePoint" />
            <mxPoint x="800" y="150" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-46" parent="1" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;" value="" vertex="1">
          <mxGeometry height="80" width="10" x="795" y="320" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-48" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-38" value="5r: emailExists: Boolean">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="790" y="360" as="sourcePoint" />
            <mxPoint x="600" y="360" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-50" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-38" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="680" y="320" />
            </Array>
            <mxPoint x="630" y="300" as="sourcePoint" />
            <mxPoint x="800" y="320" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-51" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="4:queryEmail(email)" vertex="1">
          <mxGeometry height="30" width="60" x="650" y="290" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-52" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="&lt;font style=&quot;font-size: 9px;&quot;&gt;4&lt;/font&gt;" vertex="1">
          <mxGeometry height="15" width="20" x="550" y="305" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-54" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;" value="alt" vertex="1">
          <mxGeometry height="130" width="820" x="30" y="400" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-57" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="[email already exists]" vertex="1">
          <mxGeometry height="30" width="120" x="80" y="420" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-59" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-54" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.998;entryY=0.606;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.62;exitDx=0;exitDy=0;exitPerimeter=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-54" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="400" y="470" as="sourcePoint" />
            <mxPoint x="450" y="420" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-63" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="5a: error (&#39;Email already registered&#39;)">
          <mxGeometry relative="1" x="0.0164" y="-5" as="geometry">
            <mxPoint as="offset" />
            <mxPoint x="555" y="434.55" as="sourcePoint" />
            <mxPoint x="250" y="434.55" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-64" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="5b: emailAvailable">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="555" y="510" as="sourcePoint" />
            <mxPoint x="250" y="510" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-65" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="email is unique" vertex="1">
          <mxGeometry height="30" width="100" x="130" y="450" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-66" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;" value="alt" vertex="1">
          <mxGeometry height="130" width="820" x="40" y="620" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-67" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="7a: error(&#39;Must include upper, lower, number, symbol&#39;)">
          <mxGeometry relative="1" x="0.1111" as="geometry">
            <mxPoint as="offset" />
            <mxPoint x="555" y="659.09" as="sourcePoint" />
            <mxPoint x="250" y="659.09" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-68" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-66" style="endArrow=none;dashed=1;html=1;rounded=0;exitX=0.002;exitY=0.485;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.999;entryY=0.499;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-66" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="270" y="702" as="sourcePoint" />
            <mxPoint x="860" y="700" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-69" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="7b: passwordValid()">
          <mxGeometry relative="1" x="0.1556" y="-10" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="325" y="720" />
            </Array>
            <mxPoint x="555" y="720" as="sourcePoint" />
            <mxPoint x="255" y="720" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-70" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="Strong password" vertex="1">
          <mxGeometry height="30" width="100" x="145" y="660" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-71" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="[weak password]" vertex="1">
          <mxGeometry height="30" width="120" x="80" y="630" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-72" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-74" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;exitX=0.75;exitY=1;exitDx=0;exitDy=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points" />
            <mxPoint x="360" y="550" as="sourcePoint" />
            <mxPoint x="550" y="560" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-73" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="6:validatePasswordStrength(password)" vertex="1">
          <mxGeometry height="30" width="140" x="310" y="530" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-74" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;6&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="20" x="230" y="530" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-78" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="8: registerUser(email, hashedPwd, userType, studentID" vertex="1">
          <mxGeometry height="30" width="310" x="240" y="770" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-79" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points" />
            <mxPoint x="245" y="800" as="sourcePoint" />
            <mxPoint x="555" y="800" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-83" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;" value="opt" vertex="1">
          <mxGeometry height="170" width="1080" x="40" y="910" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-84" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="userType = Student | Faculty | Researcher" vertex="1">
          <mxGeometry height="30" width="290" x="80" y="910" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-85" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points" />
            <mxPoint x="560" y="840" as="sourcePoint" />
            <mxPoint x="800" y="840" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-86" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="9: createUserRecord (userDTO)" vertex="1">
          <mxGeometry height="30" width="190" x="580" y="810" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-87" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="10r: userID: String">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="800" y="880" as="sourcePoint" />
            <mxPoint x="560" y="880" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-91" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <mxPoint x="565" y="970" as="sourcePoint" />
            <mxPoint x="1040" y="970" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-94" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=block;curved=0;rounded=0;fontFamily=Times New Roman;" value="11: setAccountStatus(userID, &#39;PENDING&#39;)">
          <mxGeometry relative="1" width="80" as="geometry">
            <mxPoint x="1045" y="1010" as="sourcePoint" />
            <mxPoint x="805" y="1010" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-95" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="10: sendApprovalRequest(userID, dept)" vertex="1">
          <mxGeometry height="30" width="220" x="690" y="940" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-96" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="12r: approvalPending()">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="1037.5" y="1060" as="sourcePoint" />
            <mxPoint x="562.5" y="1060" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-97" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="14: display(&#39;Registration submitted: Awaiting Approval if applicable&#39;)">
          <mxGeometry relative="1" x="-0.125" y="-10" as="geometry">
            <mxPoint as="offset" />
            <mxPoint x="240" y="1200" as="sourcePoint" />
            <mxPoint x="80" y="1200" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-98" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="13: registrationSuccess(userID, status)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="560" y="1160" as="sourcePoint" />
            <mxPoint x="240" y="1160" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-99" parent="1" style="text;whiteSpace=wrap;html=1;fontFamily=Times New Roman;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br&gt;&lt;/div&gt;" vertex="1">
          <mxGeometry height="40" width="290" x="30" y="1240" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-100" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;&lt;u style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;Section 2 - User Login Flow (Req1)&lt;/b&gt;&lt;/u&gt;&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="280" x="-20" y="1210" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-102" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-139" style="endArrow=none;dashed=1;html=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="240" y="1880" as="sourcePoint" />
            <mxPoint x="240" y="1520" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-101" parent="1" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;" value="" vertex="1">
          <mxGeometry height="260" width="20" x="220" y="1260" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-104" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-141" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-103" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="560" y="1890" as="sourcePoint" />
            <mxPoint x="560" y="760" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-103" parent="1" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;" value="" vertex="1">
          <mxGeometry height="160" width="10" x="555" y="1270" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-106" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-152" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-105" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="800" y="1910" as="sourcePoint" />
            <mxPoint x="800" y="410" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-105" parent="1" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;" value="" vertex="1">
          <mxGeometry height="100" width="10" x="795" y="1290" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-107" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;" value="alt" vertex="1">
          <mxGeometry height="140" width="820" x="50" y="1350" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-109" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="50" y="1460" as="sourcePoint" />
            <mxPoint x="870" y="1460" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-111" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="[credentials invalid]" vertex="1">
          <mxGeometry height="30" width="120" x="110" y="1350" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-113" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="credentials valid ACTIVE" vertex="1">
          <mxGeometry height="30" width="140" x="50" y="1430" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-114" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=5;exitPerimeter=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="240" y="1280" />
            </Array>
            <mxPoint x="245" y="1255" as="sourcePoint" />
            <mxPoint x="560" y="1280" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-115" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="18a: authFailed(&#39;Invalid email or password&#39;)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="555.0000000000002" y="1380.0000000000002" as="sourcePoint" />
            <mxPoint x="245" y="1380" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-116" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="18b: authFailed(&#39;Account awaiting departmental approval&#39;)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="547.5" y="1445.45" as="sourcePoint" />
            <mxPoint x="242.5" y="1444.54" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-118" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="18c:authSuccess(sessionToken, userType, hourlyRate)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="555" y="1480" as="sourcePoint" />
            <mxPoint x="250" y="1480" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-120" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="18r: userRecord(hasedPwd, status, userType)">
          <mxGeometry relative="1" x="0.0222" as="geometry">
            <mxPoint as="offset" />
            <mxPoint x="795" y="1330" as="sourcePoint" />
            <mxPoint x="570" y="1330" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-121" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="17:&amp;nbsp; fetchUserRecord(email)" vertex="1">
          <mxGeometry height="30" width="180" x="585" y="1270" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-122" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="16: authenticateUser(email, password)" vertex="1">
          <mxGeometry height="30" width="230" x="270" y="1250" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-125" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-101" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=5;exitPerimeter=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points" />
            <mxPoint x="240" y="1265" as="sourcePoint" />
            <mxPoint x="240" y="1265" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-127" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <mxPoint x="565" y="1300" as="sourcePoint" />
            <mxPoint x="565.037037037037" y="1300" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-128" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <mxPoint x="565" y="1300" as="sourcePoint" />
            <mxPoint x="790" y="1300" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-130" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;19: display(Dashboard for userType)&lt;/font&gt;">
          <mxGeometry relative="1" x="0.125" y="-10" as="geometry">
            <mxPoint as="offset" />
            <mxPoint x="240" y="1520" as="sourcePoint" />
            <mxPoint x="80" y="1520" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-133" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <mxPoint x="80" y="1260.91" as="sourcePoint" />
            <mxPoint x="225" y="1260" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-135" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;15: submitLogin(email, password)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="230" x="60" y="1240" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-137" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="50" y="1410" as="sourcePoint" />
            <mxPoint x="870" y="1410" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-138" connectable="0" parent="jcZRHxVDqwLQwtNWG9ev-137" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontFamily=Times New Roman;" value="account PENDING" vertex="1">
          <mxGeometry relative="1" x="-0.8421" y="8" as="geometry">
            <mxPoint as="offset" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-140" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-139" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="240" y="2040" as="sourcePoint" />
            <mxPoint x="240" y="1520" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-139" parent="1" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;" value="" vertex="1">
          <mxGeometry height="260" width="32.5" x="227.5" y="1630" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-142" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-141" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="560" y="2040" as="sourcePoint" />
            <mxPoint x="560" y="1430" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-141" parent="1" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;" value="" vertex="1">
          <mxGeometry height="180" width="25" x="547.5" y="1660" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-143" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-139" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;exitX=0.9;exitY=0.16;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.1;entryY=0.111;entryDx=0;entryDy=0;entryPerimeter=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-141" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="260" y="1680" />
            </Array>
            <mxPoint x="310" y="1810" as="sourcePoint" />
            <mxPoint x="470" y="1810" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-145" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-139" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-141" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="380" y="1760" />
            </Array>
            <mxPoint x="310" y="1810" as="sourcePoint" />
            <mxPoint x="470" y="1810" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-146" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-141" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="22r: role Verified: TRUE">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="332.5" y="1720" as="sourcePoint" />
            <mxPoint x="252.5" y="1720" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-147" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="25:accountCreated(managerID, tempPasswword)">
          <mxGeometry relative="1" as="geometry">
            <Array as="points" />
            <mxPoint x="560" y="1900" as="sourcePoint" />
            <mxPoint x="240" y="1900" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-148" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="21: verifyHeadCoordinatorRole(hlcSessionToken)" vertex="1">
          <mxGeometry height="30" width="310" x="245" y="1650" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-150" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="22: createManagerAccount(managerDTO)" vertex="1">
          <mxGeometry height="30" width="230" x="300" y="1730" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-153" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontFamily=Times New Roman;" target="jcZRHxVDqwLQwtNWG9ev-152" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="800" y="2040" as="sourcePoint" />
            <mxPoint x="800" y="1390" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-152" parent="1" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;" value="" vertex="1">
          <mxGeometry height="80" width="20" x="790" y="1720" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-154" edge="1" parent="1" source="jcZRHxVDqwLQwtNWG9ev-141" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="570" y="1800" />
            </Array>
            <mxPoint x="580" y="1800" as="sourcePoint" />
            <mxPoint x="800" y="1800" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-155" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="24r: managerID: String">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="630" y="1850" />
            </Array>
            <mxPoint x="800" y="1850" as="sourcePoint" />
            <mxPoint x="560" y="1850" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-156" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="&lt;font style=&quot;font-size: 10px;&quot;&gt;23: insertManagerRecord(managerDTO)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="270" x="555" y="1770" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-161" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Times New Roman;" value="" vertex="1">
          <mxGeometry height="100" width="240" x="920" y="1760" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-162" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fontFamily=Times New Roman;" value="opt" vertex="1">
          <mxGeometry height="30" width="60" x="1160" y="1760" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-163" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="role = HeadLabCoordinator" vertex="1">
          <mxGeometry height="30" width="155" x="1230" y="1760" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-164" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;" value="26: display(&#39;Manager account created. Credentials sent.&#39;)">
          <mxGeometry relative="1" x="-0.0005" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="240" y="1960" />
            </Array>
            <mxPoint x="317.5" y="1960" as="sourcePoint" />
            <mxPoint x="1280" y="1960" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-165" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <mxPoint x="800" y="2000" as="sourcePoint" />
            <mxPoint x="1520" y="2000" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-166" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="27: sendCredentials(email, tempPassword)" vertex="1">
          <mxGeometry height="30" width="300" x="910" y="1970" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-167" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1280" y="1630" />
            </Array>
            <mxPoint x="1280" y="1650" as="sourcePoint" />
            <mxPoint x="260" y="1640" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-169" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;" value="20: requestGenerateManagerAccount(managerName, dept)" vertex="1">
          <mxGeometry height="30" width="370" x="740" y="1610" as="geometry" />
        </mxCell>
        <mxCell id="jcZRHxVDqwLQwtNWG9ev-170" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="&lt;b&gt;&lt;font style=&quot;font-size: 16px;&quot; face=&quot;Times New Roman&quot;&gt;&lt;u&gt;Section 3 - Auto-Generate Manager Account (Req2)&lt;/u&gt;&lt;/font&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="360" x="-20" y="1570" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>


================================================
FILE: D1/Sequence Diagram/Sequence2.drawio
================================================
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36" version="29.6.0">
  <diagram name="Page-1" id="2YBvvXClWsGukQMizWep">
    <mxGraphModel dx="2686" dy="2355" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-3" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":User (Student/Faculty/ Researcher/Guest" vertex="1">
          <mxGeometry height="2940" width="180" x="30" y="80" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-4" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":BookingUI" vertex="1">
          <mxGeometry height="2930" width="207.5" x="310" y="80" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-10" parent="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="360" width="30" x="75" y="120" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-2" parent="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="320" width="15" x="82.5" y="820" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-33" parent="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="240" width="25" x="77.5" y="1690" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-49" parent="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="380" width="30" x="85" y="2170" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-5" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":BookingSystem" vertex="1">
          <mxGeometry height="2930" width="180" x="590" y="80" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-11" parent="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="290" width="30" x="75" y="160" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-3" parent="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="280" width="15" x="80" y="830" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-23" parent="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="230" width="20" x="77.5" y="1360" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-34" parent="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="240" width="25" x="80" y="1710" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-50" parent="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="310" width="30" x="80" y="2200" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-6" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":EquipmentDatabase" vertex="1">
          <mxGeometry height="2930" width="180" x="870" y="80" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-12" parent="LfNKJZrtx-e5gq2OnKBV-6" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="160" width="30" x="75" y="190" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-51" parent="LfNKJZrtx-e5gq2OnKBV-6" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="120" width="30" x="75" y="2290" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-7" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":SensorSystem&lt;div&gt;&amp;lt;&amp;lt;external&amp;gt;&amp;gt;&lt;/div&gt;" vertex="1">
          <mxGeometry height="2920" width="180" x="1430" y="80" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-24" parent="LfNKJZrtx-e5gq2OnKBV-7" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="80" width="20" x="80" y="1380" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-8" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":PaymentSystem&lt;div&gt;&amp;lt;&amp;lt;external&amp;gt;&amp;gt;&lt;/div&gt;" vertex="1">
          <mxGeometry height="2930" width="180" x="1150" y="80" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-4" parent="LfNKJZrtx-e5gq2OnKBV-8" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="150" width="15" x="82.5" y="850" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-9" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":BookingDatabase" vertex="1">
          <mxGeometry height="2920" width="180" x="1710" y="80" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-5" parent="LfNKJZrtx-e5gq2OnKBV-9" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="80" width="10" x="80" y="940" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-26" parent="LfNKJZrtx-e5gq2OnKBV-9" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="80" width="10" x="85" y="1490" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-36" parent="LfNKJZrtx-e5gq2OnKBV-9" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="110" width="20" x="80" y="1770" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-14" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-3" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-10" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="150" y="210" />
            </Array>
            <mxPoint x="120" y="200" as="sourcePoint" />
            <mxPoint x="280" y="200" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-15" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-4" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-11" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="460" y="245" />
            </Array>
            <mxPoint x="470" y="280" as="sourcePoint" />
            <mxPoint x="520" y="280" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-17" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="750" y="270" />
            </Array>
            <mxPoint x="690" y="270" as="sourcePoint" />
            <mxPoint x="955" y="270" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-18" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-6" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="740" y="540" />
            </Array>
            <mxPoint x="680" y="540" as="sourcePoint" />
            <mxPoint x="945" y="540" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-19" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="470" y="520" />
            </Array>
            <mxPoint x="410" y="520" as="sourcePoint" />
            <mxPoint x="675" y="520" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-20" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="180" y="480" />
            </Array>
            <mxPoint x="120" y="480" as="sourcePoint" />
            <mxPoint x="385" y="480" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-21" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="4r: display(EquipmentCatalogue)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="200" y="440" as="sourcePoint" />
            <mxPoint x="120" y="440" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-22" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="4r: equipmentList">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="500" y="400" as="sourcePoint" />
            <mxPoint x="420" y="400" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-23" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-6" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-11" value="&lt;font&gt;4r: equipmentList[] (equipID, desc, location, status)&lt;/font&gt;">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="780" y="320" />
            </Array>
            <mxPoint x="770" y="360" as="sourcePoint" />
            <mxPoint x="690" y="360" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-24" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-6" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="7r: status = AVAILABLE&amp;nbsp;">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="760" y="600" as="sourcePoint" />
            <mxPoint x="680" y="600" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-26" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;fontSize=12;" value="alt" vertex="1">
          <mxGeometry height="130" width="1040" x="70" y="660" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-27" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="69.99666666666674" y="724.33" as="sourcePoint" />
            <mxPoint x="1110" y="724" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-28" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="7a:error(&#39;Equipment unavailable for selected time&#39;)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="689.5" y="690" as="sourcePoint" />
            <mxPoint x="410" y="690" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-29" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="7b: availabilityConfirmed(equipID, hourlyRate)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="699.5" y="760" as="sourcePoint" />
            <mxPoint x="420" y="760" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-32" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-3" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="310" y="840" />
            </Array>
            <mxPoint x="250" y="840" as="sourcePoint" />
            <mxPoint x="400" y="840" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-33" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;b&gt;&lt;u&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Section 1: Broswse &amp;amp; Reserve Equipment (Req3, Req4, Req8)&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="380" x="30" y="140" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-34" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;1: BrowseEquipment(labLocation, EquipmentType)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="300" x="90" y="170" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-35" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;4:selectEquipment(equipID) + provideStudentID(SID)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="430" x="40" y="450" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-36" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;2: searchAvailableEquipment&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="200" x="440" y="210" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-37" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;5:checkEquipmentAvailability(equipID, startTime, endTime)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="390" x="345" y="490" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-38" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;3: queryAvailablleEquipment(filters)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="220" x="710" y="240" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-39" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;6: getEquipmentStatus(equipID)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="190" x="725" y="510" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-40" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="[equipment not available]" vertex="1">
          <mxGeometry height="30" width="210" x="100" y="660" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-41" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="equipment AVAILABLE" vertex="1">
          <mxGeometry height="30" width="130" x="200" y="700" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-43" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;8: confirmReservation(equipID, startTime, endTime)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="350" x="90" y="810" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-1" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;b&gt;&lt;u&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Section 2 - Pay Deposit Flow (Req4, Req10)&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="270" y="860" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-6" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-3" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="OIFvRv84QuahlJDP0eki-2" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="360" y="940" />
              <mxPoint x="280" y="950" />
            </Array>
            <mxPoint x="120" y="1000" as="sourcePoint" />
            <mxPoint x="280" y="1000" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-7" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;10: selectPayment(CREDIT| DEBIT| YUCARD)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="280" x="115" y="910" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-8" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-5" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="660" y="910" />
            </Array>
            <mxPoint x="395.00034482758605" y="900" as="sourcePoint" />
            <mxPoint x="530" y="890" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-60" connectable="0" parent="OIFvRv84QuahlJDP0eki-8" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontFamily=Times New Roman;fontSize=12;" value="9: calculateDeposit(userType, hourlyRate)" vertex="1">
          <mxGeometry relative="1" x="-0.7329" y="9" as="geometry">
            <mxPoint x="107" y="-1" as="offset" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-9" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;10r: depositAmount(Student=$10, Faculty=$15, Researcher=$20, Guest = $30&lt;/font&gt;">
          <mxGeometry relative="1" y="-10" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="461.25" y="940" />
            </Array>
            <mxPoint x="671.25" y="940" as="sourcePoint" />
            <mxPoint x="408.75" y="940" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-10" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="OIFvRv84QuahlJDP0eki-3" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="400" y="960" />
            </Array>
            <mxPoint x="400" y="960" as="sourcePoint" />
            <mxPoint x="560" y="970" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-11" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="OIFvRv84QuahlJDP0eki-4" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1240" y="980" />
            </Array>
            <mxPoint x="680" y="980" as="sourcePoint" />
            <mxPoint x="840" y="980" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-12" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;fontSize=12;" value="alt" vertex="1">
          <mxGeometry height="130" width="1040" x="320" y="1010" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-13" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="13a:paymentFailed(reason)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="1229.5000000000002" y="1040" as="sourcePoint" />
            <mxPoint x="680" y="1040" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-14" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="13b: paymentConfirmed(transactionID, amount)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="1234.7500000000002" y="1119.66" as="sourcePoint" />
            <mxPoint x="685.25" y="1119.66" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-15" edge="1" parent="1" source="OIFvRv84QuahlJDP0eki-12" style="endArrow=none;dashed=1;html=1;rounded=0;exitX=0;exitY=0.529;exitDx=0;exitDy=0;exitPerimeter=0;fontFamily=Times New Roman;fontSize=12;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="339.81034482758605" y="1079.66" as="sourcePoint" />
            <mxPoint x="1360" y="1079.66" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-16" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="13a2:error(&#39;Payment declined. Try again!&#39;)">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="466.5" y="1060" />
            </Array>
            <mxPoint x="676" y="1060" as="sourcePoint" />
            <mxPoint x="434" y="1060" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-18" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-9" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1750" y="1210" />
            </Array>
            <mxPoint x="680" y="1170" as="sourcePoint" />
            <mxPoint x="840" y="1170" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-19" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-9" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-5" value="15r: bookingID: String">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1020" y="1230" />
            </Array>
            <mxPoint x="1100" y="830" as="sourcePoint" />
            <mxPoint x="1020" y="830" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-20" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-4" value="15r: bookingConfirmed(bookingID, depositAmt, schedule)">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="510" y="1270" />
            </Array>
            <mxPoint x="790" y="830" as="sourcePoint" />
            <mxPoint x="710" y="830" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-21" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-3" value="15r: display(&#39;Booking confirmed. BookingID returned&#39;)">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="260" y="1300" />
            </Array>
            <mxPoint x="790" y="830" as="sourcePoint" />
            <mxPoint x="710" y="830" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-22" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;b&gt;&lt;u&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Section 3- Deposit Forfeit on No-Show (Req4)&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="290" x="10" y="1340" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-25" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;fontSize=12;" value="opt" vertex="1">
          <mxGeometry height="150" width="1370" x="570" y="1490" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-27" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-7" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" target="OIFvRv84QuahlJDP0eki-23" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1360" y="1445" />
            </Array>
            <mxPoint x="1130" y="1450" as="sourcePoint" />
            <mxPoint x="980" y="1450" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-28" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1695" y="1540" />
            </Array>
            <mxPoint x="705" y="1530" as="sourcePoint" />
            <mxPoint x="1805" y="1530" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-29" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1695" y="1590" />
            </Array>
            <mxPoint x="705" y="1580" as="sourcePoint" />
            <mxPoint x="1805" y="1580" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-30" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="18r: updated">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1035.5" y="1620" />
            </Array>
            <mxPoint x="1815.5" y="1620" as="sourcePoint" />
            <mxPoint x="694.5" y="1620" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-31" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;notify(userID, &#39;Deposit forfeited:no-show after 20 min&#39;)&lt;/font&gt;">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="680.27" y="1670" as="sourcePoint" />
            <mxPoint x="399.73153846153855" y="1670" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-32" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;b&gt;&lt;u&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Section 4 - Modify / Cancel Booking (Req8)&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="290" x="-25" y="1710" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-35" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;curved=0;fontFamily=Times New Roman;fontSize=12;" value="">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="618.75" y="1800" />
              <mxPoint x="618.75" y="1800" />
            </Array>
            <mxPoint x="411.2500000000002" y="1800" as="sourcePoint" />
            <mxPoint x="668.75" y="1800" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-37" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="OIFvRv84QuahlJDP0eki-33" value="21r:bookingStartTime &amp;gt; now -&amp;gt; modifiable">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="520" y="1870" />
            </Array>
            <mxPoint x="790" y="1730" as="sourcePoint" />
            <mxPoint x="710" y="1730" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-40" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-3" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="130" y="1800" />
            </Array>
            <mxPoint x="235" y="1780" as="sourcePoint" />
            <mxPoint x="395" y="1780" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-41" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;fontSize=12;" value="alt" vertex="1">
          <mxGeometry height="190" width="1940" x="30" y="1910" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-42" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;startArrow=none;startFill=0;endSize=6;startSize=10;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1700.25" y="1960" />
            </Array>
            <mxPoint x="690.25" y="1960" as="sourcePoint" />
            <mxPoint x="1789.75" y="1960" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-43" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;startArrow=none;startFill=0;endSize=6;startSize=10;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1700.25" y="2040" />
            </Array>
            <mxPoint x="690.25" y="2040" as="sourcePoint" />
            <mxPoint x="1789.75" y="2040" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-44" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;startArrow=none;startFill=0;endSize=6;startSize=10;rounded=0;dashed=1;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1565.25" y="2000" />
            </Array>
            <mxPoint x="1784.75" y="2000" as="sourcePoint" />
            <mxPoint x="695.25" y="2000" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-45" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <Array as="points">
              <mxPoint x="300" y="2040" />
            </Array>
            <mxPoint x="690" y="2040" as="sourcePoint" />
            <mxPoint x="30" y="2040" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-47" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="21a2:modifyConfirmed(bookingID, newSchedule)">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="527" y="2020" />
            </Array>
            <mxPoint x="687" y="2020" as="sourcePoint" />
            <mxPoint x="420" y="2020" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-48" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;startArrow=none;startFill=0;endSize=6;startSize=10;rounded=0;dashed=1;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1560" y="2080" />
            </Array>
            <mxPoint x="1779.5" y="2080" as="sourcePoint" />
            <mxPoint x="690" y="2080" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-52" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-4" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="440" y="2270" />
            </Array>
            <mxPoint x="520" y="2280" as="sourcePoint" />
            <mxPoint x="680" y="2280" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-53" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-3" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="130" y="2260" />
            </Array>
            <mxPoint x="240" y="2250" as="sourcePoint" />
            <mxPoint x="400" y="2250" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-55" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-6" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="900" y="2300" />
            </Array>
            <mxPoint x="700" y="2380" as="sourcePoint" />
            <mxPoint x="860" y="2380" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-56" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="26r: noConflict: Boolean">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="955" y="2410" as="sourcePoint" />
            <mxPoint x="695.5" y="2410" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-59" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;b&gt;&lt;u&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Section 5 - Extend Reservation (Req9)&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="250" x="-20" y="2170" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-64" parent="1" style="text;whiteSpace=wrap;fontSize=12;fontFamily=Times New Roman;" value="11: initiatePayment(depositAmt, paymentMethod, userID)" vertex="1">
          <mxGeometry height="20" width="220" x="440" y="940" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-66" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;12: processPayment(depositAmt, paymentDetails)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="270" x="685" y="950" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-67" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;[payment DECLINED]&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="120" x="370" y="1010" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-69" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="payment SUCCESS" vertex="1">
          <mxGeometry height="20" width="110" x="420" y="1060" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-70" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="14: createBookingRecord(userID, equipID, startTime, depositPaid)" vertex="1">
          <mxGeometry height="30" width="380" x="1065" y="1140" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-71" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="15: reportUsageStatus(equipID, bookingID, arrivalDetected=FALSE)" vertex="1">
          <mxGeometry height="30" width="440" x="1010" y="1410" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-73" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="arrivalDetected=FALSE AND elapsed &amp;gt; 20 min" vertex="1">
          <mxGeometry height="30" width="260" x="710" y="1500" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-74" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="16:updateDeposit(bookingID, status=&#39;FORFEITED&#39;)" vertex="1">
          <mxGeometry height="30" width="320" x="1170" y="1500" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-77" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="17: markBookingNoShow(bookingID)" vertex="1">
          <mxGeometry height="30" width="250" x="1205" y="1550" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-78" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="19: modifyOrCancelBooking(bookingID, action)" vertex="1">
          <mxGeometry height="30" width="265" x="115" y="1750" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-80" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="20: validateBookingModifiable(bookingID)" vertex="1">
          <mxGeometry height="30" width="235" x="425" y="1770" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-81" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="[action = MODIFY]" vertex="1">
          <mxGeometry height="30" width="110" x="90" y="1910" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-82" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="action = CANCEL" vertex="1">
          <mxGeometry height="30" width="110" x="170" y="2010" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-83" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="21a: updateBooking(bookingID, newStartTime, newEndTime)" vertex="1">
          <mxGeometry height="30" width="460" x="960" y="1930" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-84" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="21a_r: updated" vertex="1">
          <mxGeometry height="30" width="355" x="1065" y="1970" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-85" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="21b: cancelBooking(bookingID)" vertex="1">
          <mxGeometry height="30" width="370" x="1060" y="2010" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-86" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="21b_r: cancelled + refundDeposit" vertex="1">
          <mxGeometry height="30" width="200" x="1150" y="2050" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-87" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-3" value="22: display(&#39;Booking Updated Successfully&#39;)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="410" y="2150" as="sourcePoint" />
            <mxPoint x="330" y="2150" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-88" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;fontSize=12;" value="alt" vertex="1">
          <mxGeometry height="230" width="1940" x="50" y="2430" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-89" edge="1" parent="1" source="OIFvRv84QuahlJDP0eki-88" style="endArrow=none;dashed=1;html=1;rounded=0;exitX=-0.002;exitY=0.519;exitDx=0;exitDy=0;exitPerimeter=0;fontFamily=Times New Roman;fontSize=12;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="70.00333333333349" y="2544.17" as="sourcePoint" />
            <mxPoint x="2001.17" y="2544.17" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-90" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;26a: error(Cannot extend - equipment booked immediately after)&lt;/font&gt;">
          <mxGeometry relative="1" x="-0.01" y="-10" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="557.42" y="2480" />
            </Array>
            <mxPoint x="677.42" y="2480" as="sourcePoint" />
            <mxPoint x="420.0033333333335" y="2480" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-91" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="26b2: extensionConfirmed(newEndTime, additionalCharge)">
          <mxGeometry relative="1" x="-0.01" y="-10" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="557.4166666666665" y="2610" />
            </Array>
            <mxPoint x="677.4166666666665" y="2610" as="sourcePoint" />
            <mxPoint x="420" y="2610" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-92" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="26b_r: extensionConfirmed">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="1809.499999999999" y="2580" as="sourcePoint" />
            <mxPoint x="710" y="2580" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-93" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1750" y="2620" />
            </Array>
            <mxPoint x="710" y="2630" as="sourcePoint" />
            <mxPoint x="1819.499999999999" y="2630" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-94" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-3" value="27: display(Reservation extended. New end time set. Extra charge applied.)">
          <mxGeometry relative="1" x="-0.0223" y="-10" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="240" y="2730" />
            </Array>
            <mxPoint x="750" y="2540" as="sourcePoint" />
            <mxPoint x="670" y="2540" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-95" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="23: requestExtension(bookingID, additionalHours)" vertex="1">
          <mxGeometry height="30" width="340" x="90" y="2220" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-96" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;24: checkPostBookingAvailability(equipID, newEndTime)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="320" x="390" y="2250" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-97" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="25: querySchedule(equipID, newEndTime)" vertex="1">
          <mxGeometry height="30" width="240" x="700" y="2350" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-98" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="[equipment NOT free after current booking]" vertex="1">
          <mxGeometry height="30" width="260" x="100" y="2430" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-99" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="equipment IS free" vertex="1">
          <mxGeometry height="30" width="110" x="210" y="2520" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-100" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="26b: extendBooking(bookingID, newEndTime)" vertex="1">
          <mxGeometry height="30" width="250" x="1180" y="2600" as="geometry" />
        </mxCell>
        <mxCell id="yv6fUaxiGDH0A_wUmKmq-1" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="&lt;font face=&quot;Times New Roman&quot; style=&quot;font-size: 19px;&quot;&gt;Equipment Reservation &amp;amp; Payment&lt;/font&gt;&lt;div&gt;&lt;font face=&quot;Times New Roman&quot; style=&quot;font-size: 19px;&quot;&gt;[Req3, Req4, Req8, Req9, Req10] - Browse &amp;amp; Reserve | Pay Deposit | Deposit Forfeit&lt;/font&gt;&lt;/div&gt;" vertex="1">
          <mxGeometry height="40" width="980" x="510" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>


================================================
FILE: D1/Sequence Diagram/sequence3.drawio
================================================
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36" version="29.6.0">
  <diagram name="Page-1" id="2YBvvXClWsGukQMizWep">
    <mxGraphModel dx="2533" dy="1150" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-3" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":User (Student/Faculty/ Researcher/Guest" vertex="1">
          <mxGeometry height="2940" width="180" x="30" y="80" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-4" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":BookingUI" vertex="1">
          <mxGeometry height="2930" width="207.5" x="310" y="80" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-10" parent="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="360" width="30" x="75" y="120" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-2" parent="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="320" width="15" x="82.5" y="820" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-33" parent="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="240" width="25" x="77.5" y="1690" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-49" parent="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="380" width="30" x="85" y="2170" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-5" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":BookingSystem" vertex="1">
          <mxGeometry height="2930" width="180" x="590" y="80" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-11" parent="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="290" width="30" x="75" y="160" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-3" parent="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="280" width="15" x="80" y="830" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-23" parent="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="230" width="20" x="77.5" y="1360" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-34" parent="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="240" width="25" x="80" y="1710" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-50" parent="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="310" width="30" x="80" y="2200" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-6" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":EquipmentDatabase" vertex="1">
          <mxGeometry height="2930" width="180" x="870" y="80" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-12" parent="LfNKJZrtx-e5gq2OnKBV-6" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="160" width="30" x="75" y="190" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-51" parent="LfNKJZrtx-e5gq2OnKBV-6" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="120" width="30" x="75" y="2290" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-7" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":SensorSystem&lt;div&gt;&amp;lt;&amp;lt;external&amp;gt;&amp;gt;&lt;/div&gt;" vertex="1">
          <mxGeometry height="2920" width="180" x="1430" y="80" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-24" parent="LfNKJZrtx-e5gq2OnKBV-7" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="80" width="20" x="80" y="1380" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-8" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":PaymentSystem&lt;div&gt;&amp;lt;&amp;lt;external&amp;gt;&amp;gt;&lt;/div&gt;" vertex="1">
          <mxGeometry height="2930" width="180" x="1150" y="80" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-4" parent="LfNKJZrtx-e5gq2OnKBV-8" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="150" width="15" x="82.5" y="850" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-9" parent="1" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value=":BookingDatabase" vertex="1">
          <mxGeometry height="2920" width="180" x="1710" y="80" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-5" parent="LfNKJZrtx-e5gq2OnKBV-9" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="80" width="10" x="80" y="940" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-26" parent="LfNKJZrtx-e5gq2OnKBV-9" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="80" width="10" x="85" y="1490" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-36" parent="LfNKJZrtx-e5gq2OnKBV-9" style="html=1;points=[[0,0,0,0,5],[0,1,0,0,-5],[1,0,0,0,5],[1,1,0,0,-5]];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;curved&quot;:0,&quot;rounded&quot;:0};fontFamily=Times New Roman;fontSize=12;" value="" vertex="1">
          <mxGeometry height="110" width="20" x="80" y="1770" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-14" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-3" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-10" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="150" y="210" />
            </Array>
            <mxPoint x="120" y="200" as="sourcePoint" />
            <mxPoint x="280" y="200" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-15" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-4" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-11" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="460" y="245" />
            </Array>
            <mxPoint x="470" y="280" as="sourcePoint" />
            <mxPoint x="520" y="280" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-17" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="750" y="270" />
            </Array>
            <mxPoint x="690" y="270" as="sourcePoint" />
            <mxPoint x="955" y="270" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-18" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-6" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="740" y="540" />
            </Array>
            <mxPoint x="680" y="540" as="sourcePoint" />
            <mxPoint x="945" y="540" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-19" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="470" y="520" />
            </Array>
            <mxPoint x="410" y="520" as="sourcePoint" />
            <mxPoint x="675" y="520" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-20" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="180" y="480" />
            </Array>
            <mxPoint x="120" y="480" as="sourcePoint" />
            <mxPoint x="385" y="480" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-21" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="4r: display(EquipmentCatalogue)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="200" y="440" as="sourcePoint" />
            <mxPoint x="120" y="440" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-22" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="4r: equipmentList">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="500" y="400" as="sourcePoint" />
            <mxPoint x="420" y="400" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-23" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-6" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-11" value="&lt;font&gt;4r: equipmentList[] (equipID, desc, location, status)&lt;/font&gt;">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="780" y="320" />
            </Array>
            <mxPoint x="770" y="360" as="sourcePoint" />
            <mxPoint x="690" y="360" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-24" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-6" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="7r: status = AVAILABLE&amp;nbsp;">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="760" y="600" as="sourcePoint" />
            <mxPoint x="680" y="600" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-26" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;fontSize=12;" value="alt" vertex="1">
          <mxGeometry height="130" width="1040" x="70" y="660" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-27" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="69.99666666666674" y="724.33" as="sourcePoint" />
            <mxPoint x="1110" y="724" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-28" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="7a:error(&#39;Equipment unavailable for selected time&#39;)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="689.5" y="690" as="sourcePoint" />
            <mxPoint x="410" y="690" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-29" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="7b: availabilityConfirmed(equipID, hourlyRate)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="699.5" y="760" as="sourcePoint" />
            <mxPoint x="420" y="760" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-32" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-3" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="310" y="840" />
            </Array>
            <mxPoint x="250" y="840" as="sourcePoint" />
            <mxPoint x="400" y="840" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-33" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;b&gt;&lt;u&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Section 1: Broswse &amp;amp; Reserve Equipment (Req3, Req4, Req8)&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="380" x="30" y="140" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-34" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;1: BrowseEquipment(labLocation, EquipmentType)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="300" x="90" y="170" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-35" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;4:selectEquipment(equipID) + provideStudentID(SID)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="430" x="40" y="450" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-36" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;2: searchAvailableEquipment&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="200" x="440" y="210" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-37" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;5:checkEquipmentAvailability(equipID, startTime, endTime)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="390" x="345" y="490" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-38" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;3: queryAvailablleEquipment(filters)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="220" x="710" y="240" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-39" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;6: getEquipmentStatus(equipID)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="190" x="725" y="510" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-40" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="[equipment not available]" vertex="1">
          <mxGeometry height="30" width="210" x="100" y="660" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-41" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="equipment AVAILABLE" vertex="1">
          <mxGeometry height="30" width="130" x="200" y="700" as="geometry" />
        </mxCell>
        <mxCell id="LfNKJZrtx-e5gq2OnKBV-43" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;8: confirmReservation(equipID, startTime, endTime)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="350" x="90" y="810" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-1" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;b&gt;&lt;u&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Section 2 - Pay Deposit Flow (Req4, Req10)&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="270" y="860" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-6" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-3" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="OIFvRv84QuahlJDP0eki-2" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="360" y="940" />
              <mxPoint x="280" y="950" />
            </Array>
            <mxPoint x="120" y="1000" as="sourcePoint" />
            <mxPoint x="280" y="1000" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-7" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;10: selectPayment(CREDIT| DEBIT| YUCARD)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="280" x="115" y="910" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-8" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-5" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="660" y="910" />
            </Array>
            <mxPoint x="395.00034482758605" y="900" as="sourcePoint" />
            <mxPoint x="530" y="890" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-60" connectable="0" parent="OIFvRv84QuahlJDP0eki-8" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontFamily=Times New Roman;fontSize=12;" value="9: calculateDeposit(userType, hourlyRate)" vertex="1">
          <mxGeometry relative="1" x="-0.7329" y="9" as="geometry">
            <mxPoint x="107" y="-1" as="offset" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-9" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;10r: depositAmount(Student=$10, Faculty=$15, Researcher=$20, Guest = $30&lt;/font&gt;">
          <mxGeometry relative="1" y="-10" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="461.25" y="940" />
            </Array>
            <mxPoint x="671.25" y="940" as="sourcePoint" />
            <mxPoint x="408.75" y="940" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-10" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="OIFvRv84QuahlJDP0eki-3" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="400" y="960" />
            </Array>
            <mxPoint x="400" y="960" as="sourcePoint" />
            <mxPoint x="560" y="970" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-11" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="OIFvRv84QuahlJDP0eki-4" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1240" y="980" />
            </Array>
            <mxPoint x="680" y="980" as="sourcePoint" />
            <mxPoint x="840" y="980" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-12" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;fontSize=12;" value="alt" vertex="1">
          <mxGeometry height="130" width="1040" x="320" y="1010" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-13" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="13a:paymentFailed(reason)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="1229.5000000000002" y="1040" as="sourcePoint" />
            <mxPoint x="680" y="1040" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-14" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="13b: paymentConfirmed(transactionID, amount)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="1234.7500000000002" y="1119.66" as="sourcePoint" />
            <mxPoint x="685.25" y="1119.66" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-15" edge="1" parent="1" source="OIFvRv84QuahlJDP0eki-12" style="endArrow=none;dashed=1;html=1;rounded=0;exitX=0;exitY=0.529;exitDx=0;exitDy=0;exitPerimeter=0;fontFamily=Times New Roman;fontSize=12;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="339.81034482758605" y="1079.66" as="sourcePoint" />
            <mxPoint x="1360" y="1079.66" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-16" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="13a2:error(&#39;Payment declined. Try again!&#39;)">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="466.5" y="1060" />
            </Array>
            <mxPoint x="676" y="1060" as="sourcePoint" />
            <mxPoint x="434" y="1060" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-18" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-9" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1750" y="1210" />
            </Array>
            <mxPoint x="680" y="1170" as="sourcePoint" />
            <mxPoint x="840" y="1170" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-19" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-9" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-5" value="15r: bookingID: String">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1020" y="1230" />
            </Array>
            <mxPoint x="1100" y="830" as="sourcePoint" />
            <mxPoint x="1020" y="830" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-20" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-4" value="15r: bookingConfirmed(bookingID, depositAmt, schedule)">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="510" y="1270" />
            </Array>
            <mxPoint x="790" y="830" as="sourcePoint" />
            <mxPoint x="710" y="830" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-21" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-3" value="15r: display(&#39;Booking confirmed. BookingID returned&#39;)">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="260" y="1300" />
            </Array>
            <mxPoint x="790" y="830" as="sourcePoint" />
            <mxPoint x="710" y="830" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-22" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;b&gt;&lt;u&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Section 3- Deposit Forfeit on No-Show (Req4)&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="290" x="10" y="1340" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-25" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;fontSize=12;" value="opt" vertex="1">
          <mxGeometry height="150" width="1370" x="570" y="1490" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-27" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-7" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=5;entryPerimeter=0;fontFamily=Times New Roman;" target="OIFvRv84QuahlJDP0eki-23" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1360" y="1445" />
            </Array>
            <mxPoint x="1130" y="1450" as="sourcePoint" />
            <mxPoint x="980" y="1450" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-28" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1695" y="1540" />
            </Array>
            <mxPoint x="705" y="1530" as="sourcePoint" />
            <mxPoint x="1805" y="1530" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-29" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1695" y="1590" />
            </Array>
            <mxPoint x="705" y="1580" as="sourcePoint" />
            <mxPoint x="1805" y="1580" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-30" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="18r: updated">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1035.5" y="1620" />
            </Array>
            <mxPoint x="1815.5" y="1620" as="sourcePoint" />
            <mxPoint x="694.5" y="1620" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-31" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;notify(userID, &#39;Deposit forfeited:no-show after 20 min&#39;)&lt;/font&gt;">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="680.27" y="1670" as="sourcePoint" />
            <mxPoint x="399.73153846153855" y="1670" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-32" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;b&gt;&lt;u&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Section 4 - Modify / Cancel Booking (Req8)&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="290" x="-25" y="1710" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-35" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;curved=0;fontFamily=Times New Roman;fontSize=12;" value="">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="618.75" y="1800" />
              <mxPoint x="618.75" y="1800" />
            </Array>
            <mxPoint x="411.2500000000002" y="1800" as="sourcePoint" />
            <mxPoint x="668.75" y="1800" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-37" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-5" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="OIFvRv84QuahlJDP0eki-33" value="21r:bookingStartTime &amp;gt; now -&amp;gt; modifiable">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="520" y="1870" />
            </Array>
            <mxPoint x="790" y="1730" as="sourcePoint" />
            <mxPoint x="710" y="1730" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-40" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-3" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="130" y="1800" />
            </Array>
            <mxPoint x="235" y="1780" as="sourcePoint" />
            <mxPoint x="395" y="1780" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-41" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;fontSize=12;" value="alt" vertex="1">
          <mxGeometry height="190" width="1940" x="30" y="1910" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-42" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;startArrow=none;startFill=0;endSize=6;startSize=10;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1700.25" y="1960" />
            </Array>
            <mxPoint x="690.25" y="1960" as="sourcePoint" />
            <mxPoint x="1789.75" y="1960" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-43" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;startArrow=none;startFill=0;endSize=6;startSize=10;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1700.25" y="2040" />
            </Array>
            <mxPoint x="690.25" y="2040" as="sourcePoint" />
            <mxPoint x="1789.75" y="2040" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-44" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;startArrow=none;startFill=0;endSize=6;startSize=10;rounded=0;dashed=1;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1565.25" y="2000" />
            </Array>
            <mxPoint x="1784.75" y="2000" as="sourcePoint" />
            <mxPoint x="695.25" y="2000" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-45" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <Array as="points">
              <mxPoint x="300" y="2040" />
            </Array>
            <mxPoint x="690" y="2040" as="sourcePoint" />
            <mxPoint x="30" y="2040" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-47" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="21a2:modifyConfirmed(bookingID, newSchedule)">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="527" y="2020" />
            </Array>
            <mxPoint x="687" y="2020" as="sourcePoint" />
            <mxPoint x="420" y="2020" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-48" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;startArrow=none;startFill=0;endSize=6;startSize=10;rounded=0;dashed=1;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1560" y="2080" />
            </Array>
            <mxPoint x="1779.5" y="2080" as="sourcePoint" />
            <mxPoint x="690" y="2080" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-52" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-4" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="440" y="2270" />
            </Array>
            <mxPoint x="520" y="2280" as="sourcePoint" />
            <mxPoint x="680" y="2280" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-53" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-3" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="130" y="2260" />
            </Array>
            <mxPoint x="240" y="2250" as="sourcePoint" />
            <mxPoint x="400" y="2250" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-55" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" target="LfNKJZrtx-e5gq2OnKBV-6" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="900" y="2300" />
            </Array>
            <mxPoint x="700" y="2380" as="sourcePoint" />
            <mxPoint x="860" y="2380" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-56" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="26r: noConflict: Boolean">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="955" y="2410" as="sourcePoint" />
            <mxPoint x="695.5" y="2410" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-59" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;b&gt;&lt;u&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Section 5 - Extend Reservation (Req9)&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;" vertex="1">
          <mxGeometry height="30" width="250" x="-20" y="2170" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-64" parent="1" style="text;whiteSpace=wrap;fontSize=12;fontFamily=Times New Roman;" value="11: initiatePayment(depositAmt, paymentMethod, userID)" vertex="1">
          <mxGeometry height="20" width="220" x="440" y="940" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-66" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;12: processPayment(depositAmt, paymentDetails)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="270" x="685" y="950" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-67" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;[payment DECLINED]&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="120" x="370" y="1010" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-69" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="payment SUCCESS" vertex="1">
          <mxGeometry height="20" width="110" x="420" y="1060" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-70" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="14: createBookingRecord(userID, equipID, startTime, depositPaid)" vertex="1">
          <mxGeometry height="30" width="380" x="1065" y="1140" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-71" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="15: reportUsageStatus(equipID, bookingID, arrivalDetected=FALSE)" vertex="1">
          <mxGeometry height="30" width="440" x="1010" y="1410" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-73" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="arrivalDetected=FALSE AND elapsed &amp;gt; 20 min" vertex="1">
          <mxGeometry height="30" width="260" x="710" y="1500" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-74" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="16:updateDeposit(bookingID, status=&#39;FORFEITED&#39;)" vertex="1">
          <mxGeometry height="30" width="320" x="1170" y="1500" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-77" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="17: markBookingNoShow(bookingID)" vertex="1">
          <mxGeometry height="30" width="250" x="1205" y="1550" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-78" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="19: modifyOrCancelBooking(bookingID, action)" vertex="1">
          <mxGeometry height="30" width="265" x="115" y="1750" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-80" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="20: validateBookingModifiable(bookingID)" vertex="1">
          <mxGeometry height="30" width="235" x="425" y="1770" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-81" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="[action = MODIFY]" vertex="1">
          <mxGeometry height="30" width="110" x="90" y="1910" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-82" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="action = CANCEL" vertex="1">
          <mxGeometry height="30" width="110" x="170" y="2010" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-83" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="21a: updateBooking(bookingID, newStartTime, newEndTime)" vertex="1">
          <mxGeometry height="30" width="460" x="960" y="1930" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-84" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="21a_r: updated" vertex="1">
          <mxGeometry height="30" width="355" x="1065" y="1970" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-85" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="21b: cancelBooking(bookingID)" vertex="1">
          <mxGeometry height="30" width="370" x="1060" y="2010" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-86" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="21b_r: cancelled + refundDeposit" vertex="1">
          <mxGeometry height="30" width="200" x="1150" y="2050" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-87" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-3" value="22: display(&#39;Booking Updated Successfully&#39;)">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="410" y="2150" as="sourcePoint" />
            <mxPoint x="330" y="2150" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-88" parent="1" style="shape=umlFrame;whiteSpace=wrap;html=1;pointerEvents=0;fillStyle=auto;fillColor=default;gradientColor=none;shadow=0;swimlaneFillColor=default;fontFamily=Times New Roman;fontSize=12;" value="alt" vertex="1">
          <mxGeometry height="230" width="1940" x="50" y="2430" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-89" edge="1" parent="1" source="OIFvRv84QuahlJDP0eki-88" style="endArrow=none;dashed=1;html=1;rounded=0;exitX=-0.002;exitY=0.519;exitDx=0;exitDy=0;exitPerimeter=0;fontFamily=Times New Roman;fontSize=12;" value="">
          <mxGeometry height="50" relative="1" width="50" as="geometry">
            <mxPoint x="70.00333333333349" y="2544.17" as="sourcePoint" />
            <mxPoint x="2001.17" y="2544.17" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-90" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;26a: error(Cannot extend - equipment booked immediately after)&lt;/font&gt;">
          <mxGeometry relative="1" x="-0.01" y="-10" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="557.42" y="2480" />
            </Array>
            <mxPoint x="677.42" y="2480" as="sourcePoint" />
            <mxPoint x="420.0033333333335" y="2480" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-91" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="26b2: extensionConfirmed(newEndTime, additionalCharge)">
          <mxGeometry relative="1" x="-0.01" y="-10" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="557.4166666666665" y="2610" />
            </Array>
            <mxPoint x="677.4166666666665" y="2610" as="sourcePoint" />
            <mxPoint x="420" y="2610" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-92" edge="1" parent="1" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="26b_r: extensionConfirmed">
          <mxGeometry relative="1" as="geometry">
            <mxPoint x="1809.499999999999" y="2580" as="sourcePoint" />
            <mxPoint x="710" y="2580" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-93" edge="1" parent="1" style="edgeStyle=elbowEdgeStyle;fontSize=12;html=1;endArrow=blockThin;endFill=1;rounded=0;fontFamily=Times New Roman;" value="">
          <mxGeometry relative="1" width="160" as="geometry">
            <Array as="points">
              <mxPoint x="1750" y="2620" />
            </Array>
            <mxPoint x="710" y="2630" as="sourcePoint" />
            <mxPoint x="1819.499999999999" y="2630" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-94" edge="1" parent="1" source="LfNKJZrtx-e5gq2OnKBV-4" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;curved=0;rounded=0;fontFamily=Times New Roman;fontSize=12;" target="LfNKJZrtx-e5gq2OnKBV-3" value="27: display(Reservation extended. New end time set. Extra charge applied.)">
          <mxGeometry relative="1" x="-0.0223" y="-10" as="geometry">
            <mxPoint as="offset" />
            <Array as="points">
              <mxPoint x="240" y="2730" />
            </Array>
            <mxPoint x="750" y="2540" as="sourcePoint" />
            <mxPoint x="670" y="2540" as="targetPoint" />
          </mxGeometry>
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-95" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="23: requestExtension(bookingID, additionalHours)" vertex="1">
          <mxGeometry height="30" width="340" x="90" y="2220" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-96" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="&lt;font&gt;24: checkPostBookingAvailability(equipID, newEndTime)&lt;/font&gt;" vertex="1">
          <mxGeometry height="30" width="320" x="390" y="2250" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-97" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="25: querySchedule(equipID, newEndTime)" vertex="1">
          <mxGeometry height="30" width="240" x="700" y="2350" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-98" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="[equipment NOT free after current booking]" vertex="1">
          <mxGeometry height="30" width="260" x="100" y="2430" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-99" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="equipment IS free" vertex="1">
          <mxGeometry height="30" width="110" x="210" y="2520" as="geometry" />
        </mxCell>
        <mxCell id="OIFvRv84QuahlJDP0eki-100" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Times New Roman;fontSize=12;" value="26b: extendBooking(bookingID, newEndTime)" vertex="1">
          <mxGeometry height="30" width="250" x="1180" y="2600" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>


================================================
FILE: D2/.vscode/settings.json
================================================
{
  "java.project.referencedLibraries": [
    "lib/**/*.jar"
  ]
}

================================================
FILE: D2/data/bookings.csv
================================================
bookingID,userID,equipmentID,startTime,endTime,status,depositAmount,depositForfeited,paymentMethod,isExtended
B001,U001,EQ001,2026-03-20 09:00,2026-03-20 11:00,CONFIRMED,10.0,false,CREDIT,false
B002,U002,EQ004,2026-03-21 14:00,2026-03-21 16:00,CONFIRMED,15.0,false,INSTITUTIONAL,false


================================================
FILE: D2/data/equipment.csv
================================================
equipmentID,name,description,type,status,buildingName,roomNumber
EQ001,Oscilloscope,Digital oscilloscope 200MHz,Electronics,AVAILABLE,Lassonde,101
EQ002,3D Printer,FDM 3D printer,Fabrication,AVAILABLE,Bergeron,202
EQ003,Laser Cutter,CO2 laser cutter,Fabrication,MAINTENANCE,Lassonde,103
EQ004,Spectrometer,UV-Vis spectrometer,Optics,AVAILABLE,Petrie,305
EQ005,CNC Machine,3-axis CNC milling machine,Fabrication,DISABLED,Bergeron,204


================================================
FILE: D2/data/users.csv
================================================
userID,name,email,password,userType,staffID,status,department
U001,Alice Student,alice@yorku.ca,pass123,STUDENT,S12345,ACTIVE,Engineering
U002,Bob Faculty,bob@yorku.ca,pass123,FACULTY,F67890,ACTIVE,Science
U003,Carol Researcher,carol@yorku.ca,pass123,RESEARCHER,R11111,ACTIVE,Research
U004,Dave Guest,dave@example.com,pass123,GUEST,CERT-999,ACTIVE,External
M001,Manager Mike,manager@yorku.ca,manager123,MANAGER,MGR-001,ACTIVE,Engineering
C001,Coordinator Carol,coord@yorku.ca,coord123,COORDINATOR,COORD-001,ACTIVE,Administration
U1773892952781,shiah,shiah@gmail.com,Ilham123,STUDENT,123,PENDING,eecs
U1773922455105,Jane Doe,jane@yorku.ca,pass123,FACULTY,S12345,PENDING,Engineering


================================================
FILE: D2/src/Main.java
================================================
import javax.swing.SwingUtilities;
import gui.MainFrame;

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            MainFrame.getInstance().setVisible(true);
        });
    }
}


================================================
FILE: D2/src/data/.gitkeep
================================================


================================================
FILE: D2/src/data/BookingDAO.java
================================================
package data;

import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
import model.Reservation;

import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;

/**
 * BookingDAO - loads and saves reservations from/to bookings.csv
 * CSV columns: bookingID,userID,equipmentID,startTime,endTime,status,depositAmount,depositForfeited,paymentMethod,isExtended
 */
public class BookingDAO {

    private String path;
    private List<Reservation> bookings = new ArrayList<>();

    public BookingDAO(String path) {
        this.path = path;
    }

    public void load() throws Exception {
        bookings.clear();
        CsvReader reader = new CsvReader(path);
        reader.readHeaders();

        while (reader.readRecord()) {
            Reservation r = new Reservation();
            r.setBookingID(reader.get("bookingID"));
            r.setUserID(reader.get("userID"));
            r.setEquipmentID(reader.get("equipmentID"));
            r.setStartTime(reader.get("startTime"));
            r.setEndTime(reader.get("endTime"));
            r.setStatus(reader.get("status"));
            r.setDepositAmount(Double.parseDouble(reader.get("depositAmount")));
            r.setDepositForfeited(Boolean.parseBoolean(reader.get("depositForfeited")));
            r.setPaymentMethod(reader.get("paymentMethod"));
            r.setExtended(Boolean.parseBoolean(reader.get("isExtended")));
            bookings.add(r);
        }
        reader.close();
    }

    public void save() throws Exception {
        CsvWriter writer = new CsvWriter(new FileWriter(path, false), ',');

        writer.write("bookingID");
        writer.write("userID");
        writer.write("equipmentID");
        writer.write("startTime");
        writer.write("endTime");
        writer.write("status");
        writer.write("depositAmount");
        writer.write("depositForfeited");
        writer.write("paymentMethod");
        writer.write("isExtended");
        writer.endRecord();

        for (Reservation r : bookings) {
            writer.write(r.getBookingID());
            writer.write(r.getUserID());
            writer.write(r.getEquipmentID());
            writer.write(r.getStartTime());
            writer.write(r.getEndTime());
            writer.write(r.getStatus());
            writer.write(String.valueOf(r.getDepositAmount()));
            writer.write(String.valueOf(r.isDepositForfeited()));
            writer.write(r.getPaymentMethod());
            writer.write(String.valueOf(r.isExtended()));
            writer.endRecord();
        }
        writer.close();
    }

    public void addBooking(Reservation r) {
        bookings.add(r);
    }

    public Reservation findByID(String bookingID) {
        for (Reservation r : bookings) {
            if (r.getBookingID().equals(bookingID)) return r;
        }
        return null;
    }

    public List<Reservation> getBookingsByUser(String userID) {
        List<Reservation> result = new ArrayList<>();
        for (Reservation r : bookings) {
            if (r.getUserID().equals(userID)) result.add(r);
        }
        return result;
    }

    public List<Reservation> getBookingsByEquipment(String equipmentID) {
        List<Reservation> result = new ArrayList<>();
        for (Reservation r : bookings) {
            if (r.getEquipmentID().equals(equipmentID)) result.add(r);
        }
        return result;
    }

    public List<Reservation> getAllBookings() {
        return bookings;
    }

    public void updateBooking(Reservation updated) {
        for (int i = 0; i < bookings.size(); i++) {
            if (bookings.get(i).getBookingID().equals(updated.getBookingID())) {
                bookings.set(i, updated);
                return;
            }
        }
    }
}


================================================
FILE: D2/src/data/EquipmentDAO.java
================================================
package data;

import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
import model.Equipment;

import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;

/**
 * EquipmentDAO - loads and saves equipment from/to equipment.csv
 * CSV columns: equipmentID,name,description,type,status,buildingName,roomNumber
 */
public class EquipmentDAO {

    private String path;
    private List<Equipment> equipmentList = new ArrayList<>();

    public EquipmentDAO(String path) {
        this.path = path;
    }

    public void load() throws Exception {
        equipmentList.clear();
        CsvReader reader = new CsvReader(path);
        reader.readHeaders();

        while (reader.readRecord()) {
            Equipment e = new Equipment();
            e.setEquipmentID(reader.get("equipmentID"));
            e.setName(reader.get("name"));
            e.setDescription(reader.get("description"));
            e.setType(reader.get("type"));
            e.setStatus(reader.get("status"));
            e.setBuildingName(reader.get("buildingName"));
            e.setRoomNumber(reader.get("roomNumber"));
            equipmentList.add(e);
        }
        reader.close();
    }

    public void save() throws Exception {
        CsvWriter writer = new CsvWriter(new FileWriter(path, false), ',');

        writer.write("equipmentID");
        writer.write("name");
        writer.write("description");
        writer.write("type");
        writer.write("status");
        writer.write("buildingName");
        writer.write("roomNumber");
        writer.endRecord();

        for (Equipment e : equipmentList) {
            writer.write(e.getEquipmentID());
            writer.write(e.getName());
            writer.write(e.getDescription());
            writer.write(e.getType());
            writer.write(e.getStatus());
            writer.write(e.getBuildingName());
            writer.write(e.getRoomNumber());
            writer.endRecord();
        }
        writer.close();
    }

    public void addEquipment(Equipment e) {
        equipmentList.add(e);
    }

    public Equipment findByID(String equipmentID) {
        for (Equipment e : equipmentList) {
            if (e.getEquipmentID().equals(equipmentID)) return e;
        }
        return null;
    }

    public List<Equipment> getAllEquipment() {
        return equipmentList;
    }

    public List<Equipment> getAvailableEquipment() {
        List<Equipment> available = new ArrayList<>();
        for (Equipment e : equipmentList) {
            if (e.isAvailable()) available.add(e);
        }
        return available;
    }

    public void updateEquipment(Equipment updated) {
        for (int i = 0; i < equipmentList.size(); i++) {
            if (equipmentList.get(i).getEquipmentID().equals(updated.getEquipmentID())) {
                equipmentList.set(i, updated);
                return;
            }
        }
    }
}


================================================
FILE: D2/src/data/UserDAO.java
================================================
package data;

import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
import model.*;

import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;

/**
 * UserDAO - loads and saves users from/to users.csv
 * CSV columns: userID,name,email,password,userType,staffID,status,department
 */
public class UserDAO {

    private String path;
    private List<User> users = new ArrayList<>();

    public UserDAO(String path) {
        this.path = path;
    }

    public void load() throws Exception {
        users.clear();
        CsvReader reader = new CsvReader(path);
        reader.readHeaders();

        while (reader.readRecord()) {
            String userType = reader.get("userType");
            User user = createUser(userType);

            user.setUserID(reader.get("userID"));
            user.setName(reader.get("name"));
            user.setEmail(reader.get("email"));
            user.setPassword(reader.get("password"));
            user.setUserType(userType);
            user.setStaffID(reader.get("staffID"));
            user.setStatus(reader.get("status"));
            user.setDepartment(reader.get("department"));

            users.add(user);
        }
        reader.close();
    }

    public void save() throws Exception {
        CsvWriter writer = new CsvWriter(new FileWriter(path, false), ',');

        // Write headers
        writer.write("userID");
        writer.write("name");
        writer.write("email");
        writer.write("password");
        writer.write("userType");
        writer.write("staffID");
        writer.write("status");
        writer.write("department");
        writer.endRecord();

        // Write each user
        for (User u : users) {
            writer.write(u.getUserID());
            writer.write(u.getName());
            writer.write(u.getEmail());
            writer.write(u.getPassword());
            writer.write(u.getUserType());
            writer.write(u.getStaffID());
            writer.write(u.getStatus());
            writer.write(u.getDepartment());
            writer.endRecord();
        }
        writer.close();
    }

    public void addUser(User user) {
        users.add(user);
    }

    public User findByEmail(String email) {
        for (User u : users) {
            if (u.getEmail().equalsIgnoreCase(email)) return u;
        }
        return null;
    }

    public User findByID(String userID) {
        for (User u : users) {
            if (u.getUserID().equals(userID)) return u;
        }
        return null;
    }

    public boolean emailExists(String email) {
        return findByEmail(email) != null;
    }

    public List<User> getAllUsers() {
        return users;
    }

    public void updateUser(User updated) {
        for (int i = 0; i < users.size(); i++) {
            if (users.get(i).getUserID().equals(updated.getUserID())) {
                users.set(i, updated);
                return;
            }
        }
    }

    // Factory helper - creates the right subclass based on userType string
    private User createUser(String userType) {
        switch (userType.toUpperCase()) {
            case "STUDENT":    return new Student();
            case "FACULTY":    return new Faculty();
            case "RESEARCHER": return new Researcher();
            case "GUEST":      return new Guest();
            case "MANAGER":    return new LabManager();
            case "COORDINATOR": return new HeadLabCoordinator();
            default:           return new Student();
        }
    }
}


================================================
FILE: D2/src/gui/.gitkeep
================================================


================================================
FILE: D2/src/gui/CoordinatorDashboardPanel.java
================================================
package gui;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import data.UserDAO;
import model.*;
import pattern.singleton.HeadLabCoordinatorSingleton;

public class CoordinatorDashboardPanel extends ManagerDashboardPanel {
    private static final long serialVersionUID = 1L;

    private DefaultTableModel allUsersModel;
    private JTable allUsersTable;
    private JTextField genID, genName, genEmail, genDept;
    private JLabel coordInfo;

    public CoordinatorDashboardPanel(MainFrame frame) {
        super(frame, false); // don't call build() yet
        build();
    }

    @Override
    public void refresh() {
        try { equipDAO.load(); userDAO.load(); bookDAO.load(); } catch (Exception e) { e.printStackTrace(); }
        if (currentUser != null && coordInfo != null)
            coordInfo.setText("  Head Lab Coordinator  |  " + currentUser.getName());
        refreshEquip();
        refreshPending();
        refreshAllBookings();
        refreshAllUsers();
    }

    @Override
    protected void build() {
        setBackground(UI.BG);
        setLayout(new BorderLayout());

        JButton logout = UI.button("Logout", UI.DANGER);
        logout.addActionListener(e -> getFrame().showPanel(MainFrame.LOGIN));
        coordInfo = new JLabel("  ");
        coordInfo.setForeground(new Color(148,163,184));
        coordInfo.setFont(new Font("SansSerif", Font.PLAIN, 12));
        JPanel nav = UI.navBar("👑 Coordinator Console", "", logout);
        nav.add(coordInfo, BorderLayout.CENTER);
        add(nav, BorderLayout.NORTH);

        JTabbedPane tabs = new JTabbedPane();
        tabs.setFont(new Font("SansSerif", Font.BOLD, 12));
        tabs.addTab("⚠ Pending Approvals", buildPendingTab());
        tabs.addTab("🔬 Equipment",         buildEquipTab());
        tabs.addTab("➕ Add Equipment",     buildAddTab());
        tabs.addTab("📋 All Bookings",      buildBookingsTab());
        tabs.addTab("👥 All Users",         buildAllUsersTab());
        tabs.addTab("🔑 Generate Manager",  buildGenerateTab());
        add(tabs, BorderLayout.CENTER);

        status = UI.statusBar();
        add(status, BorderLayout.SOUTH);
    }

    private JPanel buildAllUsersTab() {
        JPanel p = new JPanel(new BorderLayout(10, 10));
        p.setBackground(UI.BG);
        p.setBorder(BorderFactory.createEmptyBorder(14, 14, 14, 14));
        p.add(UI.heading("All Registered Users"), BorderLayout.NORTH);

        allUsersModel = UI.tableModel("User ID","Name","Email","Type","Staff ID","Department","Status");
        allUsersTable = UI.styledTable(allUsersModel);
        p.add(new JScrollPane(allUsersTable), BorderLayout.CENTER);

        JPanel btns = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 8));
        btns.setBackground(UI.BG);
        JButton refresh = UI.button("↻ Refresh", UI.YORKU_RED);
        refresh.addActionListener(e -> refreshAllUsers());

        JButton approve = UI.button("✔ Approve Selected", UI.SUCCESS);
        approve.addActionListener(e -> approveFromAllUsers());

        JButton reject = UI.button("✘ Reject Selected", UI.DANGER);
        reject.addActionListener(e -> rejectFromAllUsers());

        btns.add(refresh); btns.add(approve); btns.add(reject);
        p.add(btns, BorderLayout.SOUTH);
        return p;
    }

    private JPanel buildGenerateTab() {
        JPanel outer = new JPanel(new GridBagLayout());
        outer.setBackground(UI.BG);

        JPanel form = UI.card("Generate Lab Manager Account (Req2)");

        JLabel note = new JLabel("Only the Head Lab Coordinator can perform this action (Req2).");
        note.setFont(new Font("SansSerif", Font.ITALIC, 12));
        note.setForeground(UI.TEXT_MUTED);
        note.setAlignmentX(Component.LEFT_ALIGNMENT);
        form.add(note);
        form.add(Box.createVerticalStrut(12));

        genID    = addField(form, "Manager ID (e.g. M002)");
        genName  = addField(form, "Full Name");
        genEmail = addField(form, "Email Address");
        genDept  = addField(form, "Department");

        form.add(Box.createVerticalStrut(8));
        JButton gen = UI.button("Generate Manager Account", UI.YORKU_RED);
        gen.setAlignmentX(Component.LEFT_ALIGNMENT);
        gen.addActionListener(e -> generateManager());
        form.add(gen);

        JPanel wrap = new JPanel(new BorderLayout());
        wrap.setBackground(UI.CARD);
        wrap.setBorder(BorderFactory.createLineBorder(UI.BORDER));
        wrap.add(form, BorderLayout.CENTER);
        outer.add(wrap);
        return outer;
    }

    private void refreshAllUsers() {
        if (allUsersModel == null) return;
        try { userDAO.load(); } catch (Exception e) { e.printStackTrace(); }
        allUsersModel.setRowCount(0);
        for (User u : userDAO.getAllUsers())
            allUsersModel.addRow(new Object[]{
                u.getUserID(), u.getName(), u.getEmail(),
                u.getUserType(), u.getStaffID(), u.getDepartment(), u.getStatus()
            });
    }

    private void approveFromAllUsers() {
        int row = allUsersTable.getSelectedRow();
        if (row < 0) { UI.setStatus(status, "Select a user.", true); return; }
        String uid  = (String) allUsersModel.getValueAt(row, 0);
        String name = (String) allUsersModel.getValueAt(row, 1);
        User u = userDAO.findByID(uid);
        if (u == null) return;
        u.setStatus("ACTIVE");
        userDAO.updateUser(u);
        try { userDAO.save(); } catch (Exception e) { e.printStackTrace(); }
        UI.setStatus(status, "✔ Approved: " + name, false);
        refreshAllUsers(); refreshPending();
    }

    private void rejectFromAllUsers() {
        int row = allUsersTable.getSelectedRow();
        if (row < 0) { UI.setStatus(status, "Select a user.", true); return; }
        String uid  = (String) allUsersModel.getValueAt(row, 0);
        String name = (String) allUsersModel.getValueAt(row, 1);
        User u = userDAO.findByID(uid);
        if (u == null) return;
        u.setStatus("REJECTED");
        userDAO.updateUser(u);
        try { userDAO.save(); } catch (Exception e) { e.printStackTrace(); }
        UI.setStatus(status, "✘ Rejected: " + name, false);
        refreshAllUsers(); refreshPending();
    }

    private void generateManager() {
        if (currentUser == null || !"COORDINATOR".equals(currentUser.getUserType())) {
            UI.setStatus(status, "Only the Head Lab Coordinator can do this (Req2).", true); return;
        }
        String id   = genID.getText().trim();
        String name = genName.getText().trim();
        String email = genEmail.getText().trim();
        String dept = genDept.getText().trim();
        if (id.isEmpty() || name.isEmpty() || email.isEmpty()) {
            UI.setStatus(status, "All fields required.", true); return;
        }
        try { userDAO.load(); } catch (Exception e) { e.printStackTrace(); }
        if (userDAO.emailExists(email)) {
            UI.setStatus(status, "Email already exists.", true); return;
        }

        String tempPass = "temp" + id;
        LabManager mgr = HeadLabCoordinatorSingleton.getInstance()
            .generateManagerAccount(id, name, email, tempPass, dept);
        userDAO.addUser(mgr);
        try { userDAO.save(); } catch (Exception e) { e.printStackTrace(); }

        UI.setStatus(status,
            "✔ Manager account created! Email: " + email + "  |  Temp Password: " + tempPass, false);
        genID.setText(""); genName.setText(""); genEmail.setText(""); genDept.setText("");
        refreshAllUsers();
    }

    private MainFrame getFrame() {
        Container c = getParent();
        while (c != null && !(c instanceof MainFrame)) c = c.getParent();
        return (MainFrame) c;
    }
}


================================================
FILE: D2/src/gui/LoginPanel.java
================================================
package gui;

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import data.UserDAO;
import model.User;
import pattern.factory.UserFactory;

public class LoginPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private MainFrame frame;
    private UserDAO userDAO = new UserDAO("data/users.csv");
    private JTextField emailField;
    private JPasswordField passField;
    private JTextField regName, regEmail, regStaffID, regDept;
    private JPasswordField regPass;
    private JComboBox<String> regType;
    private JLabel status;

    public LoginPanel(MainFrame frame) {
        this.frame = frame;
        try { userDAO.load(); } catch (Exception e) { e.printStackTrace(); }
        build();
    }

    private void build() {
        setBackground(UI.BG);
        setLayout(new BorderLayout());

        // Nav bar
        JPanel nav = new JPanel(new BorderLayout());
        nav.setBackground(UI.NAV_BG);
        nav.setBorder(BorderFactory.createMatteBorder(0, 0, 4, 0, UI.YORKU_RED));
        JPanel navLeft = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
        navLeft.setBackground(UI.NAV_BG);
        JLabel badge = new JLabel("  Y  ");
        badge.setFont(new Font("Segoe UI", Font.BOLD, 15));
        badge.setForeground(Color.WHITE); badge.setBackground(UI.YORKU_RED); badge.setOpaque(true);
        badge.setBorder(BorderFactory.createEmptyBorder(13,14,13,14));
        JLabel title = new JLabel("  YorkU Lab Equipment Reservation System");
        title.setFont(UI.F_HEAD); title.setForeground(UI.NAV_FG);
        navLeft.add(badge); navLeft.add(title);
        nav.add(navLeft, BorderLayout.WEST);
        add(nav, BorderLayout.NORTH);

        // Cards
        JPanel centre = new JPanel(new GridBagLayout());
        centre.setBackground(UI.BG);
        JPanel cards = new JPanel(new GridLayout(1, 2, 24, 0));
        cards.setBackground(UI.BG);
        cards.setPreferredSize(new Dimension(940, 560));
        cards.add(buildLoginCard());
        cards.add(buildRegCard());
        centre.add(cards);
        add(centre, BorderLayout.CENTER);

        // Status
        status = UI.statusBar();
        status.setText("  Welcome — please sign in or create an account.");
        add(status, BorderLayout.SOUTH);
    }

    private JPanel buildLoginCard() {
        JPanel inner = UI.card("Sign In");
        inner.add(UI.label("Email address")); inner.add(Box.createVerticalStrut(4));
        emailField = UI.field("alice@yorku.ca"); inner.add(emailField);
        inner.add(Box.createVerticalStrut(14));
        inner.add(UI.label("Password")); inner.add(Box.createVerticalStrut(4));
        passField = UI.password();
        passField.setMaximumSize(new Dimension(Integer.MAX_VALUE, 36));
        passField.setAlignmentX(Component.LEFT_ALIGNMENT);
        inner.add(passField); inner.add(Box.createVerticalStrut(22));

        JButton btn = UI.primary("Login");
        btn.setMaximumSize(new Dimension(Integer.MAX_VALUE, 42));
        btn.setAlignmentX(Component.LEFT_ALIGNMENT);
        btn.addActionListener(e -> handleLogin());
        inner.add(btn); inner.add(Box.createVerticalStrut(20));

        // Red hint box
        JPanel hint = new JPanel();
        hint.setLayout(new BoxLayout(hint, BoxLayout.Y_AXIS));
        hint.setBackground(new Color(0xfb, 0xe9, 0xec));
        hint.setBorder(BorderFactory.createCompoundBorder(
            new LineBorder(new Color(0xe3,0x18,0x37,80), 1, true),
            BorderFactory.createEmptyBorder(10,12,10,12)));
        hint.setAlignmentX(Component.LEFT_ALIGNMENT);
        hint.setMaximumSize(new Dimension(Integer.MAX_VALUE, 130));
        JLabel ht = new JLabel("Test Accounts"); ht.setFont(UI.F_SUB);
        ht.setForeground(UI.YORKU_DARK); ht.setAlignmentX(Component.LEFT_ALIGNMENT);
        hint.add(ht); hint.add(Box.createVerticalStrut(6));
        for (String line : new String[]{
            "alice@yorku.ca / pass123  →  Student",
            "bob@yorku.ca / pass123  →  Faculty",
            "manager@yorku.ca / manager123  →  Manager",
            "coord@yorku.ca / coord123  →  Coordinator"}) {
            JLabel l = new JLabel(line); l.setFont(UI.F_SMALL); l.setForeground(UI.TEXT_MUTED);
            l.setAlignmentX(Component.LEFT_ALIGNMENT); hint.add(l);
        }
        inner.add(hint);
        return wrapCard(inner);
    }

    private JPanel buildRegCard() {
        JPanel inner = UI.card("Create Account");
        regName    = UI.formField(inner, "Full Name");
        regEmail   = UI.formField(inner, "Email Address");
        regPass    = UI.formPassword(inner, "Password (min 6 characters)");
        regType    = UI.formCombo(inner, "User Type", "STUDENT","FACULTY","RESEARCHER","GUEST");
        regStaffID = UI.formField(inner, "Staff / Student ID or Certification Number (Req8)");
        regDept    = UI.formField(inner, "Department");
        JButton btn = UI.primary("Create Account");
        btn.setMaximumSize(new Dimension(Integer.MAX_VALUE, 42));
        btn.setAlignmentX(Component.LEFT_ALIGNMENT);
        btn.addActionListener(e -> handleRegister());
        inner.add(btn);
        return wrapCard(inner);
    }

    private JPanel wrapCard(JPanel inner) {
        JPanel w = new JPanel(new BorderLayout());
        w.setBackground(UI.CARD);
        w.setBorder(BorderFactory.createCompoundBorder(
            new LineBorder(UI.BORDER, 1, true),
            BorderFactory.createEmptyBorder(26, 30, 26, 30)));
        w.add(inner); return w;
    }

    private void handleLogin() {
        String email = emailField.getText().trim();
        String pass  = new String(passField.getPassword()).trim();
        if (email.isEmpty() || pass.isEmpty()) { setStatus("Please enter your email and password.", true); return; }
        try { userDAO.load(); } catch (Exception e) { e.printStackTrace(); }
        User user = userDAO.findByEmail(email);
        if (user == null || !user.getPassword().equals(pass)) { setStatus("Invalid email or password.", true); return; }
        if ("PENDING".equals(user.getStatus()))  { setStatus("Account is pending departmental approval.", true); return; }
        if ("REJECTED".equals(user.getStatus())) { setStatus("Account was rejected. Contact the coordinator.", true); return; }
        setStatus("Welcome, " + user.getName() + "!", false);
        frame.onLoginSuccess(user);
    }

    private void handleRegister() {
        String name=regName.getText().trim(), email=regEmail.getText().trim();
        String pass=new String(regPass.getPassword()).trim(), type=(String)regType.getSelectedItem();
        String staffID=regStaffID.getText().trim(), dept=regDept.getText().trim();
        if (name.isEmpty()||email.isEmpty()||pass.isEmpty()||staffID.isEmpty()) { setStatus("All fields are required.", true); return; }
        if (pass.length()<6) { setStatus("Password must be at least 6 characters.", true); return; }
        try { userDAO.load(); } catch (Exception e) { e.printStackTrace(); }
        if (userDAO.emailExists(email)) { setStatus("Email is already registered.", true); return; }
        UserFactory factory = new UserFactory();
        User u = factory.getUserType(type);
        u.setUserID("U"+System.currentTimeMillis()); u.setName(name); u.setEmail(email);
        u.setPassword(pass); u.setUserType(type); u.setStaffID(staffID); u.setDepartment(dept);
        u.setStatus("GUEST".equals(type)?"ACTIVE":"PENDING");
        userDAO.addUser(u);
        try { userDAO.save(); } catch (Exception e) { setStatus("Error saving account.",true); return; }
        setStatus("GUEST".equals(type)?"Account created! You can now sign in.":"Registration submitted — awaiting departmental approval.", false);
        regName.setText(""); regEmail.setText(""); regPass.setText(""); regStaffID.setText(""); regDept.setText("");
    }

    private void setStatus(String msg, boolean error) {
        status.setText("  "+msg);
        status.setForeground(error ? UI.DANGER : UI.SUCCESS);
    }
}


================================================
FILE: D2/src/gui/MainFrame.java
================================================
package gui;

import javax.swing.*;
import java.awt.*;
import model.User;

public class MainFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    private static MainFrame instance;

    private CardLayout cardLayout;
    private JPanel mainPanel;

    private LoginPanel loginPanel;
    private UserDashboardPanel userDashboard;
    private ManagerDashboardPanel managerDashboard;
    private CoordinatorDashboardPanel coordinatorDashboard;

    public static final String LOGIN       = "LOGIN";
    public static final String USER        = "USER";
    public static final String MANAGER     = "MANAGER";
    public static final String COORDINATOR = "COORDINATOR";

    public static MainFrame getInstance() {
        if (instance == null) instance = new MainFrame();
        return instance;
    }

    private MainFrame() {
        super("Lab Equipment Reservation System — York University");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(1100, 700);
        setLocationRelativeTo(null);

        cardLayout = new CardLayout();
        mainPanel  = new JPanel(cardLayout);

        loginPanel           = new LoginPanel(this);
        userDashboard        = new UserDashboardPanel(this);
        managerDashboard     = new ManagerDashboardPanel(this);
        coordinatorDashboard = new CoordinatorDashboardPanel(this);

        mainPanel.add(loginPanel,           LOGIN);
        mainPanel.add(userDashboard,        USER);
        mainPanel.add(managerDashboard,     MANAGER);
        mainPanel.add(coordinatorDashboard, COORDINATOR);

        add(mainPanel);
        showPanel(LOGIN);
    }

    public void showPanel(String name) {
        cardLayout.show(mainPanel, name);
    }

    public void onLoginSuccess(User user) {
        String type = user.getUserType().toUpperCase();
        switch (type) {
            case "COORDINATOR":
                coordinatorDashboard.setCurrentUser(user);
                coordinatorDashboard.refresh();
                showPanel(COORDINATOR);
                break;
            case "MANAGER":
                managerDashboard.setCurrentUser(user);
                managerDashboard.refresh();
                showPanel(MANAGER);
                break;
            default: // STUDENT, FACULTY, RESEARCHER, GUEST
                userDashboard.setCurrentUser(user);
                userDashboard.refresh();
                showPanel(USER);
                break;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> MainFrame.getInstance().setVisible(true));
    }
}


================================================
FILE: D2/src/gui/ManagerDashboardPanel.java
================================================
package gui;

// pre determined login
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.util.List;
import data.*;
import model.*;
import pattern.observer.*;
import pattern.state.*;

public class ManagerDashboardPanel extends JPanel {
    private static final long serialVersionUID = 1L;

    private MainFrame frame;
    protected User currentUser;

    protected EquipmentDAO equipDAO = new EquipmentDAO("data/equipment.csv");
    protected UserDAO userDAO       = new UserDAO("data/users.csv");
    protected BookingDAO bookDAO    = new BookingDAO("data/bookings.csv");

    protected DefaultTableModel equipModel, pendModel, bookModel;
    protected JTable equipTable, pendTable, bookTable;
    private JTextField eqID, eqName, eqDesc, eqType, eqBuilding, eqRoom;
    protected JLabel status;
    private JLabel navInfo;

    public ManagerDashboardPanel(MainFrame frame) { this(frame, true); }

    protected ManagerDashboardPanel(MainFrame frame, boolean standalone) {
        this.frame = frame;
        if (standalone) build();
    }

    public void setCurrentUser(User u) { this.currentUser = u; }

    public void refresh() {
        try { equipDAO.load(); userDAO.load(); bookDAO.load(); } catch (Exception e) { e.printStackTrace(); }
        if (currentUser != null && navInfo != null)
            navInfo.setText("  Lab Manager  |  " + currentUser.getName());
        refreshEquip();
        refreshPending();
        refreshAllBookings();
    }

    protected void build() {
        setBackground(UI.BG);
        setLayout(new BorderLayout());

        JButton logout = UI.button("Logout", UI.DANGER);
        logout.addActionListener(e -> frame.showPanel(MainFrame.LOGIN));
        navInfo = new JLabel("  ");
        navInfo.setForeground(new Color(148,163,184));
        navInfo.setFont(new Font("SansSerif", Font.PLAIN, 12));
        JPanel nav = UI.navBar("🔧 Manager Console", "", logout);
        nav.add(navInfo, BorderLayout.CENTER);
        add(nav, BorderLayout.NORTH);

        JTabbedPane tabs = buildTabs();
        add(tabs, BorderLayout.CENTER);

        status = UI.statusBar();
        add(status, BorderLayout.SOUTH);
    }

    protected JTabbedPane buildTabs() {
        JTabbedPane tabs = new JTabbedPane();
        tabs.setFont(new Font("SansSerif", Font.BOLD, 12));
        tabs.addTab("⚠ Pending Approvals", buildPendingTab());
        tabs.addTab("🔬 Equipment", buildEquipTab());
        tabs.addTab("➕ Add Equipment", buildAddTab());
        tabs.addTab("📋 All Bookings", buildBookingsTab());
        return tabs;
    }

    protected JPanel buildPendingTab() {
        JPanel p = new JPanel(new BorderLayout(10, 10));
        p.setBackground(UI.BG);
        p.setBorder(BorderFactory.createEmptyBorder(14,14,14,14));
        p.add(UI.heading("Pending Account Approvals (Req1)"), BorderLayout.NORTH);

        pendModel = UI.tableModel("User ID","Name","Email","Type","Staff/Cert ID","Department","Status");
        pendTable = UI.styledTable(pendModel);
        pendTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        p.add(new JScrollPane(pendTable), BorderLayout.CENTER);

        JPanel btns = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 8));
        btns.setBackground(UI.BG);
        JButton approve = UI.button("✔ Approve", UI.SUCCESS);
        JButton reject  = UI.button("✘ Reject",  UI.DANGER);
        JButton refresh = UI.button("↻ Refresh", UI.YORKU_RED);
        approve.addActionListener(e -> approve());
        reject.addActionListener(e -> reject());
        refresh.addActionListener(e -> refreshPending());
        btns.add(approve); btns.add(reject); btns.add(refresh);
        p.add(btns, BorderLayout.SOUTH);
        return p;
    }

    protected JPanel buildEquipTab() {
        JPanel p = new JPanel(new BorderLayout(10, 10));
        p.setBackground(UI.BG);
        p.setBorder(BorderFactory.createEmptyBorder(14,14,14,14));
        p.add(UI.heading("Equipment Management (Req6)"), BorderLayout.NORTH);

        equipModel = UI.tableModel("ID","Name","Description","Type","Status","Building","Room");
        equipTable = UI.styledTable(equipModel);
        equipTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        p.add(new JScrollPane(equipTable), BorderLayout.CENTER);

        JPanel btns = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 8));
        btns.setBackground(UI.BG);
        JButton enable  = UI.button("✔ Enable",      UI.SUCCESS);
        JButton disable = UI.button("✘ Disable",     UI.WARNING);
        JButton maint   = UI.button("🔧 Maintenance", UI.DANGER);
        enable.addActionListener(e  -> changeStatus("AVAILABLE"));
        disable.addActionListener(e -> changeStatus("DISABLED"));
   
Download .txt
gitextract_3g0h0e_9/

├── D1/
│   └── Sequence Diagram/
│       ├── Sequence1.drawio
│       ├── Sequence2.drawio
│       └── sequence3.drawio
└── D2/
    ├── .vscode/
    │   └── settings.json
    ├── data/
    │   ├── bookings.csv
    │   ├── equipment.csv
    │   └── users.csv
    ├── lib/
    │   └── javacsv.jar
    └── src/
        ├── Main.java
        ├── data/
        │   ├── .gitkeep
        │   ├── BookingDAO.java
        │   ├── EquipmentDAO.java
        │   └── UserDAO.java
        ├── gui/
        │   ├── .gitkeep
        │   ├── CoordinatorDashboardPanel.java
        │   ├── LoginPanel.java
        │   ├── MainFrame.java
        │   ├── ManagerDashboardPanel.java
        │   ├── UI.java
        │   └── UserDashboardPanel.java
        ├── model/
        │   ├── .gitkeep
        │   ├── Deposit.java
        │   ├── Equipment.java
        │   ├── Faculty.java
        │   ├── Guest.java
        │   ├── HeadLabCoordinator.java
        │   ├── LabLocation.java
        │   ├── LabManager.java
        │   ├── PaymentTransaction.java
        │   ├── Researcher.java
        │   ├── Reservation.java
        │   ├── Student.java
        │   └── User.java
        └── pattern/
            ├── command/
            │   ├── .gitkeep
            │   ├── CancelCommand.java
            │   ├── Command.java
            │   ├── ExtendCommand.java
            │   ├── ForfeitDepositCommand.java
            │   ├── ModifyCommand.java
            │   ├── ReservationService.java
            │   └── ReserveCommand.java
            ├── factory/
            │   ├── .gitkeep
            │   └── UserFactory.java
            ├── observer/
            │   ├── .gitkeep
            │   ├── EquipmentObserver.java
            │   ├── EquipmentSubject.java
            │   ├── Observer.java
            │   └── UserNotificationObserver.java
            ├── singleton/
            │   ├── .gitkeep
            │   ├── BookingSystem.java
            │   └── HeadLabCoordinatorSingleton.java
            ├── state/
            │   ├── .gitkeep
            │   ├── AvailableState.java
            │   ├── DisabledState.java
            │   ├── EquipmentContext.java
            │   ├── EquipmentState.java
            │   └── MaintenanceState.java
            └── strategy/
                ├── .gitkeep
                ├── CreditCardPayment.java
                ├── DebitPayment.java
                ├── GrantPayment.java
                ├── InstitutionalPayment.java
                ├── PaymentProcessor.java
                └── PaymentStrategy.java
Download .txt
SYMBOL INDEX (348 symbols across 46 files)

FILE: D2/src/Main.java
  class Main (line 4) | public class Main {
    method main (line 5) | public static void main(String[] args) {

FILE: D2/src/data/BookingDAO.java
  class BookingDAO (line 15) | public class BookingDAO {
    method BookingDAO (line 20) | public BookingDAO(String path) {
    method load (line 24) | public void load() throws Exception {
    method save (line 46) | public void save() throws Exception {
    method addBooking (line 77) | public void addBooking(Reservation r) {
    method findByID (line 81) | public Reservation findByID(String bookingID) {
    method getBookingsByUser (line 88) | public List<Reservation> getBookingsByUser(String userID) {
    method getBookingsByEquipment (line 96) | public List<Reservation> getBookingsByEquipment(String equipmentID) {
    method getAllBookings (line 104) | public List<Reservation> getAllBookings() {
    method updateBooking (line 108) | public void updateBooking(Reservation updated) {

FILE: D2/src/data/EquipmentDAO.java
  class EquipmentDAO (line 15) | public class EquipmentDAO {
    method EquipmentDAO (line 20) | public EquipmentDAO(String path) {
    method load (line 24) | public void load() throws Exception {
    method save (line 43) | public void save() throws Exception {
    method addEquipment (line 68) | public void addEquipment(Equipment e) {
    method findByID (line 72) | public Equipment findByID(String equipmentID) {
    method getAllEquipment (line 79) | public List<Equipment> getAllEquipment() {
    method getAvailableEquipment (line 83) | public List<Equipment> getAvailableEquipment() {
    method updateEquipment (line 91) | public void updateEquipment(Equipment updated) {

FILE: D2/src/data/UserDAO.java
  class UserDAO (line 15) | public class UserDAO {
    method UserDAO (line 20) | public UserDAO(String path) {
    method load (line 24) | public void load() throws Exception {
    method save (line 47) | public void save() throws Exception {
    method addUser (line 76) | public void addUser(User user) {
    method findByEmail (line 80) | public User findByEmail(String email) {
    method findByID (line 87) | public User findByID(String userID) {
    method emailExists (line 94) | public boolean emailExists(String email) {
    method getAllUsers (line 98) | public List<User> getAllUsers() {
    method updateUser (line 102) | public void updateUser(User updated) {
    method createUser (line 112) | private User createUser(String userType) {

FILE: D2/src/gui/CoordinatorDashboardPanel.java
  class CoordinatorDashboardPanel (line 10) | public class CoordinatorDashboardPanel extends ManagerDashboardPanel {
    method CoordinatorDashboardPanel (line 18) | public CoordinatorDashboardPanel(MainFrame frame) {
    method refresh (line 23) | @Override
    method build (line 34) | @Override
    method buildAllUsersTab (line 62) | private JPanel buildAllUsersTab() {
    method buildGenerateTab (line 88) | private JPanel buildGenerateTab() {
    method refreshAllUsers (line 120) | private void refreshAllUsers() {
    method approveFromAllUsers (line 131) | private void approveFromAllUsers() {
    method rejectFromAllUsers (line 145) | private void rejectFromAllUsers() {
    method generateManager (line 159) | private void generateManager() {
    method getFrame (line 187) | private MainFrame getFrame() {

FILE: D2/src/gui/LoginPanel.java
  class LoginPanel (line 10) | public class LoginPanel extends JPanel {
    method LoginPanel (line 21) | public LoginPanel(MainFrame frame) {
    method build (line 27) | private void build() {
    method buildLoginCard (line 64) | private JPanel buildLoginCard() {
    method buildRegCard (line 105) | private JPanel buildRegCard() {
    method wrapCard (line 121) | private JPanel wrapCard(JPanel inner) {
    method handleLogin (line 130) | private void handleLogin() {
    method handleRegister (line 143) | private void handleRegister() {
    method setStatus (line 162) | private void setStatus(String msg, boolean error) {

FILE: D2/src/gui/MainFrame.java
  class MainFrame (line 7) | public class MainFrame extends JFrame {
    method getInstance (line 25) | public static MainFrame getInstance() {
    method MainFrame (line 30) | private MainFrame() {
    method showPanel (line 53) | public void showPanel(String name) {
    method onLoginSuccess (line 57) | public void onLoginSuccess(User user) {
    method main (line 78) | public static void main(String[] args) {

FILE: D2/src/gui/ManagerDashboardPanel.java
  class ManagerDashboardPanel (line 13) | public class ManagerDashboardPanel extends JPanel {
    method ManagerDashboardPanel (line 29) | public ManagerDashboardPanel(MainFrame frame) { this(frame, true); }
    method ManagerDashboardPanel (line 31) | protected ManagerDashboardPanel(MainFrame frame, boolean standalone) {
    method setCurrentUser (line 36) | public void setCurrentUser(User u) { this.currentUser = u; }
    method refresh (line 38) | public void refresh() {
    method build (line 47) | protected void build() {
    method buildTabs (line 67) | protected JTabbedPane buildTabs() {
    method buildPendingTab (line 77) | protected JPanel buildPendingTab() {
    method buildEquipTab (line 101) | protected JPanel buildEquipTab() {
    method buildAddTab (line 125) | protected JPanel buildAddTab() {
    method buildBookingsTab (line 150) | protected JPanel buildBookingsTab() {
    method refreshEquip (line 169) | protected void refreshEquip() {
    method refreshPending (line 179) | protected void refreshPending() {
    method refreshAllBookings (line 197) | protected void refreshAllBookings() {
    method approve (line 209) | private void approve() {
    method reject (line 223) | private void reject() {
    method changeStatus (line 237) | protected void changeStatus(String newStatus) {
    method addEquipment (line 269) | private void addEquipment() {
    method addField (line 284) | protected JTextField addField(JPanel form, String labelText) {

FILE: D2/src/gui/UI.java
  class UI (line 9) | public class UI {
    method button (line 36) | public static JButton button(String text, Color bg) {
    method primary (line 50) | public static JButton primary(String t)   { return button(t, YORKU_RED...
    method secondary (line 51) | public static JButton secondary(String t) { return button(t, SECONDARY...
    method success (line 52) | public static JButton success(String t)   { return button(t, SUCCESS); }
    method danger (line 53) | public static JButton danger(String t)    { return button(t, DANGER); }
    method warning (line 54) | public static JButton warning(String t)   { return button(t, WARNING); }
    method info (line 55) | public static JButton info(String t)      { return button(t, INFO); }
    method field (line 57) | public static JTextField field(String placeholder) {
    method password (line 61) | public static JPasswordField password() {
    method combo (line 65) | public static JComboBox<String> combo(String... items) {
    method styleInput (line 73) | private static void styleInput(JTextField f) {
    method inputBorder (line 87) | private static Border inputBorder() {
    method heading (line 93) | public static JLabel heading(String t) {
    method label (line 96) | public static JLabel label(String t) {
    method navBar (line 102) | public static JPanel navBar(String appTitle, String userInfo, JButton....
    method card (line 128) | public static JPanel card(String title) {
    method statusBar (line 145) | public static JLabel statusBar() {
    method setStatus (line 151) | public static void setStatus(JLabel bar, String msg, boolean error) {
    method tableModel (line 156) | public static DefaultTableModel tableModel(String... cols) {
    method styledTable (line 161) | public static JTable styledTable(DefaultTableModel model) {
    method scroll (line 182) | public static JScrollPane scroll(JTable t) {
    method tabs (line 187) | public static JTabbedPane tabs() {
    method formField (line 191) | public static JTextField formField(JPanel form, String lbl) {
    method formPassword (line 196) | public static JPasswordField formPassword(JPanel form, String lbl) {
    method formCombo (line 201) | public static JComboBox<String> formCombo(JPanel form, String lbl, Str...
    method tabContent (line 206) | public static JPanel tabContent() {
    method buttonRow (line 210) | public static JPanel buttonRow(JButton... buttons) {

FILE: D2/src/gui/UserDashboardPanel.java
  class UserDashboardPanel (line 12) | public class UserDashboardPanel extends JPanel {
    method UserDashboardPanel (line 28) | public UserDashboardPanel(MainFrame frame) {
    method setCurrentUser (line 33) | public void setCurrentUser(User u) { this.currentUser = u; }
    method refresh (line 35) | public void refresh() {
    method build (line 44) | private void build() {
    method buildBrowseTab (line 71) | private JPanel buildBrowseTab() {
    method buildBookingsTab (line 118) | private JPanel buildBookingsTab() {
    method refreshEquip (line 158) | private void refreshEquip() {
    method refreshBookings (line 168) | private void refreshBookings() {
    method reserve (line 180) | private void reserve() {
    method cancelBooking (line 210) | private void cancelBooking() {
    method extend (line 223) | private void extend() {
    method forfeit (line 240) | private void forfeit() {
    method payStrategy (line 253) | private PaymentStrategy payStrategy(String m) {

FILE: D2/src/model/Deposit.java
  class Deposit (line 3) | public class Deposit {
    method Deposit (line 8) | public Deposit() {}
    method Deposit (line 10) | public Deposit(double amount) {
    method forfeit (line 17) | public void forfeit() {
    method getAmount (line 21) | public double getAmount() { return amount; }
    method setAmount (line 22) | public void setAmount(double amount) { this.amount = amount; }
    method isForfeited (line 24) | public boolean isForfeited() { return isForfeited; }
    method setForfeited (line 25) | public void setForfeited(boolean forfeited) { isForfeited = forfeited; }
    method isDeductedFromTotal (line 27) | public boolean isDeductedFromTotal() { return deductedFromTotal; }
    method setDeductedFromTotal (line 28) | public void setDeductedFromTotal(boolean deductedFromTotal) {

FILE: D2/src/model/Equipment.java
  class Equipment (line 3) | public class Equipment {
    method Equipment (line 12) | public Equipment() {}
    method Equipment (line 14) | public Equipment(String equipmentID, String name, String description,
    method getLabLocation (line 25) | public LabLocation getLabLocation() {
    method isAvailable (line 29) | public boolean isAvailable() {
    method getEquipmentID (line 34) | public String getEquipmentID() { return equipmentID; }
    method setEquipmentID (line 35) | public void setEquipmentID(String equipmentID) { this.equipmentID = eq...
    method getName (line 37) | public String getName() { return name; }
    method setName (line 38) | public void setName(String name) { this.name = name; }
    method getDescription (line 40) | public String getDescription() { return description; }
    method setDescription (line 41) | public void setDescription(String description) { this.description = de...
    method getType (line 43) | public String getType() { return type; }
    method setType (line 44) | public void setType(String type) { this.type = type; }
    method getStatus (line 46) | public String getStatus() { return status; }
    method setStatus (line 47) | public void setStatus(String status) { this.status = status; }
    method getBuildingName (line 49) | public String getBuildingName() { return buildingName; }
    method setBuildingName (line 50) | public void setBuildingName(String buildingName) { this.buildingName =...
    method getRoomNumber (line 52) | public String getRoomNumber() { return roomNumber; }
    method setRoomNumber (line 53) | public void setRoomNumber(String roomNumber) { this.roomNumber = roomN...
    method toString (line 55) | @Override

FILE: D2/src/model/Faculty.java
  class Faculty (line 3) | public class Faculty extends User {
    method Faculty (line 6) | public Faculty() {}
    method Faculty (line 8) | public Faculty(String userID, String name, String email, String password,
    method getFeeRate (line 13) | @Override

FILE: D2/src/model/Guest.java
  class Guest (line 3) | public class Guest extends User {
    method Guest (line 7) | public Guest() {}
    method Guest (line 9) | public Guest(String userID, String name, String email, String password,
    method getFeeRate (line 15) | @Override
    method getCertificationNumber (line 20) | public String getCertificationNumber() { return certificationNumber; }
    method setCertificationNumber (line 21) | public void setCertificationNumber(String certificationNumber) {

FILE: D2/src/model/HeadLabCoordinator.java
  class HeadLabCoordinator (line 3) | public class HeadLabCoordinator extends User {
    method HeadLabCoordinator (line 6) | public HeadLabCoordinator() {}
    method HeadLabCoordinator (line 8) | public HeadLabCoordinator(String userID, String name, String email,
    method getFeeRate (line 13) | @Override
    method generateManagerAccount (line 17) | public LabManager generateManagerAccount(String managerID, String name,

FILE: D2/src/model/LabLocation.java
  class LabLocation (line 3) | public class LabLocation {
    method LabLocation (line 7) | public LabLocation() {}
    method LabLocation (line 9) | public LabLocation(String buildingName, String roomNumber) {
    method getLocationDetails (line 14) | public String getLocationDetails() {
    method getBuildingName (line 18) | public String getBuildingName() { return buildingName; }
    method setBuildingName (line 19) | public void setBuildingName(String buildingName) { this.buildingName =...
    method getRoomNumber (line 21) | public String getRoomNumber() { return roomNumber; }
    method setRoomNumber (line 22) | public void setRoomNumber(String roomNumber) { this.roomNumber = roomN...
    method toString (line 24) | @Override

FILE: D2/src/model/LabManager.java
  class LabManager (line 3) | public class LabManager extends User {
    method LabManager (line 7) | public LabManager() {}
    method LabManager (line 9) | public LabManager(String userID, String name, String email, String pas...
    method getFeeRate (line 15) | @Override
    method getManagerID (line 18) | public String getManagerID() { return managerID; }
    method setManagerID (line 19) | public void setManagerID(String managerID) { this.managerID = managerI...

FILE: D2/src/model/PaymentTransaction.java
  class PaymentTransaction (line 3) | public class PaymentTransaction {
    method PaymentTransaction (line 10) | public PaymentTransaction() {}
    method PaymentTransaction (line 12) | public PaymentTransaction(String transactionID, String bookingID,
    method getTransactionID (line 22) | public String getTransactionID() { return transactionID; }
    method setTransactionID (line 23) | public void setTransactionID(String transactionID) { this.transactionI...
    method getBookingID (line 25) | public String getBookingID() { return bookingID; }
    method setBookingID (line 26) | public void setBookingID(String bookingID) { this.bookingID = bookingI...
    method getTotalAmount (line 28) | public double getTotalAmount() { return totalAmount; }
    method setTotalAmount (line 29) | public void setTotalAmount(double totalAmount) { this.totalAmount = to...
    method getPaymentStatus (line 31) | public String getPaymentStatus() { return paymentStatus; }
    method setPaymentStatus (line 32) | public void setPaymentStatus(String paymentStatus) { this.paymentStatu...
    method getPaymentMethod (line 34) | public String getPaymentMethod() { return paymentMethod; }
    method setPaymentMethod (line 35) | public void setPaymentMethod(String paymentMethod) { this.paymentMetho...

FILE: D2/src/model/Researcher.java
  class Researcher (line 3) | public class Researcher extends User {
    method Researcher (line 6) | public Researcher() {}
    method Researcher (line 8) | public Researcher(String userID, String name, String email, String pas...
    method getFeeRate (line 13) | @Override

FILE: D2/src/model/Reservation.java
  class Reservation (line 3) | public class Reservation {
    method Reservation (line 15) | public Reservation() {}
    method Reservation (line 17) | public Reservation(String bookingID, String userID, String equipmentID,
    method cancel (line 31) | public void cancel() { this.status = "CANCELLED"; }
    method forfeitDeposit (line 32) | public void forfeitDeposit() { this.depositForfeited = true; this.stat...
    method extend (line 33) | public void extend(String newEndTime) { this.endTime = newEndTime; thi...
    method getBookingID (line 36) | public String getBookingID() { return bookingID; }
    method setBookingID (line 37) | public void setBookingID(String bookingID) { this.bookingID = bookingI...
    method getUserID (line 39) | public String getUserID() { return userID; }
    method setUserID (line 40) | public void setUserID(String userID) { this.userID = userID; }
    method getEquipmentID (line 42) | public String getEquipmentID() { return equipmentID; }
    method setEquipmentID (line 43) | public void setEquipmentID(String equipmentID) { this.equipmentID = eq...
    method getStartTime (line 45) | public String getStartTime() { return startTime; }
    method setStartTime (line 46) | public void setStartTime(String startTime) { this.startTime = startTim...
    method getEndTime (line 48) | public String getEndTime() { return endTime; }
    method setEndTime (line 49) | public void setEndTime(String endTime) { this.endTime = endTime; }
    method isExtended (line 51) | public boolean isExtended() { return isExtended; }
    method setExtended (line 52) | public void setExtended(boolean extended) { isExtended = extended; }
    method getStatus (line 54) | public String getStatus() { return status; }
    method setStatus (line 55) | public void setStatus(String status) { this.status = status; }
    method getDepositAmount (line 57) | public double getDepositAmount() { return depositAmount; }
    method setDepositAmount (line 58) | public void setDepositAmount(double depositAmount) { this.depositAmoun...
    method isDepositForfeited (line 60) | public boolean isDepositForfeited() { return depositForfeited; }
    method setDepositForfeited (line 61) | public void setDepositForfeited(boolean depositForfeited) { this.depos...
    method getPaymentMethod (line 63) | public String getPaymentMethod() { return paymentMethod; }
    method setPaymentMethod (line 64) | public void setPaymentMethod(String paymentMethod) { this.paymentMetho...
    method toString (line 66) | @Override

FILE: D2/src/model/Student.java
  class Student (line 3) | public class Student extends User {
    method Student (line 6) | public Student() {}
    method Student (line 8) | public Student(String userID, String name, String email, String password,
    method getFeeRate (line 13) | @Override

FILE: D2/src/model/User.java
  class User (line 3) | public abstract class User {
    method User (line 13) | public User() {}
    method User (line 15) | public User(String userID, String name, String email, String password,
    method getFeeRate (line 28) | public abstract double getFeeRate();
    method getUserID (line 31) | public String getUserID() { return userID; }
    method setUserID (line 32) | public void setUserID(String userID) { this.userID = userID; }
    method getName (line 34) | public String getName() { return name; }
    method setName (line 35) | public void setName(String name) { this.name = name; }
    method getEmail (line 37) | public String getEmail() { return email; }
    method setEmail (line 38) | public void setEmail(String email) { this.email = email; }
    method getPassword (line 40) | public String getPassword() { return password; }
    method setPassword (line 41) | public void setPassword(String password) { this.password = password; }
    method getUserType (line 43) | public String getUserType() { return userType; }
    method setUserType (line 44) | public void setUserType(String userType) { this.userType = userType; }
    method getStaffID (line 46) | public String getStaffID() { return staffID; }
    method setStaffID (line 47) | public void setStaffID(String staffID) { this.staffID = staffID; }
    method getStatus (line 49) | public String getStatus() { return status; }
    method setStatus (line 50) | public void setStatus(String status) { this.status = status; }
    method getDepartment (line 52) | public String getDepartment() { return department; }
    method setDepartment (line 53) | public void setDepartment(String department) { this.department = depar...
    method toString (line 55) | @Override

FILE: D2/src/pattern/command/CancelCommand.java
  class CancelCommand (line 5) | public class CancelCommand implements Command {
    method CancelCommand (line 10) | public CancelCommand(ReservationService reservationService, Reservatio...
    method execute (line 15) | @Override

FILE: D2/src/pattern/command/Command.java
  type Command (line 3) | public interface Command {
    method execute (line 4) | void execute();

FILE: D2/src/pattern/command/ExtendCommand.java
  class ExtendCommand (line 5) | public class ExtendCommand implements Command {
    method ExtendCommand (line 11) | public ExtendCommand(ReservationService reservationService, Reservatio...
    method execute (line 17) | @Override

FILE: D2/src/pattern/command/ForfeitDepositCommand.java
  class ForfeitDepositCommand (line 5) | public class ForfeitDepositCommand implements Command {
    method ForfeitDepositCommand (line 10) | public ForfeitDepositCommand(ReservationService reservationService, Re...
    method execute (line 15) | @Override

FILE: D2/src/pattern/command/ModifyCommand.java
  class ModifyCommand (line 5) | public class ModifyCommand implements Command {
    method ModifyCommand (line 12) | public ModifyCommand(ReservationService reservationService, Reservatio...
    method execute (line 19) | @Override

FILE: D2/src/pattern/command/ReservationService.java
  class ReservationService (line 5) | public class ReservationService {
    method reserve (line 7) | public void reserve(Reservation reservation) {
    method cancel (line 12) | public void cancel(Reservation reservation) {
    method modify (line 17) | public void modify(Reservation reservation, String newStartTime, Strin...
    method extend (line 23) | public void extend(Reservation reservation, String newEndTime) {
    method forfeitDeposit (line 28) | public void forfeitDeposit(Reservation reservation) {

FILE: D2/src/pattern/command/ReserveCommand.java
  class ReserveCommand (line 5) | public class ReserveCommand implements Command {
    method ReserveCommand (line 10) | public ReserveCommand(ReservationService reservationService, Reservati...
    method execute (line 15) | @Override

FILE: D2/src/pattern/factory/UserFactory.java
  class UserFactory (line 10) | public class UserFactory {
    method UserFactory (line 12) | public UserFactory () {}
    method getUserType (line 14) | public User getUserType(String userType) {

FILE: D2/src/pattern/observer/EquipmentObserver.java
  type EquipmentObserver (line 7) | public interface EquipmentObserver {
    method update (line 8) | void update(String equipmentID, String newStatus);

FILE: D2/src/pattern/observer/EquipmentSubject.java
  type EquipmentSubject (line 7) | public interface EquipmentSubject {
    method registerObserver (line 8) | void registerObserver(EquipmentObserver observer);
    method removeObserver (line 9) | void removeObserver(EquipmentObserver observer);
    method notifyObservers (line 10) | void notifyObservers(String equipmentID, String newStatus);

FILE: D2/src/pattern/observer/UserNotificationObserver.java
  class UserNotificationObserver (line 12) | public class UserNotificationObserver implements EquipmentObserver {
    method UserNotificationObserver (line 17) | public UserNotificationObserver(List<User> affectedUsers) {
    method update (line 21) | @Override
    method getNotificationLog (line 35) | public String getNotificationLog() {
    method setAffectedUsers (line 39) | public void setAffectedUsers(List<User> affectedUsers) {

FILE: D2/src/pattern/singleton/BookingSystem.java
  class BookingSystem (line 7) | public class BookingSystem {
    method getInstance (line 11) | public static BookingSystem getInstance() { return bsInstance; }
    method BookingSystem (line 16) | private BookingSystem() {
    method getReservations (line 20) | public List<Reservation> getReservations() { return bsInstance.reserva...
    method addBooking (line 22) | public void addBooking(Reservation booking) {
    method checkActiveBookings (line 26) | public boolean checkActiveBookings(String equipmentID) {
    method cancelFutureBookings (line 39) | public void cancelFutureBookings(String id) {

FILE: D2/src/pattern/singleton/HeadLabCoordinatorSingleton.java
  class HeadLabCoordinatorSingleton (line 10) | public class HeadLabCoordinatorSingleton {
    method HeadLabCoordinatorSingleton (line 20) | private HeadLabCoordinatorSingleton() {
    method getInstance (line 28) | public static HeadLabCoordinatorSingleton getInstance() {
    method generateManagerAccount (line 39) | public LabManager generateManagerAccount(String managerID, String name,
    method getCoordinatorID (line 47) | public String getCoordinatorID() { return coordinatorID; }
    method getName (line 48) | public String getName() { return name; }
    method getEmail (line 49) | public String getEmail() { return email; }
    method getDepartment (line 50) | public String getDepartment() { return department; }
    method toString (line 52) | @Override

FILE: D2/src/pattern/state/AvailableState.java
  class AvailableState (line 3) | public class AvailableState implements EquipmentState {
    method enable (line 5) | @Override
    method disable (line 10) | @Override
    method markUnderMaintenance (line 16) | @Override
    method getStatus (line 22) | @Override

FILE: D2/src/pattern/state/DisabledState.java
  class DisabledState (line 3) | public class DisabledState implements EquipmentState {
    method enable (line 5) | @Override
    method disable (line 11) | @Override
    method markUnderMaintenance (line 16) | @Override
    method getStatus (line 22) | @Override

FILE: D2/src/pattern/state/EquipmentContext.java
  class EquipmentContext (line 14) | public class EquipmentContext implements EquipmentSubject {
    method EquipmentContext (line 22) | public EquipmentContext(String equipmentID, String initialStatus) {
    method enable (line 29) | public void enable() {
    method disable (line 33) | public void disable() {
    method markUnderMaintenance (line 37) | public void markUnderMaintenance() {
    method setState (line 41) | public void setState(EquipmentState newState) {
    method getCurrentState (line 46) | public EquipmentState getCurrentState() {
    method getStatusString (line 50) | public String getStatusString() {
    method getEquipmentID (line 57) | public String getEquipmentID() {
    method registerObserver (line 63) | @Override
    method removeObserver (line 68) | @Override
    method notifyObservers (line 73) | @Override
    method getStateFromString (line 81) | private EquipmentState getStateFromString(String status) {

FILE: D2/src/pattern/state/EquipmentState.java
  type EquipmentState (line 3) | public interface EquipmentState {
    method enable (line 4) | void enable(EquipmentContext context);
    method disable (line 5) | void disable(EquipmentContext context);
    method markUnderMaintenance (line 6) | void markUnderMaintenance(EquipmentContext context);
    method getStatus (line 7) | String getStatus();

FILE: D2/src/pattern/state/MaintenanceState.java
  class MaintenanceState (line 3) | public class MaintenanceState implements EquipmentState {
    method enable (line 5) | @Override
    method disable (line 11) | @Override
    method markUnderMaintenance (line 17) | @Override
    method getStatus (line 22) | @Override

FILE: D2/src/pattern/strategy/CreditCardPayment.java
  class CreditCardPayment (line 5) | public class CreditCardPayment implements PaymentStrategy {
    method pay (line 7) | @Override

FILE: D2/src/pattern/strategy/DebitPayment.java
  class DebitPayment (line 5) | public class DebitPayment implements PaymentStrategy {
    method pay (line 7) | @Override

FILE: D2/src/pattern/strategy/GrantPayment.java
  class GrantPayment (line 5) | public class GrantPayment implements PaymentStrategy {
    method pay (line 7) | @Override

FILE: D2/src/pattern/strategy/InstitutionalPayment.java
  class InstitutionalPayment (line 5) | public class InstitutionalPayment implements PaymentStrategy {
    method pay (line 7) | @Override

FILE: D2/src/pattern/strategy/PaymentProcessor.java
  class PaymentProcessor (line 5) | public class PaymentProcessor {
    method PaymentProcessor (line 8) | public PaymentProcessor(PaymentStrategy paymentStrategy) {
    method setPaymentStrategy (line 12) | public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
    method processPayment (line 16) | public boolean processPayment(PaymentTransaction transaction) {

FILE: D2/src/pattern/strategy/PaymentStrategy.java
  type PaymentStrategy (line 5) | public interface PaymentStrategy {
    method pay (line 6) | boolean pay(PaymentTransaction transaction);
Condensed preview — 64 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (277K chars).
[
  {
    "path": "D1/Sequence Diagram/Sequence1.drawio",
    "chars": 48603,
    "preview": "<mxfile host=\"app.diagrams.net\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
  },
  {
    "path": "D1/Sequence Diagram/Sequence2.drawio",
    "chars": 57337,
    "preview": "<mxfile host=\"app.diagrams.net\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
  },
  {
    "path": "D1/Sequence Diagram/sequence3.drawio",
    "chars": 56721,
    "preview": "<mxfile host=\"app.diagrams.net\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
  },
  {
    "path": "D2/.vscode/settings.json",
    "chars": 66,
    "preview": "{\n  \"java.project.referencedLibraries\": [\n    \"lib/**/*.jar\"\n  ]\n}"
  },
  {
    "path": "D2/data/bookings.csv",
    "chars": 285,
    "preview": "bookingID,userID,equipmentID,startTime,endTime,status,depositAmount,depositForfeited,paymentMethod,isExtended\nB001,U001,"
  },
  {
    "path": "D2/data/equipment.csv",
    "chars": 433,
    "preview": "equipmentID,name,description,type,status,buildingName,roomNumber\nEQ001,Oscilloscope,Digital oscilloscope 200MHz,Electron"
  },
  {
    "path": "D2/data/users.csv",
    "chars": 681,
    "preview": "userID,name,email,password,userType,staffID,status,department\nU001,Alice Student,alice@yorku.ca,pass123,STUDENT,S12345,A"
  },
  {
    "path": "D2/src/Main.java",
    "chars": 240,
    "preview": "import javax.swing.SwingUtilities;\nimport gui.MainFrame;\n\npublic class Main {\n    public static void main(String[] args)"
  },
  {
    "path": "D2/src/data/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "D2/src/data/BookingDAO.java",
    "chars": 3771,
    "preview": "package data;\n\nimport com.csvreader.CsvReader;\nimport com.csvreader.CsvWriter;\nimport model.Reservation;\n\nimport java.io"
  },
  {
    "path": "D2/src/data/EquipmentDAO.java",
    "chars": 2919,
    "preview": "package data;\n\nimport com.csvreader.CsvReader;\nimport com.csvreader.CsvWriter;\nimport model.Equipment;\n\nimport java.io.F"
  },
  {
    "path": "D2/src/data/UserDAO.java",
    "chars": 3538,
    "preview": "package data;\n\nimport com.csvreader.CsvReader;\nimport com.csvreader.CsvWriter;\nimport model.*;\n\nimport java.io.FileWrite"
  },
  {
    "path": "D2/src/gui/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "D2/src/gui/CoordinatorDashboardPanel.java",
    "chars": 7754,
    "preview": "package gui;\n\nimport javax.swing.*;\nimport javax.swing.table.*;\nimport java.awt.*;\nimport data.UserDAO;\nimport model.*;\n"
  },
  {
    "path": "D2/src/gui/LoginPanel.java",
    "chars": 8019,
    "preview": "package gui;\n\nimport javax.swing.*;\nimport javax.swing.border.*;\nimport java.awt.*;\nimport data.UserDAO;\nimport model.Us"
  },
  {
    "path": "D2/src/gui/MainFrame.java",
    "chars": 2614,
    "preview": "package gui;\n\nimport javax.swing.*;\nimport java.awt.*;\nimport model.User;\n\npublic class MainFrame extends JFrame {\n\n    "
  },
  {
    "path": "D2/src/gui/ManagerDashboardPanel.java",
    "chars": 12443,
    "preview": "package gui;\n\n// pre determined login\nimport javax.swing.*;\nimport javax.swing.table.*;\nimport java.awt.*;\nimport java.u"
  },
  {
    "path": "D2/src/gui/UI.java",
    "chars": 10543,
    "preview": "package gui;\n\nimport javax.swing.*;\nimport javax.swing.border.*;\nimport javax.swing.table.*;\nimport java.awt.*;\nimport j"
  },
  {
    "path": "D2/src/gui/UserDashboardPanel.java",
    "chars": 11029,
    "preview": "package gui;\n\nimport javax.swing.*;\nimport javax.swing.table.*;\nimport java.awt.*;\nimport data.*;\nimport model.*;\nimport"
  },
  {
    "path": "D2/src/model/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "D2/src/model/Deposit.java",
    "chars": 875,
    "preview": "package model;\n\npublic class Deposit {\n    private double amount;\n    private boolean isForfeited;\n    private boolean d"
  },
  {
    "path": "D2/src/model/Equipment.java",
    "chars": 2020,
    "preview": "package model;\n\npublic class Equipment {\n    private String equipmentID;\n    private String name;\n    private String des"
  },
  {
    "path": "D2/src/model/Faculty.java",
    "chars": 453,
    "preview": "package model;\n\npublic class Faculty extends User {\n    private static final double HOURLY_FEE = 15.0;\n\n    public Facul"
  },
  {
    "path": "D2/src/model/Guest.java",
    "chars": 770,
    "preview": "package model;\n\npublic class Guest extends User {\n    private static final double HOURLY_FEE = 30.0;\n    private String "
  },
  {
    "path": "D2/src/model/HeadLabCoordinator.java",
    "chars": 800,
    "preview": "package model;\n\npublic class HeadLabCoordinator extends User {\n    private static final double HOURLY_FEE = 0.0;\n\n    pu"
  },
  {
    "path": "D2/src/model/LabLocation.java",
    "chars": 787,
    "preview": "package model;\n\npublic class LabLocation {\n    private String buildingName;\n    private String roomNumber;\n\n    public L"
  },
  {
    "path": "D2/src/model/LabManager.java",
    "chars": 644,
    "preview": "package model;\n\npublic class LabManager extends User {\n    private static final double HOURLY_FEE = 0.0;\n    private Str"
  },
  {
    "path": "D2/src/model/PaymentTransaction.java",
    "chars": 1416,
    "preview": "package model;\n\npublic class PaymentTransaction {\n    private String transactionID;\n    private String bookingID;\n    pr"
  },
  {
    "path": "D2/src/model/Researcher.java",
    "chars": 468,
    "preview": "package model;\n\npublic class Researcher extends User {\n    private static final double HOURLY_FEE = 20.0;\n\n    public Re"
  },
  {
    "path": "D2/src/model/Reservation.java",
    "chars": 2904,
    "preview": "package model;\n\npublic class Reservation {\n    private String bookingID;\n    private String userID;\n    private String e"
  },
  {
    "path": "D2/src/model/Student.java",
    "chars": 453,
    "preview": "package model;\n\npublic class Student extends User {\n    private static final double HOURLY_FEE = 10.0;\n\n    public Stude"
  },
  {
    "path": "D2/src/model/User.java",
    "chars": 2119,
    "preview": "package model;\n\npublic abstract class User {\n    protected String userID;\n    protected String name;\n    protected Strin"
  },
  {
    "path": "D2/src/pattern/command/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "D2/src/pattern/command/CancelCommand.java",
    "chars": 480,
    "preview": "package pattern.command;\n\nimport model.Reservation;\n\npublic class CancelCommand implements Command {\n\n    private Reserv"
  },
  {
    "path": "D2/src/pattern/command/Command.java",
    "chars": 74,
    "preview": "package pattern.command;\n\npublic interface Command {\n    void execute();\n}"
  },
  {
    "path": "D2/src/pattern/command/ExtendCommand.java",
    "chars": 580,
    "preview": "package pattern.command;\n\nimport model.Reservation;\n\npublic class ExtendCommand implements Command {\n\n    private Reserv"
  },
  {
    "path": "D2/src/pattern/command/ForfeitDepositCommand.java",
    "chars": 504,
    "preview": "package pattern.command;\n\nimport model.Reservation;\n\npublic class ForfeitDepositCommand implements Command {\n\n    privat"
  },
  {
    "path": "D2/src/pattern/command/ModifyCommand.java",
    "chars": 690,
    "preview": "package pattern.command;\n\nimport model.Reservation;\n\npublic class ModifyCommand implements Command {\n\n    private Reserv"
  },
  {
    "path": "D2/src/pattern/command/ReservationService.java",
    "chars": 1193,
    "preview": "package pattern.command;\n\nimport model.Reservation;\n\npublic class ReservationService {\n\n    public void reserve(Reservat"
  },
  {
    "path": "D2/src/pattern/command/ReserveCommand.java",
    "chars": 483,
    "preview": "package pattern.command;\n\nimport model.Reservation;\n\npublic class ReserveCommand implements Command {\n\n    private Reser"
  },
  {
    "path": "D2/src/pattern/factory/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "D2/src/pattern/factory/UserFactory.java",
    "chars": 923,
    "preview": "package pattern.factory;\nimport model.User;\nimport model.Student; \nimport model.Faculty;\nimport model.Guest;\nimport mode"
  },
  {
    "path": "D2/src/pattern/observer/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "D2/src/pattern/observer/EquipmentObserver.java",
    "chars": 254,
    "preview": "package pattern.observer;\n\n/**\n * Observer Pattern - Observer Interface\n * Any class that wants to be notified of equipm"
  },
  {
    "path": "D2/src/pattern/observer/EquipmentSubject.java",
    "chars": 365,
    "preview": "package pattern.observer;\n\n/**\n * Observer Pattern - Subject Interface\n * EquipmentContext implements this to support re"
  },
  {
    "path": "D2/src/pattern/observer/Observer.java",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "D2/src/pattern/observer/UserNotificationObserver.java",
    "chars": 1352,
    "preview": "package pattern.observer;\n\nimport model.User;\nimport java.util.List;\n\n/**\n * Observer Pattern - Concrete Observer\n * Not"
  },
  {
    "path": "D2/src/pattern/singleton/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "D2/src/pattern/singleton/BookingSystem.java",
    "chars": 1754,
    "preview": "package pattern.singleton;\nimport model.Reservation;\nimport java.util.ArrayList;\nimport java.time.LocalDateTime;\nimport "
  },
  {
    "path": "D2/src/pattern/singleton/HeadLabCoordinatorSingleton.java",
    "chars": 1833,
    "preview": "package pattern.singleton;\n\nimport model.LabManager;\n\n/**\n * Singleton Pattern - HeadLabCoordinator\n * Only one Head Lab"
  },
  {
    "path": "D2/src/pattern/state/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "D2/src/pattern/state/AvailableState.java",
    "chars": 692,
    "preview": "package pattern.state;\n\npublic class AvailableState implements EquipmentState {\n\n    @Override\n    public void enable(Eq"
  },
  {
    "path": "D2/src/pattern/state/DisabledState.java",
    "chars": 708,
    "preview": "package pattern.state;\n\npublic class DisabledState implements EquipmentState {\n\n    @Override\n    public void enable(Equ"
  },
  {
    "path": "D2/src/pattern/state/EquipmentContext.java",
    "chars": 2613,
    "preview": "package pattern.state;\n\nimport pattern.observer.EquipmentObserver;\nimport pattern.observer.EquipmentSubject;\nimport java"
  },
  {
    "path": "D2/src/pattern/state/EquipmentState.java",
    "chars": 227,
    "preview": "package pattern.state;\n\npublic interface EquipmentState {\n    void enable(EquipmentContext context);\n    void disable(Eq"
  },
  {
    "path": "D2/src/pattern/state/MaintenanceState.java",
    "chars": 728,
    "preview": "package pattern.state;\n\npublic class MaintenanceState implements EquipmentState {\n\n    @Override\n    public void enable("
  },
  {
    "path": "D2/src/pattern/strategy/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "D2/src/pattern/strategy/CreditCardPayment.java",
    "chars": 368,
    "preview": "package pattern.strategy;\n\nimport model.PaymentTransaction;\n\npublic class CreditCardPayment implements PaymentStrategy {"
  },
  {
    "path": "D2/src/pattern/strategy/DebitPayment.java",
    "chars": 358,
    "preview": "package pattern.strategy;\n\nimport model.PaymentTransaction;\n\npublic class DebitPayment implements PaymentStrategy {\n\n   "
  },
  {
    "path": "D2/src/pattern/strategy/GrantPayment.java",
    "chars": 363,
    "preview": "package pattern.strategy;\n\nimport model.PaymentTransaction;\n\npublic class GrantPayment implements PaymentStrategy {\n\n   "
  },
  {
    "path": "D2/src/pattern/strategy/InstitutionalPayment.java",
    "chars": 379,
    "preview": "package pattern.strategy;\n\nimport model.PaymentTransaction;\n\npublic class InstitutionalPayment implements PaymentStrateg"
  },
  {
    "path": "D2/src/pattern/strategy/PaymentProcessor.java",
    "chars": 635,
    "preview": "package pattern.strategy;\n\nimport model.PaymentTransaction;\n\npublic class PaymentProcessor {\n    private PaymentStrategy"
  },
  {
    "path": "D2/src/pattern/strategy/PaymentStrategy.java",
    "chars": 146,
    "preview": "package pattern.strategy;\n\nimport model.PaymentTransaction;\n\npublic interface PaymentStrategy {\n    boolean pay(PaymentT"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the nurjahan-shiah/Software-Design GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 64 files (252.4 KB), approximately 78.6k tokens, and a symbol index with 348 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!