diff --git a/.prettierignore b/.prettierignore index 7b50883..ffcbb22 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,7 +1,7 @@ # ignore these directories when formatting the repo -Blogs -CM20315 -CM20315_2023 -Notebooks -PDFFigures -Slides +/Blogs +/CM20315 +/CM20315_2023 +/Notebooks +/PDFFigures +/Slides diff --git a/src/components/Notebooks/NotebookElements.jsx b/src/components/Notebooks/NotebookElements.jsx index 132a2df..5028598 100644 --- a/src/components/Notebooks/NotebookElements.jsx +++ b/src/components/Notebooks/NotebookElements.jsx @@ -3,12 +3,12 @@ import styled from "styled-components"; export const NotebookContainer = styled.div` color: #fff; /* background: #f9f9f9; */ - background: ${({lightBg}) => (lightBg ? '#f9f9f9': '#010606')}; + background: ${({ lightBg }) => (lightBg ? "#f9f9f9" : "#010606")}; @media screen and (max-width: 768px) { padding: 100px 0; } -` +`; export const NotebookWrapper = styled.div` display: grid; @@ -20,18 +20,19 @@ export const NotebookWrapper = styled.div` margin-left: auto; padding: 0 24px; justify-content: center; -` +`; export const NotebookRow = styled.div` display: grid; grid-auto-columns: minmax(auto, 1fr); align-items: center; - grid-template-areas: ${({imgStart}) => (imgStart ? `'col2 col1'` : `'col1 col2'`)}; + grid-template-areas: ${({ imgStart }) => (imgStart ? `'col2 col1'` : `'col1 col2'`)}; - @media screen and (max-width: 768px){ - grid-template-areas: ${({imgStart}) => (imgStart ? `'col1' 'col2'` : `'col1 col1' 'col2 col2'`)}; + @media screen and (max-width: 768px) { + grid-template-areas: ${({ imgStart }) => + imgStart ? `'col1' 'col2'` : `'col1 col1' 'col2 col2'`}; } -` +`; export const Column1 = styled.p` margin-bottom: 15px; @@ -45,7 +46,7 @@ export const Column1 = styled.p` @media screen and (max-width: 768px) { font-size: 10px; } -` +`; export const Column2 = styled.p` margin-bottom: 15px; @@ -59,13 +60,13 @@ export const Column2 = styled.p` @media screen and (max-width: 768px) { font-size: 10px; } -` +`; export const TextWrapper = styled.div` max-width: 540px; padding-top: 0; padding-bottom: 0; -` +`; export const TopLine = styled.p` color: #57c6d1; @@ -75,37 +76,37 @@ export const TopLine = styled.p` letter-spacing: 1.4px; text-transform: uppercase; margin-bottom: 16px; -` +`; -export const Heading= styled.h1` +export const Heading = styled.h1` margin-bottom: 24px; font-size: 48px; line-height: 1.1; font-weight: 600; - color: ${({lightText}) => (lightText ? '#f7f8fa' : '#010606')}; + color: ${({ lightText }) => (lightText ? "#f7f8fa" : "#010606")}; @media screen and (max-width: 480px) { font-size: 32px; } -` +`; export const Subtitle = styled.p` max-width: 440px; margin-bottom: 35px; font-size: 18px; line-height: 24px; - color: ${({darkText})=> (darkText ? '#010606' : '#fff')}; -` + color: ${({ darkText }) => (darkText ? "#010606" : "#fff")}; +`; export const BtnWrap = styled.div` display: flex; justify-content: flex-start; -` +`; export const ImgWrap = styled.div` max-width: 555px; height: 100%; -` +`; export const Img = styled.img` width: 100%; @@ -117,28 +118,30 @@ export const Img = styled.img` export const NBLink = styled.a` text-decoration: none; - color: #57c6d1;; + color: #57c6d1; font-weight: 300; margin: 0 2px; position: relative; - &:before{ + &:before { position: absolute; margin: 0 auto; top: 100%; left: 0; width: 100%; height: 2px; - background-color: #57c6d1;; - content: ''; - opacity: .3; + background-color: #57c6d1; + content: ""; + opacity: 0.3; -webkit-transform: scaleX(1); - transition-property: opacity, -webkit-transform; - transition-duration: .3s; + transition-property: + opacity, + -webkit-transform; + transition-duration: 0.3s; } &:hover:before { opacity: 1; -webkit-transform: scaleX(1.05); } -` +`; diff --git a/src/components/Notebooks/index.jsx b/src/components/Notebooks/index.jsx index bec4737..de57e4d 100644 --- a/src/components/Notebooks/index.jsx +++ b/src/components/Notebooks/index.jsx @@ -1,195 +1,342 @@ -import img from '../../images/coding.svg' -import { Column1, Column2, Heading, Img, ImgWrap, NBLink, NotebookContainer, NotebookRow, NotebookWrapper, Subtitle, TextWrapper, TopLine } from './NotebookElements' +import img from "../../images/coding.svg"; +import { + Column1, + Column2, + Heading, + Img, + ImgWrap, + NBLink, + NotebookContainer, + NotebookRow, + NotebookWrapper, + Subtitle, + TextWrapper, + TopLine, +} from "./NotebookElements"; + +const notebooks = [ + { + text: "Notebook 1.1 - Background mathematics", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap01/1_1_BackgroundMathematics.ipynb", + }, + { + text: "Notebook 2.1 - Supervised learning", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap02/2_1_Supervised_Learning.ipynb", + }, + { + text: "Notebook 3.1 - Shallow networks I", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap03/3_1_Shallow_Networks_I.ipynb", + }, + { + text: "Notebook 3.2 - Shallow networks II", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap03/3_2_Shallow_Networks_II.ipynb", + }, + { + text: "Notebook 3.3 - Shallow network regions", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap03/3_3_Shallow_Network_Regions.ipynb", + }, + { + text: "Notebook 3.4 - Activation functions", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap03/3_4_Activation_Functions.ipynb", + }, + { + text: "Notebook 4.1 - Composing networks", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap04/4_1_Composing_Networks.ipynb", + }, + { + text: "Notebook 4.2 - Clipping functions", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap04/4_2_Clipping_functions.ipynb", + }, + { + text: "Notebook 4.3 - Deep networks", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap04/4_3_Deep_Networks.ipynb", + }, + { + text: "Notebook 5.1 - Least squares loss", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap05/5_1_Least_Squares_Loss.ipynb", + }, + { + text: "Notebook 5.2 - Binary cross-entropy loss", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap05/5_2_Binary_Cross_Entropy_Loss.ipynb", + }, + { + text: "Notebook 5.3 - Multiclass cross-entropy loss", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap05/5_3_Multiclass_Cross_entropy_Loss.ipynb", + }, + { + text: "Notebook 6.1 - Line search", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap06/6_1_Line_Search.ipynb", + }, + { + text: "Notebook 6.2 - Gradient descent", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap06/6_2_Gradient_Descent.ipynb", + }, + { + text: "Notebook 6.3 - Stochastic gradient descent", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap06/6_3_Stochastic_Gradient_Descent.ipynb", + }, + { + text: "Notebook 6.4 - Momentum", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap06/6_4_Momentum.ipynb", + }, + { + text: "Notebook 6.5 - Adam", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap06/6_5_Adam.ipynb", + }, + { + text: "Notebook 7.1 - Backpropagation in toy model", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap07/7_1_Backpropagation_in_Toy_Model.ipynb", + }, + { + text: "Notebook 7.2 - Backpropagation", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap07/7_2_Backpropagation.ipynb", + }, + { + text: "Notebook 7.3 - Initialization", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap07/7_3_Initialization.ipynb", + }, + { + text: "Notebook 8.1 - MNIST-1D performance", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap08/8_1_MNIST_1D_Performance.ipynb", + }, + { + text: "Notebook 8.2 - Bias-variance trade-off", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap08/8_2_Bias_Variance_Trade_Off.ipynb", + }, + { + text: "Notebook 8.3 - Double descent", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap08/8_3_Double_Descent.ipynb", + }, + { + text: "Notebook 8.4 - High-dimensional spaces", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap08/8_4_High_Dimensional_Spaces.ipynb", + }, + { + text: "Notebook 9.1 - L2 regularization", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap09/9_1_L2_Regularization.ipynb", + }, + { + text: "Notebook 9.2 - Implicit regularization", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap09/9_2_Implicit_Regularization.ipynb", + }, + { + text: "Notebook 9.3 - Ensembling", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap09/9_3_Ensembling.ipynb", + }, + { + text: "Notebook 9.4 - Bayesian approach", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap09/9_4_Bayesian_Approach.ipynb", + }, + { + text: "Notebook 9.5 - Augmentation", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap09/9_5_Augmentation.ipynb", + }, + { + text: "Notebook 10.1 - 1D convolution", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap10/10_1_1D_Convolution.ipynb", + }, + { + text: "Notebook 10.2 - Convolution for MNIST-1D", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap10/10_2_Convolution_for_MNIST_1D.ipynb", + }, + { + text: "Notebook 10.3 - 2D convolution", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap10/10_3_2D_Convolution.ipynb", + }, + { + text: "Notebook 10.4 - Downsampling & upsampling", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap10/10_4_Downsampling_and_Upsampling.ipynb", + }, + { + text: "Notebook 10.5 - Convolution for MNIST", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap10/10_5_Convolution_For_MNIST.ipynb", + }, + { + text: "Notebook 11.1 - Shattered gradients", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap11/11_1_Shattered_Gradients.ipynb", + }, + { + text: "Notebook 11.2 - Residual networks", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap11/11_2_Residual_Networks.ipynb", + }, + { + text: "Notebook 11.3 - Batch normalization", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap11/11_3_Batch_Normalization.ipynb", + }, + { + text: "Notebook 12.1 - Self-attention", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap12/12_1_Self_Attention.ipynb", + }, + { + text: "Notebook 12.2 - Multi-head self-attention", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap12/12_2_Multihead_Self_Attention.ipynb", + }, + { + text: "Notebook 12.3 - Tokenization", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap12/12_3_Tokenization.ipynb", + }, + { + text: "Notebook 12.4 - Decoding strategies", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap12/12_4_Decoding_Strategies.ipynb", + }, + { + text: "Notebook 13.1 - Encoding graphs", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap13/13_1_Graph_Representation.ipynb", + }, + { + text: "Notebook 13.2 - Graph classification", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap13/13_2_Graph_Classification.ipynb", + }, + { + text: "Notebook 13.3 - Neighborhood sampling", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap13/13_3_Neighborhood_Sampling.ipynb", + }, + { + text: "Notebook 13.4 - Graph attention", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap13/13_4_Graph_Attention_Networks.ipynb", + }, + { + text: "Notebook 15.1 - GAN toy example", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap15/15_1_GAN_Toy_Example.ipynb", + }, + { + text: "Notebook 15.2 - Wasserstein distance", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap15/15_2_Wasserstein_Distance.ipynb", + }, + { + text: "Notebook 16.1 - 1D normalizing flows", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap16/16_1_1D_Normalizing_Flows.ipynb", + }, + { + text: "Notebook 16.2 - Autoregressive flows", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap16/16_2_Autoregressive_Flows.ipynb", + }, + { + text: "Notebook 16.3 - Contraction mappings", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap16/16_3_Contraction_Mappings.ipynb", + }, + { + text: "Notebook 17.1 - Latent variable models", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap17/17_1_Latent_Variable_Models.ipynb", + }, + { + text: "Notebook 17.2 - Reparameterization trick", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap17/17_2_Reparameterization_Trick.ipynb", + }, + { + text: "Notebook 17.3 - Importance sampling", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap17/17_3_Importance_Sampling.ipynb", + }, + { + text: "Notebook 18.1 - Diffusion encoder", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap18/18_1_Diffusion_Encoder.ipynb", + }, + { + text: "Notebook 18.2 - 1D diffusion model", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap18/18_2_1D_Diffusion_Model.ipynb", + }, + { + text: "Notebook 18.3 - Reparameterized model", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap18/18_3_Reparameterized_Model.ipynb", + }, + { + text: "Notebook 18.4 - Families of diffusion models", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap18/18_4_Families_of_Diffusion_Models.ipynb", + }, + { + text: "Notebook 19.1 - Markov decision processes", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap19/19_1_Markov_Decision_Processes.ipynb", + }, + { + text: "Notebook 19.2 - Dynamic programming", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap19/19_2_Dynamic_Programming.ipynb", + }, + { + text: "Notebook 19.3 - Monte-Carlo methods", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap19/19_3_Monte_Carlo_Methods.ipynb", + }, + { + text: "Notebook 19.4 - Temporal difference methods", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap19/19_4_Temporal_Difference_Methods.ipynb", + }, + { + text: "Notebook 19.5 - Control variates", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap19/19_5_Control_Variates.ipynb", + }, + { + text: "Notebook 20.1 - Random data", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap20/20_1_Random_Data.ipynb", + }, + { + text: "Notebook 20.2 - Full-batch gradient descent", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap20/20_2_Full_Batch_Gradient_Descent.ipynb", + }, + { + text: "Notebook 20.3 - Lottery tickets", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap20/20_3_Lottery_Tickets.ipynb", + }, + { + text: "Notebook 20.4 - Adversarial attacks", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap20/20_4_Adversarial_Attacks.ipynb", + }, + { + text: "Notebook 21.1 - Bias mitigation", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap21/21_1_Bias_Mitigation.ipynb", + }, + { + text: "Notebook 21.2 - Explainability", + link: "https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap21/21_2_Explainability.ipynb", + }, +]; export default function NotebookSection() { return ( - <> - - - - - - Coding exercises - Python notebooks covering the whole text - Sixty eight python notebook exercises with missing code to fill in based on the text - - - - - Car - - - - - -
    -
  • Notebook 1.1 - Background mathematics: ipynb/colab -
  • -
  • Notebook 2.1 - Supervised learning: ipynb/colab -
  • -
  • Notebook 3.1 - Shallow networks I: ipynb/colab -
  • -
  • Notebook 3.2 - Shallow networks II: ipynb/colab -
  • -
  • Notebook 3.3 - Shallow network regions: ipynb/colab -
  • -
  • Notebook 3.4 - Activation functions: ipynb/colab -
  • -
  • Notebook 4.1 - Composing networks: ipynb/colab -
  • -
  • Notebook 4.2 - Clipping functions: ipynb/colab -
  • -
  • Notebook 4.3 - Deep networks: ipynb/colab -
  • -
  • Notebook 5.1 - Least squares loss: ipynb/colab -
  • -
  • Notebook 5.2 - Binary cross-entropy loss: ipynb/colab -
  • -
  • Notebook 5.3 - Multiclass cross-entropy loss: ipynb/colab -
  • -
  • Notebook 6.1 - Line search: ipynb/colab -
  • -
  • Notebook 6.2 - Gradient descent: ipynb/colab -
  • -
  • Notebook 6.3 - Stochastic gradient descent: ipynb/colab -
  • -
  • Notebook 6.4 - Momentum: ipynb/colab -
  • -
  • Notebook 6.5 - Adam: ipynb/colab -
  • -
  • Notebook 7.1 - Backpropagation in toy model: ipynb/colab -
  • -
  • Notebook 7.2 - Backpropagation: ipynb/colab -
  • -
  • Notebook 7.3 - Initialization: ipynb/colab -
  • -
  • Notebook 8.1 - MNIST-1D performance: ipynb/colab -
  • -
  • Notebook 8.2 - Bias-variance trade-off: ipynb/colab -
  • -
  • Notebook 8.3 - Double descent: ipynb/colab -
  • -
  • Notebook 8.4 - High-dimensional spaces: ipynb/colab -
  • -
  • Notebook 9.1 - L2 regularization: ipynb/colab -
  • -
  • Notebook 9.2 - Implicit regularization: ipynb/colab -
  • -
  • Notebook 9.3 - Ensembling: ipynb/colab -
  • -
  • Notebook 9.4 - Bayesian approach: ipynb/colab -
  • -
  • Notebook 9.5 - Augmentation ipynb/colab -
  • -
  • Notebook 10.1 - 1D convolution: ipynb/colab -
  • -
  • Notebook 10.2 - Convolution for MNIST-1D: ipynb/colab -
  • -
  • Notebook 10.3 - 2D convolution: ipynb/colab -
  • -
  • Notebook 10.4 - Downsampling & upsampling: ipynb/colab -
  • -
  • Notebook 10.5 - Convolution for MNIST: ipynb/colab -
  • -
-
- + + + + + + Coding exercises + + Python notebooks covering the whole text + + + Sixty eight python notebook exercises with missing code to fill in + based on the text + + + + + + Coding + + + + +
    -
  • Notebook 11.1 - Shattered gradients: ipynb/colab + {/* render first half of notebooks*/} + {notebooks.slice(0, notebooks.length / 2).map((notebook, index) => ( +
  • + {notebook.text}:{" "} + ipynb/colab
  • -
  • Notebook 11.2 - Residual networks: ipynb/colab + ))} +
+
+ +
    + {/* render second half of notebooks*/} + {notebooks.slice(notebooks.length / 2).map((notebook, index) => ( +
  • + {notebook.text}:{" "} + ipynb/colab
  • -
  • Notebook 11.3 - Batch normalization: ipynb/colab -
  • -
  • Notebook 12.1 - Self-attention: ipynb/colab -
  • -
  • Notebook 12.2 - Multi-head self-attention: ipynb/colab -
  • -
  • Notebook 12.3 - Tokenization: ipynb/colab -
  • -
  • Notebook 12.4 - Decoding strategies: ipynb/colab -
  • -
  • Notebook 13.1 - Encoding graphs: ipynb/colab -
  • -
  • Notebook 13.2 - Graph classification : ipynb/colab -
  • -
  • Notebook 13.3 - Neighborhood sampling: ipynb/colab -
  • -
  • Notebook 13.4 - Graph attention: ipynb/colab -
  • -
  • Notebook 15.1 - GAN toy example: ipynb/colab
  • -
  • Notebook 15.2 - Wasserstein distance: ipynb/colab
  • -
  • Notebook 16.1 - 1D normalizing flows: ipynb/colab
  • -
  • Notebook 16.2 - Autoregressive flows: ipynb/colab
  • -
  • Notebook 16.3 - Contraction mappings: ipynb/colab
  • -
  • Notebook 17.1 - Latent variable models: ipynb/colab
  • -
  • Notebook 17.2 - Reparameterization trick: ipynb/colab
  • -
  • Notebook 17.3 - Importance sampling: ipynb/colab
  • -
  • Notebook 18.1 - Diffusion encoder: ipynb/colab
  • -
  • Notebook 18.2 - 1D diffusion model: ipynb/colab
  • -
  • Notebook 18.3 - Reparameterized model: ipynb/colab
  • -
  • Notebook 18.4 - Families of diffusion models: ipynb/colab
  • -
  • Notebook 19.1 - Markov decision processes: ipynb/colab
  • -
  • Notebook 19.2 - Dynamic programming: ipynb/colab
  • -
  • Notebook 19.3 - Monte-Carlo methods: ipynb/colab
  • -
  • Notebook 19.4 - Temporal difference methods: ipynb/colab
  • -
  • Notebook 19.5 - Control variates: ipynb/colab
  • -
  • Notebook 20.1 - Random data: ipynb/colab
  • -
  • Notebook 20.2 - Full-batch gradient descent: ipynb/colab
  • -
  • Notebook 20.3 - Lottery tickets: ipynb/colab
  • -
  • Notebook 20.4 - Adversarial attacks: ipynb/colab
  • -
  • Notebook 21.1 - Bias mitigation: ipynb/colab
  • -
  • Notebook 21.2 - Explainability: ipynb/colab
  • -
-
-
-
-
- - ) + ))} + +
+
+
+
+ ); }